CS

[Spring] Filter와 Interceptor

KJihun 2023. 11. 20. 16:19
728x90

 

 

 

Filter와 Spring Interceptor는 모두 웹 애플리케이션에서 요청을 가로채고 처리하는 데 사용된다.

 

 

 

 

Filter(Servlet Filter)

J2EE 표준 스펙 기능으로 디스패처 서블릿(Dispatcher Servlet)에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공한다.

HTTP 요청이 서블릿에 도달하기 전과 후에 모두 동작할 수 있다. 요청 및 응답에 대한 일반적인 작업을 수행하는 데 사용된다.

 

메소드 종류

필터를 사용하기 위해서는 javax.servlet의 Filter 인터페이스를 구현(implements) 해야 하며, 다음과 같은 메소드를 가진다.

 

init()

필터 객체를 초기화하고 서비스에 추가하기 위한 메소드
웹 컨테이너가 1회 init()을 호출하여 필터 객체를 초기화하면 이후 요청들은 doFilter()를 통해 처리된다.

 

doFilter()

url-pattern에 맞는 모든 HTTP 요청이 디스패처 서블릿으로 전달되기 전에 웹 컨테이너에 의해 실행되는 메소드이다.
doFilter의 파라미터로 FilterChain이 있는데, FilterChain의 doFilter 통해 다음 대상으로 요청을 전달할 수 있게 된다.
chain.doFilter()로 전, 후에 우리가 필요한 처리 과정을 넣어줌으로써 원하는 처리를 진행할 수 있다.

 

destroy()

필터 객체를 제거하고 사용하는 자원을 반환하기 위한 메소드이다.
웹 컨테이너가 1회 destroy()를 호출하여 필터 객체를 종료하면 이후에는 doFilter에 의해 처리되지 않는다.

 

 


Spring Interceptor

Dispatcher Servlet이 Controller를 호출하기 전 / 후에 요청과 응답을 참조하거나 가공할 수 있는 기능을 제공한다.
웹 컨테이너에서 동작하는 필터와 달리 인터셉터는 스프링 컨텍스트에서 동작한다.
디스패처 서블릿이 핸들러 매핑을 통해 컨트롤러를 찾도록 요청하는데,

그 결과로 실행 체인(HandlerExecutionChain)을 돌려준다.
여기서 1개 이상의 인터셉터가 등록되어 있다면 순차적으로 인터셉터들을 거쳐 컨트롤러가 실행되도록 하고,
인터셉터가 없다면 바로 컨트롤러를 실행한다.

 

메소드 종류

 

preHandle

- Controller가 호출되기 전에 실행된다.
컨트롤러 이전에 처리해야 하는 전처리 작업이나 요청 정보를 가공하거나 추가하는 경우에 사용할 수 있다.

 

postHandle

- Controller가 호출된 후에 실행된다. ( View 렌더링 전)
컨트롤러 이후에 처리해야 하는 후처리 작업이 있을 때 사용할 수 있다. 이 메소드는 컨트롤러가 반환하는 ModelAndView 타입의 정보가 제공되는데, 최근에는 JSON 형태로 데이터를 제공하는 RestAPI 기반의 컨트롤러(@RestController)를 만들면서 자주 사용되지 않는다.

 

afterCompletion

- 모든 뷰에서 최종 결과를 생성하는 일을 포함해 모든 작업이 완료된 후에 실행된다. ( View 렌더링 후)
요청 처리 중에 사용한 리소스를 반환할 때 사용할 수 있다.

 

 

 

필터(Filter)와 인터셉터(Interceptor)의 차이

1. 필터의 경우 웹 컨텍스트 안에서 실행되며, 인터셉터의 경우 스프링 컨텍스트 안에서 실행된다.
2. 필터의 경우 HttpServlet request / response 객체를 조작할 수 있지만 인터셉터의 경우 불가능하다. 

 

 

 

 

 

 

 

'CS' 카테고리의 다른 글

[Spring] ServletConfig, ServletConfig  (0) 2023.11.22
[Spring] POJO  (0) 2023.11.20
[Spring]Front Controller, Dispatcher Servlet  (0) 2023.11.16
[mySQL] 면접 예상 질문  (0) 2023.11.07
[Network] websocket & stomp, 실시간 통신  (0) 2023.11.07