서버/Spring

[Spring] Filter와 Interceptor

sm.jeon 2024. 3. 13. 01:58
반응형

Filter?

url 패턴이 맞는 요청에 대해 Dispatcher Servlet으로 요청되기 전, 후에 부가적인 작업을 한다.

DIspatcher Servlet은 스프링의 가장 앞단에 존재하며, Filter는 스프링 컨테이너 밖, 톰캣 등의 웹 컨테이너에 존재한다.

Interceptor의 위치도 기억해놓자.

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)
    }
}
반응형