1. 개요
Spring MVC기반 웹 애플리케이션에서는 요청(Request)와 응답(Response)이 Controller에 도달하기 전 후로
다양한 처리가 필요한 경우가 많다.
(예: 로그인 세션 확인, 인코딩 설정, 접근 권한 체크, 로깅 등)
이때 사용할 수 있는 대표적인 두 가지 기술이 바로 Filter와 Interceptor이다.
2. Filter (javax.servlet.Filter)
개념
- Servlet 표준 스펙에서 제공하는 기능이다.
- DispatcherServlet 이전 단계에서 모든 요청을 가로채서 전처리/후처리 가능.
- Spring MVC에 종속되지 않고, 톰캣/JEUS 등 Servlet 컨테이너 레벨에서 동작한다.
적용 시점
Client → Filter → DispatcherServlet → Controller → View
즉, Controller 진입 전에 실행된다.
주요 용도
- 인코딩 처리(CharactorEncodingFilter)
- 인증/권한 체크 (세션/토큰 확인)
- XSS, CORS, 로깅 등 전역적인 요청 처리
설정 예시 (web.xml)
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
코드 예시
public class AuthCheckFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpSession session = request.getSession(false);
if (session == null || session.getAttribute("USER") == null) {
((HttpServletResponse) res).sendRedirect("/login.do");
return;
}
chain.doFilter(req, res); // 다음 Filter 또는 DispatcherServlet으로 이동
}
}
3. Interceptor (org.springframework.web.servlet.HandlerInterceptor)
개념
- Spring MVC 전용 요청 가로채기 기능
- DispatcherServlet 이후 단계에서 동작
- Spring Context 내에서 동작함으로, 빈 주입(@Autowired)이 가능하다.
적용 시점
Client → Filter → DispatcherServlet → Interceptor → Controller
↑ ↓
(preHandle) (postHandle / afterCompletion)
주요 용도
- Controller 호출 전 사용자 인증 / 권한 검사
- Controller 실행 후 Model 데이터 가공
- View 렌더링 후 로깅, 성능 측정
설정 예시 (spring-mvc.xml)
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="egovframework.example.common.interceptor.AuthInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
코드 예시
public class AuthInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
HttpSession session = request.getSession(false);
if (session == null || session.getAttribute("USER") == null) {
response.sendRedirect("/login.do");
return false; // Controller 진입 차단
}
return true;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView) throws Exception {
// Controller 실행 후 로직
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex) throws Exception {
// View 렌더링 후 로직
}
}
4. 주요 차이점 비교
| 구분 | Filter | Interceptor |
| 소속 | Servlet (javax.servlet) | Spring MVC |
| 적용 위치 | DispatcherServlet 이전 | DispatcherServlet 이후 |
| 주요 용도 | 인코딩, 로깅, 보안, CORS 등 전역 처리 | 로그인 세션, 권한, 로직 공통화 |
| 설정 위치 | web.xml | spring-mvc.xml |
| DI 지원 여부 | X (Spring Bean 주입 불가) | O (@Autowired 가능) |
| 실행 메서드 | doFilter() | preHandle(), postHandle(), afterCompletion() |
| 적용 범위 | 애플리케이션 전체 (모든 요청) | Spring MVC 컨트롤러 영역 한정 |
5. 함께 사용하는 구조
대부분의 프로젝트에서는 Filter → Interceptor 병행 사용이 일반적이다.
| 계층 | 역할 | 예시 |
| Filter | 모든 요청에 대한 전처리 (인코딩, CORS, XSS 등) | CharacterEncodingFilter, LoggingFilter |
| Interceptor | Controller 진입 전후 처리 (로그인, 권한, 세션 관리 등) | AuthInterceptor, MenuAccessInterceptor |
예시 흐름도:
Client
↓
Filter (인코딩, 로깅)
↓
DispatcherServlet
↓
Interceptor (세션 검사, 공통 데이터 주입)
↓
Controller
↓
Service / DAO
↓
View(JSP)
6. 정리
- Filter는 Servlet 레벨의 요청 흐름 제어기
- Interceptor는 Spring MVC 레벨의 컨트롤러 전후 후킹 포인트
따라서,
전역 정책이나 보안/인코딩 은 Filter로,
비즈니스 로직 관련 공통 처리는 Interceptor로 관리하는 것이 이상적이다.
728x90
반응형
'Java > Spring' 카테고리의 다른 글
| [Spring] Spring Framework vs Spring Boot 비교 정리 (0) | 2025.10.29 |
|---|---|
| [Spring] 자주 사용하는 어노테이션 정리 및 예시 (0) | 2025.10.28 |
| [Spring] 순서 의존 AOP로 인해 파라미터 순서만 바꿔도 코드가 동작하지 않은 이유 (0) | 2025.10.21 |