Spring
Filter, Interceptor, AOP 차이점
훈지런
2022. 6. 6. 22:16
우선 이 3 가지를 하나도 묶어서 차이점을 정리하는 이유는 이 세가지의 공통점이 있기 떄문이다.
작업을 하다보면 공통된 작업을 처리해야하는 경우가 발생하는데
예를들어 로그인 세션처리, 권한처리, 인코딩처리등 공통된 처리를 작업함에있어서 하나하나 다 따로 작성하면 중복코드도 많아지고
같은 기능을 다르게 처리하는 실수가 있을수있기에 이 3가지로 공통 처리를 하곤하는데
필터, 인터셉터, AOP 의 정확한 역할과 기능을 하고 사용해야 실수를 범하지않을수있지않을까 싶어서 정리한다.
또한 면접 단골 질문인거같다.
우선 순서를 정하면 Filter > Intercepter > AOP > Intercepter > Filter 순서로 진행된다.
Filter
필터는 서블릿 전,후에서 작동한다.
Filter 인터페이스를 상속받아서 찍어보았다.
@Component public class FilterTest implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("FilterTest.init"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("FilterTest.doFilter : In"); chain.doFilter(request,response); System.out.println("FilterTest.doFilter : Out"); } @Override public void destroy() { System.out.println("FilterTest.destroy"); } }
올리니까 init 함수가 먼저 실행되었다. chain.doFilter 함수가 앞선 코드가 먼저 실행되고 컨트롤러가 작동하고 그 히우 doFilter 뒷 코드가 작동했다. 마지막으로 종료를 하자 destory함수가 작동하였다.
Interceptor
인터셉터는 서블릿내에서 컨트롤러 호출 전,후에서 작동한다.
인터셉터마찬가지로 다음과 같이찍어보았다.
@Component public class InterceptorTest implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("InterceptorTest.preHandle"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("InterceptorTest.postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("InterceptorTest.afterCompletion"); } }
@Configuration @RequiredArgsConstructor public class InterceptorConfTest implements WebMvcConfigurer { final private HandlerInterceptor handlerInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(handlerInterceptor); } }
테스트 결과
테스트 결과
컨트롤러에 진입하기전에 preHandle함수를 호출하였고
컨트롤러작동 이후에 postHandle함수를 호출하였다
afterCompletion는 뷰처리가 완료된 이후에 호출한다.
AOP
AOP는 비즈니스 단에서 메소드 전, 후를 자유롭게 설정가능하다.
파라미터, 함수명, 주소등 자유롭게 설정가능하며 주로 로깅, 트렌젝션 등등에서 많이 쓰인다.
AOP는 따로 다룰예정....흠..