[Spring] Filter, Interceptor, AOP

7981 단어 SpringJavaJava

Servlet Filter, Spring Interceptor, AOP 세 가지 기능은 모두 어떠한 행동을 하기 전에 먼저 실행하거나, 실행한 후에 추가적인 행동을 할 때 사용되는 기능들입니다.

(IMHO) 허나 어떠한 행위의 전후 처리에 대한 것이라는 점에서는 비슷하지만, AOP는 필터와 인터셉터와는 다르게 비즈니스적 관점에서 사용되고, 스프링의 개념적인 부분이 더 크다고 느껴 위 둘과는 결이 다르다고 생각되네요.
AOP는 생각보다 공부할 양도 꽤 돼서 추후 다른 글로 정리할 예정입니다.

주로 사용자 세션이나 권한 체크 등의 기능을 구현할 때, Filter와 Interceptor 중 선택해야 할 상황에 놓이게 됩니다.

둘은 전후 처리라는 점에서 그 역할은 비슷하나, 실제로 실행되는 시점이나 할 수 있는 것들이 다르기 때문애 처리해야 할 요구 사항에 따라서 선택한다면 조금 더 효과적으로 개발을 할 수 있습니다.

FilterInterceptorAOP
적용시점Spring Context 외부Spring Context 내부 ~ Controller 전메소드 실행 전후
적용 방식Web Application
(web.xml)
Spring Context
(servlet-context.xml)
Annotation, Pointcut 등 소스단
역할인코딩, 보안 등 전역적인 처리인증, 권한 체크 등 요청에 관한 상세한 처리로깅, 에러처리 등 중복 코드 분리

동작 순서

Filter와 Interceptor는 Servlet 단위에서 실행됩니다.
반면 AOP는 메소드 앞에서 Proxy 패턴으로 실행됩니다.

  • 서버를 실행시켜 서블릿이 올라오는 동안 Filter.init이 호출됩니다. 그리고 doFilter가 호출됩니다.
  • 컨트롤러에 들어가기 전에 preHandler가 실행됩니다.
  • 컨트롤러에 나와 postHandler, afterCompletion, doFilter 순으로 실행됩니다.
  • 컨트롤러의 메소드 처리가 끝나 return 되고 화면에 띄워주는 처리가 되기 직전에 preHandler가 호출됩니다.
  • 서블릿 종료 시 Filter.destroy가 실행됩니다.

Filter

Filter 는 이름 그대로 요청과 응답을 거른 뒤 정제하는 역할을 합니다.

필터는 웹 어플리케이션(web.xml ...)에 등록합니다.
요청 스레드가 DispatcherServlet에 도착하기 전, 즉 스프링 컨텍스트 외부에 존재하여 스프링과 무관한 자원에 대해 동작합니다.
필터에서는 사용자의 요청 정보에 대한 검증, 데이터 추가 혹은 변조, 자원의 처리 후 응답 정보에 대한 변경 등의 처리가 가능합니다.
주로 전역적으로 처리해야하는 인코딩 변환, XSS 방어 등 웹 보안 관련 기능, 인증 기능 등을 수행합니다.

public interface Filter {
	public void init(FilterConfig filterConfig) throws ServletException;
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;
    public void destroy();
}
Methoddescription
init()필터 인스턴스 초기화
doFilter()전/후 처리
destroy()필터 인스턴스 종료

Interceptor

Interceptor(인터셉터) 는 요청에 대한 작업 전, 후로 가로챕니다.

인터셉터는 스프링의 DistpatcherServlet이 컨트롤러를 호출하기 전, 후로 끼어들기 때문에 스프링 컨텍스트(Context, 영역) 내부에서 Controller(Handler)에 관한 요청과 응답에 대해 처리합니다.

Spring 레벨에서 지원하는 Servlet Filter 이기 때문에, 스프링의 모든 빈 객체에 접근할 수 있습니다.
인터셉터는 여러 개를 사용할 수 있고 로그인 체크, 권한 체크, 프로그램 실행 시간 계산작업 로그 확인 등의 업무처리에 사용합니다.

public interface HandlerInterceptor {
	boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
    					throws Exception;
    void postHandle( HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
    					throws Exception;
    void afterCompletion( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
    					throws Exception;
}
Methoddescription
preHandler()컨트롤러 메소드가 실행되기 전
postHanler()컨트롤러 메소드 실행 직후, view 페이지 렌더링 되기 전
afterCompletion()view 페이지가 렌더링 되고 난 후

AOP(Aspect Oriented Programming)

AOP는 OOP를 보완하기 위해 나온 개념으로, 관점 지향 프로그래밍이라고 불립니다.
비즈니스 로직의 어떠한 동작 전후로 중복되는 부분을 줄이기 위해 사용됩니다.

주로 로깅, 트랜잭션, 에러 처리 등 비즈니스단의 메소드에서 조금 더 세밀하게 조정할 때 사용합니다.
Interceptor나 Filter와는 달리 메소드 전후의 지점에 자유롭게 설정이 가능하고 주소, 파라미터, 어노테이션 등 다양한 방법으로 대상을 지정할 수 있습니다.

AOP의 @Advice는 Filter, HandlerInterceptor와 다르게 HttpServletRequest/Response 가 아닌 JoinPoint나 ProceedingJoinPoint 등을 활용해서 호출합니다.

Methoddescription
@Before대상 메소드의 수행 전
@After대상 메소드의 수행 후
@After-returning대상 메소드의 정상적인 수행 후
@After-throwing예외 발생 후
@Around대상 메소드의 수행 전, 후

Ref.

https://baek-kim-dev.site/61
(Spring)Filter와 Interceptor의 차이
[Java][Spring] Filter와 Interceptor

좋은 웹페이지 즐겨찾기