🌱Java | Spring

[Spring] Filter vs Interceptor

이줭 2022. 7. 18. 23:43
728x90

Spring에서 중복된 코드를 제거할 수 있도록 공통적으로 작업을 처리할 수 있는 기능들을 많이 제공하고 있는데, 그 중 FilterInterceptor의 차이에 대해 알아보자.

 

먼저, 아래의 그림을 보고 차이점에 대해 자세히 알아보자.

Filter

Filter는 J2EE 표준 스팩 기능으로 Dispatcher Servlet에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가적인 작업을 처리할 수 있는 기능을 제공한다. Dispatcher Servlet은 Spring의 가장 앞 단에 존재하는 Controller로 Filter는 Spring 범위 밖에서 처리가 이루어 진다.

 

즉, Filter는 Spring Bean으로 등록은 되지만 톰캣과 같은 Web Container에 의해 관리가 되는 것이다. Filter를 사용하기 위해, javax.servlet의 Filter Interface를 구현해야하고, 아래와 같이 3개의 메서드를 가지고 있다.

init() 

init 메서드는 Filter 객체를 초기화하고 서비스에 추가하기 위한 메서드로, Web Container가 1회 init 메서드를 호출하여, Filter 객체를 초기화 하면 이후의 요청들은 doFilter 메서드를 통해 처리된다.

doFilter()

doFilter 메서드는 url 패턴에 맞는 모든 http 요청이 Dispather Servlet으로 전달되기 전에 Web Container에 의해 실행되는 메서드로 해당 메서드의 파라미터로는 FilterChain이 있다.

FilterChain의 doFilter를 통해 다음 대상으로 요청을 전달하고, chain.doFilter() 전/후에 필요한 처리 과정을 넣어 줌으로써, 원하는 처리를 진행 할 수 있다.

destroy()

destroy 메서드는 Filter 객체를 서비스에서 제거하고 사용하는 자원을 반환하기 위한 메서드이다. 해당 메서드는 Web Container에 의해 1번 호출되며, 이후에는 doFilter에 의해 처리되지 않는다.

Interceptor

Interceptor는 Filter와 달리 Spring이 제공하는 기술로 Dispatcher Servlet이 Controller를 호출하기 전/후에 요청과 응답을 참조하거나, 가공할 수 있는 기능을 제공한다. 즉, Spring Context에서 동작하는 것이다.

 

Dispatcher Servlet은 Handler Mapping을 통해 적절한 Controller를 찾도록 요청하고, 그 결과로 실행 체인(Handler Execution Chain)을 돌려준다. 이 실행 체인은 1개 이상의 Interceptor가 등록되어 있다면, 순차적으로 Interceptor들을 거쳐 Controller가 실행되도록 하고, Interceptor가 없다면 바로 Controller를 실행한다.

 

Interceptor를 사용하기 위해, org.springframework.web.servlet의 HandlerInterceptor Interface를 구현해야하고, 다음과 같이 3개의 메서드를 가지고 있다.

preHandle()

preHandle 메서드는 Controller가 호출되기 전에 실행되고, Controller 이전에 처리해야 하는 전처리 작업이나 요청 정보를 가공 또는 추가하는 경우 사용 할 수 있다. preHandle의 반환 타입은 boolean으로 해당 값이 true이면 다음 단계로 진행되지만, false이면 작업을 중단하고 이후의 작업은 진행되지 않는다.

postHandle()

postHandle 메서드는 Controller를 호출한 후에 실행되고, Controller 이후에 처리해야 하는 작업이 있을 때 사용할 수 있다. Controller 하위 계층에서 작업 진행 중 예외가 발생하면 postHandle은 호출 되지 않는다.

afterCompletion()

afterCompletion 메서드는 모든 View에서 최종 결과를 생성하는 일을 포함해 모든 작업이 완료된 후 실행된다. 요청 처리 중 사용한 자원을 반환할 때 사용하기 적합하다. postHandle과 달리 Controller 하위 계층에서 작업 중 예외가 발생하더라도, afterCompletion은 반드시 호출된다.

 

정리

대상 Filter Interceptor
관리 Container Servlet Container Spring Container
Spring 예외 처리 여부 X O
Requset/Response 객체 조작 가능 여부 O X
용도 - 공통 보안 및 인증/인가 작업
- 모든 요청에 대한 로깅 또는 심사
- 이미지/데이터 압축, 문자열 인코딩
- Spring과 분리되어야 하는 기능
- 세부적인 보안, 인증/인가 공통 작업
- API 호출에 대한 로깅 또는 감사
- Controller로 넘겨주는 데이터 가공

 

참고: https://mangkyu.tistory.com/173

728x90

'🌱Java | Spring' 카테고리의 다른 글

[Java] Java의 메모리 관리(2)  (0) 2022.07.31
[Java] Java의 메모리 관리(1)  (0) 2022.07.24
[Spring] Spring MVC  (0) 2022.06.30
[Java] 추상클래스 vs 인터페이스  (0) 2022.06.14
[Java] String?  (0) 2022.06.01