Spring Security, 직접 만들면서 이해해보자! - 3편: FilterChainProxy와 Lambda DSL
·
서버
※ 시리즈 글Spring Security, 직접 만들면서 이해해보자! - 1편: 아키텍처 이해 Spring Security, 직접 만들면서 이해해보자! - 2편: 인증, 인가, 예외 처리Spring Security, 직접 만들면서 이해해보자! - 3편: FilterChainProxy와 Lambda DSL [현재 글]들어가며안녕하세요! 저번 글에는 Spring Security의 인증, 인가, 예외 처리 등에 대해서 직접 구현해봤습니다. 이어서 이번 글에서는 FilterChainProxy와 Lambda DSL에 대해서 구현해보겠습니다. 마찬가지로 구현 과정은 목차를 확인하시고 순서대로 따라가시면 됩니다. FilterChainProxy목표현재 구조에서 특정 경로에 대해 인증 필터, 인가 필터를 계속 추가하게 ..
Spring Security, 직접 만들면서 이해해보자! - 2편: 인증, 인가, 예외 처리
·
서버
※ 시리즈 글Spring Security, 직접 만들면서 이해해보자! - 1편: 아키텍처 이해 Spring Security, 직접 만들면서 이해해보자! - 2편: 인증, 인가, 예외 처리 [현재 글]Spring Security, 직접 만들면서 이해해보자! - 3편: FilterChainProxy와 Lambda DSL들어가며안녕하세요! 저번 글에서 Spring Security의 아키텍처에 대해서 가볍게 알아보았습니다. 이번 글에서는 본격적으로 Spring Security의 구현에 들어가겠습니다. 구현 과정은 목차를 확인하시고 순서대로 따라가시면 됩니다. 기본적으로 구현되어 있는 부분은 "app" 패키지에 있고, 다음과 같습니다. step-1-initial-setup을 참고하시면 됩니다.사용자 이름과 비밀번..
Spring Security, 직접 만들면서 이해해보자! - 1편: 아키텍처 이해
·
서버
※ 시리즈 글Spring Security, 직접 만들면서 이해해보자! - 1편: 아키텍처 이해 [현재 글]Spring Security, 직접 만들면서 이해해보자! - 2편: 인증, 인가, 예외 처리Spring Security, 직접 만들면서 이해해보자! - 3편: FilterChainProxy와 Lambda DSL도입: 왜 직접 구현했는가?안녕하세요! 제 글을 찾아주셔서 감사합니다. 저는 프로젝트를 진행할 때, 인증과 인가를 직접 구현하는 것을 선호해왔습니다. 주로 작은 규모의 프로젝트였기에 간단하게 Interceptor를 사용해서 처리했죠. 그러던 중, Spring Security는 인증과 인가를 Filter를 통해 처리한다는 점을 알게 되었고, 처음에는 사용법만 간단하게 익혀보려 했습니다. 하지만 이..
로컬 환경과 CI 환경의 시간 정밀도 차이로 인한 테스트 실패 해결
·
서버
들어가며안녕하세요! 요즘 플러피(Fluffy)라는 온라인 시험 제작 및 관리 서비스를 개발하고 있습니다. 플러피에서 사용자는 하나의 시험을 여러 번 응시할 수 있고, 마지막 제출 시간을 기준으로 정렬된 제출 목록을 볼 수 있습니다. 이 기능이 정확하게 동작하는지 확인하기 위해 제출 시간과 마지막 제출 시간이 같은지 비교하는 테스트를 작성했습니다. 로컬 환경(MacOS)에서는 테스트가 잘 통과했지만, CI 환경(Ubuntu)에서는 테스트가 실패하는 문제가 발생했습니다.  이 문제를 해결하는 과정에서 다음과 같은 사실을 알게 되었습니다.운영체제마다 System Clock의 해상도가 다르기 때문에 LocalDateTime.now()의 정밀도가 달라질 수 있다.PostgreSQL에서는 마이크로초까지 지원하기 때..
Presigned URL과 CDN으로 이미지 업로드 & 조회 개선
·
서버
들어가며안녕하세요! 요즘 플러피(Fluffy)라는 온라인 시험 제작 및 관리 서비스를 개발하고 있습니다. 보통 시험 문제에는 다양한 이미지들이 포함되어 있습니다. 플러피 서비스 또한 시험 지문에 이미지를 추가할 수 있는 기능을 만들었습니다. 처음에는 클라이언트에서 이미지를 서버로 전송하고, 서버에서 다시 AWS S3로 업로드하는 방식으로 작업했습니다. 이 방식이 궁금하신 분들은, 이전에 작성한 스프링에서 AWS S3를 이용한 이미지 업로드 방법 글을 참고해주세요. 하지만 이 방식에는 몇 가지 아쉬운 점이 있었습니다. 이미지 업로드의 경우, 이미지가 서버를 거쳐야 하기 때문에 서버의 부하가 커지고, 업로드 속도 또한 상대적으로 느립니다. 이미지 조회의 경우, S3에서 이미지를 직접 가져오기 때문에 조회 속..
테스트 후 데이터 정리를 통해 테스트 간 데이터 독립성 보장
·
서버
들어가며스프링 애플리케이션을 테스트하다 보면, 예상치 못한 데이터 충돌로 인해 테스트가 실패하는 상황을 경험할 때가 있습니다. 특히, 하나의 스프링 컨텍스트에서 생성된 인메모리 데이터베이스를 여러 테스트가 공유하거나, 싱글톤 컨테이너 패턴으로 생성한 Testcontainers 인스턴스를 여러 테스트에서 함께 사용하는 경우, 테스트 간 데이터가 서로 영향을 주며 의도치 않은 충돌이 발생할 가능성이 높습니다. 이런 문제를 완전히 방지하기 위해, 각 테스트마다 서로 다른 컨텍스트를 사용하거나, 매번 새로운 컨테이너를 띄우는 방법도 있습니다. 하지만, 이 방식은 테스트 실행 속도를 매우 느리게 만들 수 있습니다. 따라서, 테스트 간 완전한 독립성은 유지하기 어렵더라도, 테스트 후 데이터를 정리해 다음 테스트에 ..
Testcontainers로 실제 서비스와 유사한 환경에서 테스트하기
·
서버
들어가며안녕하세요! 최근 저는 플러피(Fluffy)라는 온라인 시험 제작 및 관리 서비스를 개발하고 있습니다. 이번 글에서는 플러피의 테스트 환경에서 겪었던 문제들을 소개하고, 이를 해결하기 위해 Testcontainers를 도입한 경험을 공유해보려고 합니다. 기존 테스트 환경에서 겪었던 문제실제 환경과 테스트 환경의 차이로 인한 문제플러피는 서비스 중인 환경에서 데이터베이스로 PostgreSQL을 사용하고 있습니다. 테스트 환경에서는 인메모리 데이터베이스인 H2를 사용하게 됩니다. 문제는, H2와 PostgreSQL의 문법 차이로 인해 테스트 환경에서는 문제없이 통과되던 코드가 실제 서비스 환경에서는 예외를 일으키는 상황이 발생한 것입니다. 예를 들어, H2에서는 GROUP BY를 사용할 때, GROU..
분산락을 이용한 중복 생성 문제 해결
·
서버
들어가며안녕하세요! 플러피라는 온라인 시험 문제 제작 및 관리 서비스를 개발하고 있습니다. 시험을 출제할 때, 응시자가 시험을 한 번만 제출할 수 있게 하거나 여러 번 제출할 수 있게 하는 옵션이 있습니다. 한 번만 제출하게 하기 위해서는 동시성 문제를 해결해야 합니다. 이번 시간에는 분산락을 이용하여 중복 생성 문제를 해결하는 방법에 대해서 알아보겠습니다. 문제 상황제출에 관한 서비스 코드는 다음과 같습니다. 편한 이해를 위해 부분 생략했습니다. 한 번 제출과 여러 번 제출 옵션이 있기 때문에 분기 처리를 합니다. 한 번만 제출 가능한 경우 이미 제출 했을 시 예외를 발생시킵니다.@Servicepublic class SubmissionService { // 생략 ... @Transa..