Filter, Iterceptor, AOP의 차이점 및 정리
스프링으로 웹 개발을 하다보면 Filter, Interceptor, AOP를 이용해 전/후 처리를 할 수 있다,
셋 다 비슷한 기능을 가지고 있지만 시점이나 적용하는 방식이 다르다.
Filter
말그대로 요청과 응답을 거른뒤 정제하는 역할을 한다.
서블릿 필터는 DispatcherServlet 이전에 실행이 되는데 필터가 동작하도록 지정된 자원의 앞단에서 요청내용을 변경하거나, 여러가지 체크를 수행할 수 있다.
또한 자원의 처리가 끝난 후 응답내용에 대해서도 변경하는 처리를 할 수가 있다.
보통 web.xml에 등록하고, 일반적으로 인코딩 변환 처리, XSS방어 등의 요청에 대한 처리로 사용된다.
Filter 메서드
init() - 필터 인스턴스 초기화
doFilter() - 전/후 처리
destroy() - 필터 인스턴스 종료
Interceptor
필터는 스프링과 무관하게 지정된 자원에 대해 동작한다.
스프링은 DistpatcherServlet으로부터 시작되므로 필터는 스프링 컨텍스트 외부에 존재하게 된다.
하지만 인터셉터는 스프링의 DistpatcherServlet이 컨트롤러를 호출하기 전, 후로 끼어들기 때문에 스프링 컨텍스트 내부에 존재하게된다.
그리고 스프링 내의 모든 객체(bean) 접근이 가능하다.
인터셉터는 여러 개를 사용할 수 있고 로그인 체크, 권한체크, 프로그램 실행시간 계산작업 로그확인, 업로드 파일처리등에 사용된다.
Interceptor 메서드
preHandler() - 컨트롤러 메서드가 실행되기 전
postHanler() - 컨트롤러 메서드 실행직 후 view페이지 렌더링 되기 전
afterCompletion() - view페이지가 렌더링 되고 난 후
AOP
객체 지향의 프로그래밍을 했을 때 중복을 줄일 수 없는 부분을 줄이기 위해 종단면(관점)에서 바라보고 처리한다.
주로 ‘로깅’, ‘트랜잭션’, ‘에러 처리’등 비즈니스단의 메서드에서 조금 더 세밀하게 조정하고 싶을 때 사용합니다.
Interceptor나 Filter와는 달리 메소드 전후의 지점에 자유롭게 설정이 가능하다.
Interceptor와 Filter는 주소로 대상을 구분해서 걸러내야하는 반면, AOP는 주소, 파라미터, 애노테이션 등 다양한 방법으로 대상을 지정할 수 있다.
AOP의 포인트컷
@Before: 대상 메서드의 수행 전
@After: 대상 메서드의 수행 후
@After-returning: 대상 메서드의 정상적인 수행 후
@After-throwing: 예외발생 후
@Around: 대상 메서드의 수행 전/후
정리
구분 | Filter | Interceptor | AOP |
---|---|---|---|
실행위치 | 서블릿 (Dispatcher Servlet 바깥) | 서블릿 (Dispatcher Servlet 안쪽) | 메서드 |
실행순서 | 1 | 2 | 3 |
설정파일 위치 | web.xml | xml,java | xml,java |
실행 메소드 | init (필터 인스턴스 초기화) doFilter (전/후 처리) destroy (필터 인스턴스 종료) |
preHandler (컨트롤러 실행 전) postHandler (컨트롤러 실행 후) afterCompletion (view 페이지 렌더링 후) |
pointcut (포인트컷) (@after, @before, @around 등) |