본문 바로가기

Programming/Java & Spring 관련 내용 정리

[Spring] Filter와 Interceptor의 차이가 무엇인가요? (+ AOP)

 

개발을 하다보면 공통적으로 처리해야 할 업무들이 있다.
예를들면 세션체크처리, 권한체크, pc와 모바일웹의 분기처리, 페이지 인코딩 변환 등이 있다. 

공통업무에 관련된 코드를 모든 페이지 마다 작성 해야한다면 중복된 코드가 많아지고 
프로젝트 단위가 커질수록 서버에 부하를 줄 수도 있으며

소스 관리도 복잡해질 수 있다. 

이 때문에 공통 부분은 빼서 따로 관리하는게 좋다.

공통업무를 프로그램 흐름의 앞, 중간, 뒤에 추가하여 자동으로 처리할 수 있는 방법은 아래와 같이 3가지가 있다.

1. Filter

2. Interceptor

3. AOP

 

 

3가지 방식의 특징 및 차이점은 아래와 같다.

 

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

 

 


🎈 실행 순서

 

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

 

실행순서를 보면 Filter가 가장 밖에 있고 그안에 Interceptor, 그안에 AOP가 있는 형태이다.

따라서 요청이 들어오면 Filter → Interceptor → AOP → Interceptor → Filter 순으로 거치게 된다.

 

 

 

 

  1. 서버 실행 시 Servlet이 올라오는 동안 init 후 doFilter 실행
  2. Dispatcher Servlet을 지나쳐 Interceptor의 preHandler 실행
  3. 컨트롤러를 거쳐 내부 로직 수행 후, Interceptor의 postHandler 실행
  4. doFilter 실행
  5. Servlet 종료 시 destroy

 


🎈 Filter

 

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

 

- Filter는 웹 어플리케이션(web.xml ...)에 등록한다.

 

- WAS 내의 ApplicationContext에서 등록된 필터가 실행되며,

WAS 구동 시 FilterMap이라는 배열에 등록되고, 실행 시 Filter chain을 구성하여 순차적으로 실행된다.

 

스프링 컨텍스트 외부에 존재하여 스프링과 무관한 자원에 대해 동작한다.

 

- 예외 발생 시 Web Application에서 예외 처리한다.

 

- 필터에서는 사용자의 요청 정보에 대한 검증, 데이터 추가 혹은 변조, 자원의 처리 후 응답 정보에 대한 변경 등의 처리가 가능하다.
주로 전역적으로 처리해야하는 인코딩 변환, 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();
}

 

Method Description
init() 필터 인스턴스 초기화
doFilter() 실제 로직 처리
destroy() 필터 인스턴스 종료

 


🎈 Interceptor

 

- Dispatcher Servlet 이후 Controller 호출 전, 후에 끼어들어 기능 수행한다.

 

- 일반적으로 servlet-context.xml에 설정한다.


- Spring Context 내부에서 Controller의 요청과 응답에 관여하며 모든 Bean에 접근 가능하다.


- 예외 발생 시 @ControllerAdvice에서 @ExceptionHandler를 사용해 예외 처리

 

인터셉터는 여러 개를 사용할 수 있고 

로그인 체크, 권한 체크, 프로그램 실행 시간 계산작업 로그 확인 등의 업무처리에 사용된다.

 

 

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;
}

 

Method Description
preHandler() 컨트롤러 메소드가 실행되기 전
postHanler() 컨트롤러 메소드 실행 직후, view 페이지 렌더링 되기 전
afterCompletion() view 페이지가 렌더링 되고 난 후

 


🎈 AOP

 

AOP는 비즈니스 로직의 어떠한 동작 전후로 중복되는 부분을 줄이기 위해 사용된다.

주로 로깅, 트랜잭션, 에러 처리 등 비즈니스단의 메소드에서 조금 더 세밀하게 조정할 때 사용한다.

Interceptor나 Filter와는 달리 메소드 전후의 지점에 자유롭게 설정이 가능하고 

주소, 파라미터, 어노테이션 등 다양한 방법으로 대상을 지정할 수 있다.

AOP의 @Advice는 Filter, HandlerInterceptor와 다르게 

HttpServletRequest/Response 가 아닌 

JoinPoint나 ProceedingJoinPoint 등을 활용해서 호출한다.

 

 

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

 

 


🎈 Filter, Interceptor 차이점 요약

 

Filter는 WAS단에 설정되어 Spring과 무관한 자원에 대해 동작하고,

Interceptor는 Spring Context 내부에 설정되어 컨트롤러 접근 전, 후에 가로채서 기능 동작한다.

 

Filter는 doFilter() 메소드만 있지만, Interceptor는 pre와 post로 명확하게 분리된다.


Interceptor의 경우 AOP 흉내가 가능하다.
- handlerMethod(@RequestMapping을 사용해 매핑 된 @Controller의 메소드)를 파라미터로 제공하여

메소드 시그니처 등 추가 정보를 파악해 로직 실행 여부가 판단 가능하다.