일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 17144번
- 미세먼지 안녕!
- 백준 알고리즘
- python
- 19238번
- SW Expert Academy
- 16234번
- 2020 카카오 인턴십
- 빛의 경로 사이클
- 파이썬
- 9095번
- 베스트엘범
- 14499번
- 스타트 택시
- SW ExpertAcademy
- 15686번
- 키패드 누르기
- QueryDSL 기초
- 1789번
- pkce
- 1038번
- HTML 기초
- 프로그래머스
- 경주로 건설
- 보석 쇼핑
- 12869번
- 감소하는 수
- 수식 최대화
- 거울 설치
- 12865번
- Today
- Total
보물창고 블로그
Spring Interceptor 파헤치기 본문
Spring Interceptor에 대해 알아보겠습니다.
✅ 인터셉터란?
HTTP 요청이 컨트롤러(Handler)로 도달하기 전과 후에 실행되는 객체
스프링 MVC가 제공하는 기능이며, 공통 처리 로직을 삽입할 수 있습니다.
주로 인증/인가 처리나 로깅/모니터링 처리, 요청 헤더 검사에 사용합니다.
✅ 인터셉터 호출 흐름
스프링 인터셉터 호출의 흐름도 입니다.
1
✅ 인터셉터 구조
인터셉터는 HandlerInterceptor 인터페이스를 구현하여 작성합니다.
@Component
public class MyInterceptor implements HandlerInterceptor {
// 컨트롤러 실행 전에 호출
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("preHandle 실행");
return true; // false면 요청 중단
}
// 컨트롤러 실행 후, 뷰 렌더링 전에 호출
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle 실행");
}
// 뷰 렌더링 완료 후 호출 (예외 포함해서 모든 상황)
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion 실행");
}
}
- preHandle : 컨트롤러 호출 전에 호출됩니다. (더 정확히는 핸들러 어댑터 호출 전에 호출됩니다.)
- preHandle의 응답값이 `true` 이면 다음으로 진행하고, `false` 이면 더는 진행하지 않습니다. `false` 인
- 경우 나머지 인터셉터는 물론이고, 핸들러 어댑터도 호출되지 않습니다.
- postHandle : 컨트롤러 호출 후에 호출됩니다. (더 정확히는 핸들러 어댑터 호출 후에 호출됩니다.)
- afterCompletion : 뷰가 렌더링 된 이후에 호출됩니다.
서블릿 필터의 경우 단순하게 `doFilter()` 하나만 제공됩니다. 반면에 인터셉터는 컨트롤러 호출 전(`preHandle` ), 호출 후(`postHandle` ), 요청 완료 이후(`afterCompletion` )와 같이 단계적으로 잘 세분화 되어 있습니다.
서블릿 필터의 경우 단순히 `request` , `response` 만 제공했지만, 인터셉터는 어떤 컨트롤러(`handler` )가 호출되는지 호출 정보도 받을 수 있습니다. 그리고 어떤 `modelAndView` 가 반환되는지 응답 정보도 받을 수 있습니다.
다음으로는 인터셉터를 스프링 빈에 등록하는 방법에 대해서 알아보겠습니다.
WebMvcConfigurer에서 등록
@Configuration
public class WebConfig implements WebMvcConfigurer {
private final MyInterceptor myInterceptor;
// 생성자 주입
public WebConfig(MyInterceptor myInterceptor) {
this.myInterceptor = myInterceptor;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor)
.addPathPatterns("/api/**") // 적용 경로
.excludePathPatterns("/api/public/**"); // 제외 경로
}
}
.addPathPatterns, .excludePathPatterns 메서드를 사용하여 적용할 url , 제외할 url 경로를 설정할 수 있습니다.
다음으로 스프링 인터셉터 예외에 대해 알아보겠습니다.
예외가 발생시
- `preHandle` : 컨트롤러 호출 전에 호출됩니다.
- `postHandle` : 컨트롤러에서 예외가 발생하면 `postHandle` 은 호출되지 않습니다.
- `afterCompletion` : `afterCompletion` 은 항상 호출됩니다. 이 경우 예외(`ex` )를 파라미터로 받아서 어떤 예외가 발생했는지 로그로 출력할 수 있습니다. afterCompletion은 예외가 발생해도 호출됩니다. 예외가 발생하면 `postHandle()` 는 호출되지 않으므로 예외와 무관하게 공통 처리를 하려면 `afterCompletion()` 을 사용해야 합니다. 예외가 발생하면 `afterCompletion()` 에 예외 정보(`ex` )를 포함해서 호출됩니다.
정리해보자면, 인터셉터는 스프링 MVC 구조에 특화된 필터 기능을 제공한다고 이해하면 됩니다. 스프링 MVC를 사용하고, 특별히 필터를 꼭 사용해야 하는 상황이 아니라면 인터셉터를 사용하는 것이 더 편리합니다.
1. [스프링 공식 문서 - HandlerInterceptor]
(https://docs.spring.io/springframework/docs/current/javadocapi/org/springframework/web/servlet/HandlerInterceptor.html)
2. [스프링 MVC 2편- 백엔드 웹 개발 활용 기술](https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2)
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 강의 | 김영한 - 인프런
김영한 | , 원리를 알아야 핵심이 보인다!김영한의 스프링 MVC 활용편 👨💻 📌 수강 전 확인해주세요! 본 강의는 자바 스프링 완전 정복 시리즈의 다섯 번째 강의입니다. 우아한형제들 최연소
www.inflearn.com
'웹 개발 > Computer Science Note' 카테고리의 다른 글
CORS(Cross-Origin Resource Sharing) 파헤치기 (1) | 2025.05.18 |
---|---|
Spring filter 파헤치기 (0) | 2025.05.10 |
JWT 파해치기 (0) | 2025.05.03 |
Oauth 파헤치기 (1) | 2025.05.02 |