자바 웹 개발을 하다보면 공통적으로 처리해야 할 업무들이 많다. 예를 들어 로그인 관련 처리, 권한체크, XSS 방어 등이 있다. 공통 업무에 관련한 코드를 모든 페이지마다 작성한다면 중복된 코드가 많아지게 되고, 프로젝트 단위가 커질수록 서버에 부하를 줄 수도 있으며 소스 관리도 되지 않는다.
이러한 공통 업무는 따로 분리하여 관리하는 것이 좋으며 다음과 같은 세가지를 활용할 수 있다.
Filter
Interceptor
AOP
스프링 프레임워크에서 사용되는 Filter
, Interceptor
, AOP
세 가지 기능은 모두 요청 실행 전이나 실행 후에 추가적인 행동을 할 때 사용되는 기능들이다.
서버를 실행시켜 서블릿이 올라오는 동안에 init이 실행되고, 그 후 doFilter가 실행된다.
컨트롤러에 들어가기 전 preHandler가 실행된다
컨트롤러에서 나와 postHandler, after Completion, doFilter 순으로 진행이 된다.
서블릿 종료 시 destroy가 실행된다.
Filter
는 말 그대로 요청과 응답을 거른 뒤 정제하는 역할을 한다. 서블릿 필터는 DispatcherServlet 이전에 실행이 되는데 필터가 동작하도록 지정된 자원의 앞단에서 요청내용을 변경하거나, 여러가지 체크를 수행할 수 있다. 또한 자원의 처리가 끝난 후 응답내용에 대해서도 변경하는 처리를 할 수가 있다. 보통 web.xml에 등록하고, 일반적으로 인코딩 변환 처리, XSS방어 등의 요청에 대한 처리로 사용된다.
Interceptor
는 요청에 대한 작업 전/후를 가로챈다. 필터는 스프링 컨텍스트 외부에 존재하여 스프링과 무관한 자원에 대해 동작한다. 하지만 Interceptor
는 스프링의 DispatcherServlet이 컨트롤러를 호출하기 전, 후로 끼어들기 때문에 스프링 컨텍스트 내부에서 Controller(Handler)에 관한 요청과 응답에 대해 처리하며 스프링의 모든 빈 객체에 접근할 수 있다. Interceptor
는 여러 개를 사용할 수 있고 로그인 체크, 권한 체크, 로그 확인 등의 업무 처리로 사용한다.
AOP는 객체 지향의 프로그래밍을 했을 때, 중복을 줄일 수 없는 부분을 줄이기 위해 종단면(관점)에서 바라보고 처리한다. 주로 로깅, 트랜잭션, 에러 처리 등 비즈니스단의 메서드에서 조금 더 세밀하게 조정하고 싶을 때 사용한다.
Interceptor
와 Filter
와 달리 메소드 전 후의 지점에 자유롭게 설정이 가능하며 주소, 파라미터, 어노테이션 등 다양한 방법으로 대상을 지정할 수 있다. 반면 HandlerInterceptor는 Filter와 유사하게 HttpServletRequest, HttpServletResponse를 파라미터로 사용한다.
@Before - 대상 메서드의 수행 전
@After - 대상 메서드의 수행 후
@After-returning - 대상 메서드의 정상적인 수행 후
@After-throwing - 예외발생 후
@Around - 대상 메서드의 수행 전/후