Spring in Action (5판)
- 스프링 5의 강력한 기능과 생산성을 활용한 웹 애플리케이션 개발
- Walls, Craig 지음
- 제어펍 출판사
- 2020.05.14
스프링 인 액션 개인 스터디 내용을 정리하자.
Filter & Interceptor & AOP
공통적으로 처리해야 할 업무(로그인 관련 세션 & 권한, XSS 방어, Platform 분기, Log, 인코딩 등)를 별도 관리하는 역할이다.
공통 업무를 프로그램 흐름의 앞, 중간, 뒤에 추가하여 자동으로 처리해준다.
Filter와 Interceptor는 Servlet 단위에서 실행되고, AOP는 메서드 앞에서 Proxy 패턴의 형태로 실행된다.
Request -> Filter -> Interceptor -> AOP -> Interceptor -> Filter -> Response
Filter | Interpceptor | AOP | |
실행 위치 | Servlet | Servlet | Method |
실행 메서드 | init dofilter destroy |
preHandler postHandler afterCompletion |
Poincut으로 @after, @before, @around 등 위치를 지정하여 자유롭게 메서드 생성 가능 |
Spring MVC Request Life Cycle
Filter
Servlet Container에 의해 동작, 제어되는 클래스로 HTTP Request가 Servlet에 도착하기 전에, HTTP Response가 Client에 도착하기 전에 제어할 수 있다.
Request 시, DispatcherServlet이 작업을 처리하기 전에 동작한다.
Response 시, DispatcherServlet 작업이 끝난 이후에 동작한다.
Filter는 Filter Chain을 갖고 있으며, Application Context에 등록된 Filter들이 WAS 구동 시 Context Layer에 설정된 순서대로 Filter Chain을 구성한다.
구성된 Chain은 맨 처음 인스턴스 초기화 init을 거친 후 각 Filterdptj doFiler를 통해 필터링 작업을 진행하고 Destroy 된다.
@Slf4j
@RequiredArgsConstructor
public class SampleFilter extends OncePerRequestFilter {
private static final List<String> EXCLUDE_PATHS = newArrayList("/lbStatusCheck", "/hello");
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
if (!EXCLUDE_PATHS.contains(request.getRequestURI())) {
...
// Header Set, Logging 등 필요 작업 수행
...
}
filterChain.doFilter(request, response);
}
}
Interceptor
Filter와 다르게 Spring 레벨에서 지원하는 Servlet Filter이다. Spring Bean의 모든 객체에 접근할 수 있다.
Spring Context 내에서 HTTP Request와 HTTP Response 처리에 대한 강력한 기능을 제공한다.
Java Servlet 레벨에서 동작하는 Filter와 다르게 Spring Context 레벨에서 동작하므로 DispatcherServlet이 Request 및 Response를 처리하는 시점에 Interceptor Handler가 동작한다.
DispatcherServlet에서 요청이 처리되고 나면 요청받은 URL에 등록된 Interceptor가 호출된다.
preHandle -> postHandle -> afterCompletion 순으로 처리된다.
@Slf4j
@Component
@RequiredArgsConstructor
public class SampleMvcInterceptor extends HandlerInterceptorAdapter {
private final SampleMvcProvider sampleMvcProvider;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String sampleHeader = request.getHeader(SAMPLE_INTERNAL_HEADER_NAME);
if (isNotEmpty(sampleHeader)) {
log.info("SampleMvcInterceptor.preHandle() - SAMPLE_INTERNAL_HEADER_NAME: {}", abTestHeader);
sampleMvcProvider.sampleParse(sampleHeader);
}
return true;
}
}
AOP
관점 지향 프로그래밍, 즉 어떤 로직을 기준으로 핵심적인 관점과 부가적인 관점으로 나누어 보고 그 관점을 기준으로 모듈화 하는 것이다.
hoooon-s.tistory.com/54?category=961471
'Study > Spring in Action' 카테고리의 다른 글
[Spring in Action] Spring Security & LDAP & CSRF (0) | 2021.01.24 |
---|---|
[Spring in Action] JDBC & JPA 데이터로 작업하기 (0) | 2021.01.24 |
[Spring in Action] Spring AOP 예제 만들어 적용하기 (0) | 2021.01.23 |
[Spring in Action] Spring AOP & AspectJ (0) | 2021.01.23 |
[Spring in Action] Spring 이란? 구성요소 정리 (0) | 2021.01.20 |