분류 전체보기131 스프링 핵심원리( 심화 ) - 로그 추적기와 디자인패턴( 전략 패턴 ) 앞서 로그 추적기를 개발하면서 템플릿 메서드 패턴을 적용하여로그 추적기 기능 관련 코드가 중복되는 현상을 상속과 오버라이딩을 사용하는 템플릿 메서드 패던을 적용하여 개선하였다. 하지만, 상속을 통한 해결에는 결합도가 높아지고, 단일 상속의 한계가 존재하는 등의 상황이 후에 도출될 수 있다. 따라서 상속보단 조합의 방향성을 가지고 서비스 로직마다 변하는 부분과 변하지 않는 부분( 로그 추적기 )을 분리하여 개선하는 방법으로 전략 패턴을 적용해보자. 전략 패턴 적용 전략 패턴은 템플릿 메서드 패턴과 비슷한 역할을 하면서 상속의 단점을 제거할 수 있는 디자인 패턴이다.그 구체적인 방법은 상속이 아닌 위임(조합)을 사용하는 것이다. 템플릿 메서드 패턴의 구조와 전략 패턴의 구조를 비교하여 이해해보자.먼저, 템플.. Spring/SpringCore - advance 2025. 3. 16. 스프링 핵심원리( 심화 ) - 로그 추적기와 디자인패턴( 템플릿 메서드 패턴 ) 지금까지 요구사항을 충족하며 로그 추적기를 만들어 왔고,파라미터를 넘기는 불편함과 동시성 문제를 해결하기 위해 ThreadLocal까지 도입하였다. 그리고 로그 추적기를 도입한 코드의 상태는 아래와 같다. @RestController@RequiredArgsConstructor@Slf4jpublic class OrderControllerV3 { private final OrderserviceV3 orderservice; private final LogTrace logTrace; @GetMapping("/v3/request") public String request(String item) { TraceStatus status = null; try{ .. Spring/SpringCore - advance 2025. 2. 19. 스프링 핵심원리( 심화 ) - 로그 추적기와 동시성( ThreadLocal 사용 ) 앞서 로그 추적기를 구현함에 파라미터로 로그의 동기화를 위해 TraceId를 넘기는 방법을 선택했었다.이러한 구현에는 모든 로직에 파라미터를 추가하는 번거로움이나 컨트롤러가 없는 다른 서비스의 호출에 사용하지 못하는 문제가 있었다. 따라서 로그 추적 객체가 스스로 상태값을 변경할 수 있도록 로직을 개선하였다.하지만, 객체 내부의 인스턴스 필드로 상태값을 저장하는 구현은 다중 스레드가 접근하는 경우 동시성 문제를 야기하였다. 그리고 이번 포스팅에서는 동시성 문제를 해결할 수 있는 ThreadLocal에 대해서 다뤄보겠다. ThreadLocalThreadLocal은 특정 하나의 쓰레드만 접근할 수 있는 저장소를 제공한다. 즉, 사용자 a와 사용자 b 각자를 인식하여 저장소를 제공하고 정해진 저장소를 통해.. Spring/SpringCore - advance 2025. 2. 16. 스프링 핵심원리( 심화 ) - 로그 추적기와 동시성( 로그 추적기 개발과 동시성 문제 ) 로그 추적기 개발 앞서 로그 추적기를 구현하였다.그리고 해당 로그를 출력함에 있어 트랜잭션ID 와 level 수준을 나타내기 위해 TraceId객체를 파라미터로 넘기도록 구현이 필요하였다. 그런데, 이러한 방식은 모든 메서드들에 파라미터를 추가해야하는 문제를 야기한다.TraceId를 파라미터로 넘기지 않으면서도 문제를 해결할 방법에 대해서 알아보자. 이런 문제 지점들을 해결하기 위해 로그 추적기를 더 발전시킬 것이다.먼저, 향후 다양한 구현체로 변경할 수 있도록 LogTrace 인터페이스를 만든다.public interface LogTrace { TraceStatus begin(String message); void end(TraceStatus status); void exception.. Spring/SpringCore - advance 2025. 2. 15. 스프링 핵심원리( 심화 ) - 로그 추적기와 동시성( 로그 추적기 개발 ) 로그 추적기의 필요성서비스가 점차 거대해지고 사용되는 소스 코드와 클래스가 수 십만 라인에 수 백개 이상이 존재한다면, 점차적으로 운영 환경에서의 모니터링과 운영이 중요해진다. 특히 성능적인 이슈와 관련하여 병목과 같은 현상에서 병목의 발생 지점을 파악하거나 예외 발생 지점 등을 파악하는 것이 필요해진다. 그리고 이러한 지점들을 로그로 남기는 것이 어플리케이션의 실행과 운영에서 상태 파악과 많은 문제들에 대한 힌트를 제공할 수 있기에 중요한 부분이다. 따라서 로그 추적기를 개발하면서 다음과 같은 요구 사항들을 구현해보자.요구사항 ✅ 모든 PUBLIC 메서드의 호출과 응답 정보를 로그로 출력 ✅ 애플리케이션의 흐름을 변경하면 안됨 로그를 남긴다고 해서 비즈니스 로직의 동작에 영향을 주면 안됨 ✅ 메서.. Spring/SpringCore - advance 2025. 2. 14. 시큐리티 기본 원리( 22 ) - ExceptionTranslationFilter ExceptionTranslationFilter 목적해당 필터는 DefaultSecurityFilterChain에 기본적으로 등록되는 필터로 열다섯 번째에 위치한다. ExceptionTranslationFilter는 인증, 인가 과정에서 발생하는 예외를 핸들링하기 위한 동작을 수행한다. 이러한 동작 수행에 있어서는 아래와 같은 흐름을 따른다. 주요 로직ExceptionTranslationFilter 클래스public class ExceptionTranslationFilter extends GenericFilterBean implements MessageSourceAware {} doFilterprivate void doFilter(HttpServletRequest request, HttpServlet.. Spring/시큐리티 기본원리 2025. 1. 29. 시큐리티 기본 원리( 21 ) - AnonymousAuthenticationFilter AnonymousAuthenticationFilter 목적해당 필터는 DefaultSecurityFilterChain에 기본적으로 등록되는 필터로 열네 번째에 있다. AnonymousAuthenticationFilter 는 익명 사용자의 요청에 대해 처리해주는 필터이다. 즉 인증을 하지 않은 요청인 경우 인증 객체를 익명 권한이 들어가 있는 객체를 만들어 SecurityContextHolder에 넣어 주는 역할을 한다. 다르게 말하자면, SecurityContext값이 null 인 경우 Anonymous 값을 넣어주기 위해 사용한다고 볼 수 있겠다. 공식 문서를 살펴보면, public class AnonymousAuthenticationFilter extends GenericFilterBean impl.. Spring/시큐리티 기본원리 2025. 1. 29. 시큐리티 기본 원리( 20 ) - SecurityContextHolderAwareRequestFilter SecurityContextHolderAwareRequestFilter 목적과 사용이 필터는 DefaultSecurityFilterChain에 기본적으로 등록되는 필터로 열세 번째에 위치한다. 해당 필터가 제공해주는 기능은 Security Context와 HTTP 요청(HttpServletRequest)을 연결해주는 역할이다.더 쉽게 표현하자면, 보안 정보를 쉽게 사용할 수 있도록 도와주는 도우미라고 생각하면 편하다. 클라이언트의 로그인이 정상적으로 처리되면, Security에 클라이언트의 정보들을 SecurityContextHolder에 저장한다. 한편, Spring에서 HTTP 요청은 HttpServletRequest 객체에 담겨서 온다. 그리고 이 HttpServletRequest 에는 사용자에 대.. Spring/시큐리티 기본원리 2025. 1. 28. 시큐리티 기본 원리( 19 ) - RequestCacheAwareFilter RequestCacheAwareFilter 목적해당 필터는 DefaultSecurityFilterChain에 기본적으로 등록되는 열두 번째의 필터이다. RequestCacheAwareFilter는 이전 HTTP 요청에서 처리할 작업이 완료되지 못한 상태에서 현재 요청으로 함께 수행하기 위한 기능을 수행한다. 비활성화 방법커스텀 SecurityFilterChain에 기본적으로 등록되기에 아래와 같은 구문으로 비활성화 시킬 수 있다.http .requestCache((cache) -> cache.disable()); RequestCacheAwareFilter 의 동작 예시해당 필터의 목적을 봐선 왜 존재하는 지 와닿지 않을 수 있지만, 다음의 예시를 통해 수행하는 기능을 이해해보자. 1. 로그인.. Spring/시큐리티 기본원리 2025. 1. 28. 시큐리티 기본 원리( 18 ) - BasicAuthenticationFilter BasicAuthenticationFilter 목적 해당 필터는 DefaultSecurityFilterChain에 있는 열한 번째 위치의 필터이다. 필터가 수행하는 기능은 Basic 기반의 인증을 수행하기 위함이다.만약, 커스텀 SecurityFilterChain을 생성하면 자동 등록이 되지 않기에 아래와 같은 설정을 통해서 별도로 활성화 시켜주어야한다. http .httpBasic(Customizer.withDefaults()); Basic 인증 ?Basic 인증의 이해를 위해서 Form 인증 방식과 비교하며 파악해보자. Form 인증 방식은 Form 태그에 username / password 등을 입력한 후에 브라우저에서 서버로 전송하면,서버는 상태에 맞는 세션 or JWT를 생성하여.. Spring/시큐리티 기본원리 2025. 1. 28. 시큐리티 기본 원리( 17 ) - DefaultLogOutPageGeneratingFilter DefaultLogOutPageGeneratingFilter의 목적 이 필터는 DefaultSecurityFilterChain에서 열 번째에 위치한다. 등록되고 수행하는 기능은 Get 요청에 대해서 "/logout" 경로에 대해 기본 로그아웃 페이지를 반환한다.앞서 다룬 formLogin 설정과 밀접한 관계가 있다. formLogin을 사용하면, Spring Security는 로그인과 로그아웃을 위한 기본 페이지를 자동으로 제공한다.// 기본 사용http .formLogin(Customizer.withDefaults()); 커스텀 사용 예시그리고 만약 커스텀한 logout 페이지를 사용한다면, 다음과 같은 코드 로직을 볼 수 있다.http .logout(logout -> logout .. Spring/시큐리티 기본원리 2025. 1. 28. 시큐리티 기본 원리( 16 ) - DefaultLoginPageGeneratingFilter DefaultLoginPageGeneratingFilter의 목적 해당 필터는 DefaultSecurityFilterChain에 기본적으로 등록되는 필터로 아홉 번의 위치에 자리잡은 필터이다. DefaultLoginPageGeneratingFilter의 기능은 이름을 통해 파악할 수 있듯, 로그인 설정에 대해서 GET 요청에 대해 "/login" 경로에 기본 로그인 페이지를 제공한다. 해당 필터는 로그인 설정에 의존하여 대게 사용하는 formLogin에서 커스텀 SecurityFilterChain 등록시 아래와 같은 설정을 통해서 사용하면 기본 제공하는 기능을 사용할 수 있으며, 커스텀 로그인 페이지를 사용할 경우 제외하면 된다.// 기본 사용http .formLogin(Customizer.. Spring/시큐리티 기본원리 2025. 1. 28. 이전 1 2 3 4 ··· 11 다음