반응형
Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |
Tags
- 자바문법
- 정규식
- js
- Array
- 인텔리제이
- IntelliJ
- input
- html
- 스프링부트
- Visual Studio Code
- vscode
- 테스트자동화
- ArrayList
- list
- CSS
- junit
- Java
- HashMap
- java테스트
- javascript
- 자바스크립트
- string
- Eclipse
- junit5
- 배열
- 문자열
- 자바
- math
- SpringBoot
- 단위테스트
Archives
- Today
- Total
어제 오늘 내일
[Spring Boot] "누구냐 넌?" 요청을 가로채는 두 명의 문지기: Filter vs Interceptor 차이점 본문
IT/SpringBoot
[Spring Boot] "누구냐 넌?" 요청을 가로채는 두 명의 문지기: Filter vs Interceptor 차이점
hi.anna 2026. 3. 16. 01:38
웹 개발을 하다 보면 "모든 요청에 대해 로그를 남겨라", "로그인 안 한 사용자는 튕겨내라" 같은 요구사항을 받게 됩니다.
이걸 모든 컨트롤러 메서드에 복사-붙여넣기 하실 건가요? 절대 아니죠.
스프링 부트에는 요청을 중간에 가로채서 처리하는 강력한 도구 두 가지가 있습니다. 바로 필터(Filter)와 인터셉터(Interceptor)입니다. 둘 다 비슷해 보이지만, 활동 구역과 권한이 완전히 다릅니다.
1. 웹 컨테이너의 문지기: 필터 (Filter)
필터는 스프링(Spring) 영역 밖, 즉 웹 컨테이너(Tomcat) 영역에서 동작합니다.
- 위치: 요청이 DispatcherServlet에 도착하기도 전에 가장 먼저 실행됩니다.
- 특징: 스프링과 무관한, 날것 그대로의 HTTP 요청/응답을 조작할 수 있습니다.
- 주요 용도:
- 인코딩 변환 (UTF-8 등)
- XSS(Cross Site Scripting) 방어
- CORS 설정 (다른 도메인 요청 허용)
- 보안 인증 (Spring Security가 Filter 기반입니다!)
구현 방법 ()
@Component
public class LogFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("1. [Filter] 요청 들어옴! 검문 검색 시작");
// 다음 필터나 서블릿으로 요청을 넘김 (이거 안 하면 요청이 여기서 죽음!)
chain.doFilter(request, response);
System.out.println("4. [Filter] 응답 나감! 뒤처리 완료");
}
}
2. 스프링의 비서: 인터셉터 (Interceptor)
인터셉터는 스프링 컨테이너 안에서 동작합니다. DispatcherServlet이 컨트롤러를 호출하기 직전과 직후에 끼어듭니다.
- 위치: DispatcherServlet -> Interceptor -> Controller
- 특징: 스프링의 모든 빈(Bean)에 접근할 수 있고, 어떤 컨트롤러(Handler)가 실행될지 정보를 알 수 있습니다.
- 주요 용도:
- 로그인 체크 (세션 검사)
- 권한 체크 (관리자 여부)
- 컨트롤러 실행 시간 측정
- API 호출 로그 남기기
구현 방법 ()
@Component
public class LoginInterceptor implements HandlerInterceptor {
// 컨트롤러 실행 전 (가장 많이 씀)
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("2. [Interceptor] 컨트롤러 실행 직전!");
// true: 다음 단계로 진행, false: 여기서 요청 끝!
return true;
}
// 컨트롤러 실행 후 (뷰 렌더링 전)
@Override
public void postHandle(...) {
System.out.println("3. [Interceptor] 컨트롤러 실행 후 (예외 발생하면 실행 안 됨)");
}
}주의: 인터셉터는 만들고 나서 꼭
WebMvcConfigurer에 등록해 줘야 작동합니다!
3. 한눈에 보는 비교표 (면접 필수!)
| 구분 | 필터(Filter) | 인터셉터(Interceptor) |
| 관리자 | 웹 컨테이너 (Tomcat) | 스프링 컨테이너 (Spring) |
| 실행 시점 | DispatcherServlet 전 | DispatcherServlet 후, Controller 전 |
| 조작 대상 | ServletRequest, ServletResponse |
HttpServletRequest, Object handler (메서드 정보) |
| 스프링 예외 | 처리 불가 (톰캣까지만 감) | @ControllerAdvice로 처리 가능 |
| 사용 예시 | 인코딩, 보안(Security), CORS | 로그인 체크, 권한, 로그, 실행 시간 |
4. 핵심 정리: 언제 뭘 써야 할까요?
- "스프링과 상관없이 전역적으로 처리해야 해!"
👉 Filter를 쓰세요. (예: 들어오는 모든 요청을 UTF-8로 바꾸기, 이미지 파일 압축하기) - "컨트롤러가 뭔지 알아야 하고, 로그인된 사용자 정보(Bean)가 필요해!"
👉 Interceptor를 쓰세요. (예: "이 API는 관리자만 쓸 수 있어", "이 메서드 실행하는 데 3초 걸렸네?")
마치며
오늘의 결론입니다.
- 요청의 흐름: Client -> Filter -> DispatcherServlet -> Interceptor -> Controller
- 단순한 HTTP 조작은 Filter, 비즈니스 로직과 관련된 처리는 Interceptor.
- 스프링 시큐리티(Spring Security)는 Filter 기반으로 동작한다.
이제 여러분의 서버에는 든든한 문지기 두 명이 생겼습니다! 안심하고 비즈니스 로직 개발에 집중하세요.
다음 포스팅에서는 이 두 문지기로도 해결하기 힘든 "메서드 사이사이에 숨은 중복 코드를 제거하는 마법" AOP(Aspect Oriented Programming)에 대해 알아보겠습니다.
도움이 되셨다면 좋아요와 댓글 부탁드립니다! 😊
반응형
'IT > SpringBoot' 카테고리의 다른 글
| [Spring Boot] "톰캣 설치 안 해요?" 실행 가능한 Jar (Fat Jar) 만들기 & 배포하기 (Gradle) (0) | 2026.03.17 |
|---|---|
| [Spring Boot] "복사-붙여넣기 멈춰!" AOP로 중복 코드 싹둑 자르기 (feat. 실행 시간 측정) (1) | 2026.03.16 |
| [Spring Boot] "API 명세서, 엑셀로 쓰세요?" Swagger vs REST Docs 승자는? (0) | 2026.03.15 |
| [Spring Boot] "가짜는 가라!" 실제 DB와 붙여보는 통합 테스트 (@SpringBootTest & H2) (0) | 2026.03.15 |
| [Spring Boot] "테스트 없는 배포는 도박이다!" JUnit5 & Mockito 단위 테스트 입문 (0) | 2026.03.14 |
Comments
