Filter -> Interceptor -> AOP -> Interceptor -> Filter
Filter
필터는 Web Application에 등록합니다. 요청 스레드가 서블릿 컨테이너(Servlet Container)에 도착하기 전에 수행됩니다. 필터는 사용자의 요청 정보에 대한 검증하고 필요에 따라 데이터를 추가하거나 변조할 수 있습니다. 응답 정보에 대한 변경도 가능합니다. 주로 전역적으로 처리해야하는 인코딩, 보안 관련된 일을 수행합니다.
Filter를 구현하여 webMvcConfigurer에 필터를 추가
Interceptor
인터셉터는 스프링 컨텍스트(Context)에 등록합니다. 서블릿 컨테이너를 통과한 후 컨트롤러에게 요청이 전달되기 전, 후에 대한 처리를 수행합니다. 스프링 컨텍스트 내에 존재하기 때문에 모든 빈(Bean) 객체에 접근할 수 있습니다. 여러 개의 인터셉터를 사용할 수 있으며 세션 처리, 로그인 처리, 권한 체크, 프로그램 실행 시간 계산 등을 수행합니다. 필터와 다르게 hanlderMethod 파라미터를 이용하여 AOP와 같은 기능 수행이 가능합니다.
HandlerInterceptor를 구현하여 webMvcConfigurer에 addInterceptors 메소드를 override하여 구현한 인터셉터를 등록
AOP
비즈니스 로직을 수행하는데 중복되는 코드를 줄이기 위한 프로그래밍 방법입니다. 비즈니스 로직의 특정 시점을 바라보고 해당 시점이 수행되는 순간을 가로채어 전, 후 기능을 처리합니다. 주로 로깅, 트랜잭션 처리, 에러 처리 같은 기능을 수행합니다.
@Aspect와 @Around를 사용하여 특정 패키지 아래를 처리할 수 있다.
필터에서만 할 수 있는 일
ServletRequest 혹은 ServletResponse를 교체할 수 있다. 아래와 같은 일이 가능하다.
public class SomeFilter implements Filter {
//...
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
chain.doFilter(new CustomServletRequest(), new CustomResponse());
}
}
설마 저런 일을 할까? 꽤 자주 있는 요구 사항이다. HttpServletRequest의 body(ServletInputStream의 내용)를 로깅하는 것을 예로 들 수 있을 것 같다. HttpServletRequest는 body의 내용을 한 번만 읽을 수 있다. Rest API Application을 작성할 때, 흔히 json 형식으로 요청을 받는다. @Controller(Handler)에 요청이 들어오면서 body를 한 번 읽게 된다. 때문에 Filter나 Interceptor에서는 body를 읽을 수 없다. IOException이 발생한다. body를 로깅하기 위해서는 HttpServletRequest를 감싸서 여러 번 inputStream을 열 수 있도록 커스터마이징 된 ServletRequest를 쓸 수 밖에 없다.
인터셉터에서만 할 수 있는 일
AOP 흉내를 낼 수 있다. @RequestMapping 선언으로 요청에 대한 HandlerMethod(@Controller의 메서드)가 정해졌다면, handler라는 이름으로 HandlerMethod가 들어온다. HandlerMethod로 메서드 시그니처 등 추가적인 정보를 파악해서 로직 실행 여부를 판단할 수 있다. View를 렌더링하기 전에 추가 작업을 할 수 있다. 예를 들어 웹 페이지가 권한에 따라 GNB(Global Navigation Bar)이 항목이 다르게 노출되어야 할 때 등의 처리를 하기 좋다.
참고 : https://junhyunny.github.io/spring-boot/filter-interceptor-and-aop/
Spring Filter, Interceptor 그리고 AOP
junhyunny.github.io
'스프링' 카테고리의 다른 글
스프링 핵심 원리 - (3) (0) | 2022.08.03 |
---|---|
스프링 핵심 원리 - (2) (0) | 2021.09.10 |
스프링 핵심 원리 - (1) (0) | 2021.09.10 |
Spring (0) | 2021.06.28 |
Logback (0) | 2021.05.25 |
댓글