Filter, Interceptor, AOP

Jae-Baek Song·2023년 4월 28일
1

Spring에서 공통 관심사를 해결할수있는 방법이 3가지 있다.

- Filter
- Interceptor
- AOP


Servlet Filter

필터 흐름

HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 컨트롤러

필터 체인

HTTP 요청 -> WAS -> 필터1 -> 필터2 -> 필터3 -> 서블릿 -> 컨트롤러

필터 구성

필터 인터페이스를 구현하고 등록하면 서블릿 컨테이너가 필터를 싱글톤 객체로 생성하고, 관리한다.

init(): 필터 초기화 메서드, 서블릿 컨테이너가 생성될 때 호출된다.
doFilter(): 고객의 요청이 올 때 마다 해당 메서드가 호출된다. 필터의 로직을 구현하면 된다.
destroy(): 필터 종료 메서드, 서블릿 컨테이너가 종료될 때 호출된다.

참고

chain.doFilter(request, response); 를 호출해서 다음 필터 또는 서블릿을 호출할 때 request , response 를 다른 객체로 바꿀 수 있다.
ServletRequest , ServletResponse 를 구현한 다른 객체를 만들어서 넘기면 해당 객체가 다음 필터 또는 서블릿에서 사용된다

https://whitelife.tistory.com/214


스프링 인터셉터

스프링 인터셉터는 스프링 MVC가 제공하는 기술이다.

서블릿 필터의 경우 단순하게 doFilter() 하나만 제공된다. 인터셉터는 단계적으로 잘 세분화 되어 있다.

서블릿 필터의 경우 단순히 request , response 만 제공했지만, 인터셉터는 어떤 컨트롤러 handler가 호출되는지 호출 정보도 받을 수 있다.
그리고 어떤 modelAndView 가 반환되는지 응답 정보도 받을 수 있다.

  • preHandle : 핸들러 어댑터 호출 전에 실행된다.
    preHandle 의 응답값이 true 이면 다음으로 진행하고, false 이면 더는 진행하지 않는다.
  • postHandle : 핸들러 어댑터 호출 후 실행된다.
  • afterCompletion : 뷰가 렌더링 된 이후에 호출된다.

ArgumentResolver

자동으로 세션에 있는 객체를 찾고, 만약 세션에 없다면 null 을 반환

  • supportsParameter() : @Login 애노테이션이 있으면서 Member 타입이면 해당 ArgumentResolver
    가 사용된다.
  • resolveArgument() : 컨트롤러 호출 직전에 호출 되어서 필요한 파라미터 정보를 생성해준다. 여기서는
    세션에 있는 로그인 회원 정보인 member 객체를 찾아서 반환해준다. 이후 스프링MVC는 컨트롤러의
    메서드를 호출하면서 여기에서 반환된 member 객체를 파라미터에 전달해준다.

0개의 댓글