2024. 12. 21. 18:31ㆍBackend/Spring

📝 인프런에서 강의를 하고 계시는 김영한 님의 Spring Framework를 공부하고 있습니다. 틀리거나 다른 부분이 있을 수 있습니다.
Filter
개념
Filter는 HTTP 요청과 응답을 조작하기 위해 사용된다. Filter는 DispatcherServlet 앞에서, 들어오는 요청을 가로채어 조작하는 작업을 진행할 수 있다. Filter는 인증(Authentication) 등에서 사용될 수 있다.
| HTTP Request > Server(ex.WAS) > Filter > DispatcherServlet > Controller |
Filter 인터페이스를 확인하면, 다음과 같이 3개의 메서드로 구성되어 있음을 확인할 수 있다.

1. Init
init 은 메서드 이름처럼 필터를 '초기화'할 때 사용한다.
여기서 FilterConfig가 궁금해서 로그로 찍어봤는데, 아래와 같은 결과를 확인할 수 있었다.
| filterConfig? = ApplicationFilterConfig[name=~~~Filter, filterClass=com.project.test.filter.~~~Filter] |
- name은 @Configuration 과 @Bean의 설정을 통해 등록되어 있는 필터의 이름이었다.
- filterClass는 Filter 인터페이스를 구현한 ~~~Filter 였다.
2. doFilter
Filter 인터페이스의 핵심 메서드로서, 요청 및 응답을 필터링해주는 역할을 담당한다. HTTP 요청이 올 경우에 doFilter 메서드가 호출된다. filter는 chain 구성이 가능하다. 따라서 여러 필터가 있다면 다음 필터를 호출하게 되고, 그렇지 않다면 Servlet을 호출하여 요청(request)을 전달하게 된다.
궁금해서 해당 내용도 로그로 확인했다.
| ServletRequest = org.apache.catalina.connector.RequestFacade@10433b71 ServletResponse = org.apache.catalina.connector.ResponseFacade@4384a5f7 filterChain = org.apache.catalina.core.ApplicationFilterChain@126218fe |
- ServletRequest : 요청
- ServletResponse : 응답
- FilterChain : 다음 필터 또는 서블릿으로 요청을 전달
3. destroy
Filter가 제거될 때 호출되는 메서드이다. 서블릿 컨테이너가 필터를 제거할 때 호출된다.
| INFO 18272 --- [testService] HikariPool-1 - Shutdown initiated... INFO 18272 --- [testService] HikariPool-1 - Shutdown completed. INFO 18272 --- [testService] ~~~.filter.~~Filter : === Filter 종료 === |
구현
Spring Boot를 기준으로 공식 문서에 사용법이 잘 설명되어 있다. (아래 공식 문서 두 번째 reference)
공식 문서
Filters :: Spring Framework
Browsers can submit form data only through HTTP GET or HTTP POST but non-browser clients can also use HTTP PUT, PATCH, and DELETE. The Servlet API requires ServletRequest.getParameter*() methods to support form field access only for HTTP POST. The spring-w
docs.spring.io
Embedded Web Servers :: Spring Boot
Embedded Tomcat’s MBean registry is disabled by default. This minimizes Tomcat’s memory footprint. If you want to use Tomcat’s MBeans, for example so that they can be used by Micrometer to expose metrics, you must use the server.tomcat.mbeanregistry.
docs.spring.io
1) Filter 메서드를 구현한 Filter를 만들어준다. 위에서 설명한 init, doFilter, destroy 메서드를 override 할 수 있을 것이다.
2) @Configuration을 이용하여, Bean을 등록해준다!
@Configuration
public class TestConfig {
@Bean
public FilterRegistrationBean<Filter> registration() {
FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
registration.setFilter(new TestFilter());
registration.addUrlPatterns("/~~"); //원하는 url 등록
return registration;
}
}
Interceptor
개념
Interceptor는 Spring MVC 수준에서 동작하며, DispatcherServelt과 Controller 사이에서 요청 및 응답의 흐름을 제어하는 역할을 한다.
| HTTP Request > Server(ex.WAS) > DispatcherServlet > Interceptor > Controller |
Interceptor, 즉 HandlerInterceptor 인터페이스의 메서드는 총 3개이다.
1. preHandle : 컨트롤러 호출 전 단계

