[Spring] Filter와 Interceptor
Filter?
url 패턴이 맞는 요청에 대해 Dispatcher Servlet으로 요청되기 전, 후에 부가적인 작업을 한다.
DIspatcher Servlet은 스프링의 가장 앞단에 존재하며, Filter는 스프링 컨테이너 밖, 톰캣 등의 웹 컨테이너에 존재한다.
Filter는 아래 3가지의 메소드를 가지고 있다.
init
웹 컨테이너가 실행될 때 1회 실행한다.
doFilter
url pattern이 맞는 http 요청이 Dispatcher Servlet으로 전달되기 전에 실행된다. 파라미터에 FilterChain이 있는데, 이 파라미터의 doFilter 메소드를 호출해 다음 대상으로 요청을 전달한다. 이 메소드 호출 전/후에 필요한 처리 로직을 넣는다.
destroy
필터를 서비스에서 제거할 때 호출된다.
@WebFilter("/*")
class ExFilter: Filter {
override fun init(filterConfig: FilterConfig?) {
super.init(filterConfig)
}
override fun destroy() {
super.destroy()
}
override fun doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) {
//전 처리
chain.doFilter(request, response)
// 후 처리
}
}
Filter에서는 ControllerAdvice, ExceptionHandler를 이용한 예외 처리 기능을 사용할 수 없다. 이를 통한 Exception이 발생하면, 500 Status로 응답을 반환할 것이다. 따라서, Filter에서 예외를 발생시킬 때는 Response를 조작해 처리해야 한다.
Interceptor?
컨트롤러를 호출하기 전/후에 요청/응답을 참조하거나 가공할 수 있도록 한다.
Interceptor는 스프링 컨테이너에서 동작한다.
Interceptor는 아래 3가지의 메소드를 가지고 있다.
preHandle
컨트롤러가 호출되기 전에 실행된다. 컨트롤러 이전의 전처리 작업이나, 요청을 가공할 수 있다.
handler 파라미터는 요청의 Controller 메소드를 추상화한 객체이다.
false를 반환하면, 다음 interceptor나 controller의 다음 단계로 진행하지 않는다.
postHandle
컨트롤러 호출된 후에 실행된다. 후처리 작업이나, 응답을 가공할 수 있다.
컨트롤러 하위 계층에서 작업을 진행하다가 중간에 예외가 발생하면 postHandle은 호출되지 않는다.
afterCompletion
요청에 대한 작업이 모두 완료되었을 때 호출된다.
class ExInterceptor: HandlerInterceptor {
override fun preHandle(request: HttpServletRequest, response: HttpServletResponse, handler: Any): Boolean {
return super.preHandle(request, response, handler)
}
override fun postHandle(
request: HttpServletRequest,
response: HttpServletResponse,
handler: Any,
modelAndView: ModelAndView?
) {
super.postHandle(request, response, handler, modelAndView)
}
override fun afterCompletion(
request: HttpServletRequest,
response: HttpServletResponse,
handler: Any,
ex: Exception?
) {
super.afterCompletion(request, response, handler, ex)
}
}