preHandle() 메서드는 컨트롤러 호출 전 단계에서 실행된다.
- HttpServletRequest : 요청
- HttpServletResponse : 응답
- Object handler : 요청을 처리할 핸들러, 요청을 처리하는 컨트롤러로 생각하면 됨! 이 때 전달되는 건 주로 HandlerMethod 타입의 객체입니다.
로그로 찍어본 결과는 다음과 같습니다. (예시)
| INFO 20828 --- login.web.interceptor.~~~Interceptor : class org.springframework.web.method.HandlerMethod INFO 20828 --- login.web.interceptor~~~Interceptor : public java.lang.String cohttp://m.project.test.TestController.getTest(com.project.test.dto,org.springframework.ui.Model) INFO 20828 --- login.web.interceptor.~~~Interceptor : cohttp://m.project.test.TestController@7557cfcd |
2. postHandle : 컨트롤러 호출 후 단계

postHandle() 메서드는 컨트롤러 호출 후 단계에서 실행됩니다.
3가지는 위 preHandle() 메서드와 동일하나, @Nullable ModelAndView modelAndView를 보시면.. ModelAndView 가 추가되어 있음을 확인할 수 있습니다.
3. afterCompletion : 요청 완료 후, view rendering 이후 단계

afterCompletion() 메서드는 요청 완료된 후 실행됩니다.
IntelliJ에서 쓰여 있는 문구를 확인하면 다음과 같습니다.
Callback after completion of request processing, that is, after rendering the view.
- IntelliJ, HandlerInterceptor 설명
중요한 점은 추가 파라미터가 @Nuallable Exception ex란 점입니다. 통신 과정에서 예외가 발생할 수 있습니다. 이럴 경우 postHandle이 호출되지 않는 문제점이 발생합니다.
그럼에도 afterCompletion이 호출되는 것을 가능하게 하도록 되어 있습니다.
구현
구현을 위해 공식 문서를 살펴보면 좋습니다.
공식 문서
Interceptors :: Spring Framework
The XML config declares interceptors as MappedInterceptor beans, and those are in turn detected by any HandlerMapping bean, including those from other frameworks. By contrast, the Java config passes interceptors only to the HandlerMapping beans it manages.
docs.spring.io
1) HandlerInterceptor를 구현한 Interceptor를 만들어주세요
2) 이후, 아래와 같은 설정 파일에서 addInterceptors를 override 해주시면 됩니다.
@Configuration
public class WebConfiguration implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LocaleChangeInterceptor())
.order(숫자) // 순서
.addPathPatterns(~~~~) //Interceptor 적용 url
.excludePathPatterns(~~~~); //Interceptor 미적용 url
}
}
Filter와 Interceptor의 차이점?
그렇다면, Filter와 Interceptor의 차이점은 무엇일까요?
| Filter | Interceptor |
| Servlet 직전 호출 | Servlet 이후 호출 |
| 여러 요청 | Controller 들어오는 요청 |
| init(), doFilter(), destroy() | preHandle(), postHandle(), afterCompletion() |
| Filter 구현 / FilterRegistrationBean | HandlerInterceptor 구현 / WebMvcConfigurer |
정리하자면,
Client Request -> Filter -> DispatcherServlet -> Interceptor(preHandle) -> Controller -> Interceptor(postHandle) -> Filter -> Client Response
순으로 생각하시면 됩니다😊!!!
References
1. [스프링 MVC 2편 - 백엔드 웹 개발 핵심 기술] - 김영한
2. Spring Filter : https://docs.spring.io/spring-framework/reference/web/webmvc/filters.html
3. Spring Boot Filter : https://docs.spring.io/spring-boot/how-to/webserver.html#howto.webserver.add-servlet-filter-listener.spring-bean
4. Spring Interceptor : https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-config/interceptors.html
5. [Spring] Filter vs Interceptor : https://velog.io/@ddangle/Spring-Filter-vs-Interceptor
'Backend > Spring' 카테고리의 다른 글
| [Spring Cloud] Spring Cloud Data Flow (local_ver) (0) | 2025.02.17 |
|---|---|
| [Spring] JSON : Jackson, Gson (0) | 2025.01.07 |
| [Error/Spring/Network] SocketTimeOutException (1) | 2024.11.15 |
| [Error/Spring] unknown enum constant When.MAYBE (1) | 2024.09.28 |
| [Spring] Spring - build.gradle (0) | 2024.08.14 |