Spring Interceptor는 DispatcherServlet이 컨트롤러를 호출하기 전과 후에 요청을 가로채어 추가적인 처리를 수행할 수 있도록 해주는 기능입니다. 이는 Spring MVC에서 제공하는 기능으로, HandlerInterceptor 인터페이스를 구현하여 요청 전/후 처리, 공통 로직(예: 인증, 로깅, 권한 검사 등)을 쉽게 적용할 수 있습니다.
1. Spring Interceptor의 특징
• DispatcherServlet과 Controller 사이에서 동작하며, 요청을 가로챌 수 있음.
• 필터(Filter)와 유사하지만, Spring MVC에 특화되어 있음.
• 하나의 요청에 대해 여러 개의 인터셉터를 적용할 수 있음.
• 특정 URL 패턴에 대해서만 적용할 수 있음.
2. Spring Interceptor의 동작 흐름
Spring Interceptor는 다음 3가지 메서드를 통해 특정 시점에서 요청을 가로챌 수 있습니다.
✅ preHandle() (컨트롤러 실행 전)
• 클라이언트 요청을 가로채 컨트롤러 실행 전에 실행됨.
• 반환값이 true이면 다음 단계 진행, false이면 요청 종료.
• 주로 인증(Authentication), 권한(Authorization) 검사 등에 사용.
✅ postHandle() (컨트롤러 실행 후, 뷰 렌더링 전)
• 컨트롤러가 실행된 후 실행되며, 응답을 조작할 수 있음.
• 주로 모델 데이터 추가, 로그 기록 등에 사용.
✅ afterCompletion() (뷰 렌더링 후, 응답 완료 후)
• 요청 처리가 완료된 후 실행됨.
• 주로 리소스 정리, 예외 처리 로깅 등에 사용.
3. Spring Interceptor 구현 방법
Spring Interceptor를 구현하려면 HandlerInterceptor 인터페이스 또는 HandlerInterceptorAdapter 클래스를 상속받아 사용합니다.
✅ Interceptor 클래스 생성
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
// 컨트롤러 실행 전 (요청 전)
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle: 요청 처리 전 실행");
return true; // 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: 요청 완료 후 실행");
}
}
✅ Interceptor를 Spring에 등록
Interceptor를 사용하려면 WebMvcConfigurer를 구현하고 addInterceptors() 메서드에서 등록해야 합니다.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor)
.addPathPatterns("/api/**") // 특정 경로에 대해서만 인터셉터 적용
.excludePathPatterns("/api/login", "/api/public/**"); // 특정 경로 제외
}
}
4. Filter와 Interceptor의 차이점
비교 항목 | Filter | Interceptor |
적용 범위 | Servlet 레벨 | Spring MVC 레벨 |
동작 시점 | DispatcherServlet 이전 | DispatcherServlet 이후 (Controller 실행 전후) |
주요 목적 | 요청 및 응답 변형 (인코딩, 보안) | 요청/응답을 분석하고 컨트롤러 실행 전후 처리 |
사용 인터페이스 | javax.servlet.Filter | org.springframework.web.servlet.HandlerInterceptor |
Filter는 모든 요청을 처리할 수 있으며, 인증/보안 관련 작업을 처리하는 데 주로 사용됨.
Interceptor는 Spring MVC 내부의 요청 흐름을 제어하며, 특정 컨트롤러에 대한 전후 처리를 수행하는 데 유용함.
5. Interceptor 활용 예시
✅ 인증(Authentication) 및 권한(Authorization) 체크
✔️ 사용자가 특정 API를 호출할 때, 로그인 여부를 확인하고 권한이 없으면 차단.
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("Authorization");
if (token == null || !token.equals("VALID_TOKEN")) {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
return false;
}
return true;
}
✅ 로깅(Logging)
✔️ 요청 및 응답의 정보를 기록하여 디버깅 및 모니터링.
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("요청 URL: " + request.getRequestURL());
System.out.println("응답 상태 코드: " + response.getStatus());
}
✅ 특정 API 요청 제한
✔️ 예를 들어, /admin/** 경로의 API는 관리자만 접근하도록 설정.
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String userRole = (String) request.getSession().getAttribute("USER_ROLE");
if (request.getRequestURI().startsWith("/admin") && !"ADMIN".equals(userRole)) {
response.sendError(HttpServletResponse.SC_FORBIDDEN, "Forbidden");
return false;
}
return true;
}
• Spring Interceptor는 요청을 가로채 전후 처리를 수행하는 기능으로, 인증, 로깅, 권한 검사 등에 활용됨.
• HandlerInterceptor 인터페이스의 preHandle(), postHandle(), afterCompletion()을 구현하여 사용.
• WebMvcConfigurer에서 addInterceptors() 메서드를 사용하여 등록.
• Filter와 유사하지만, Spring MVC 내부에서 동작하며 컨트롤러 실행 전후에 적용됨.
'IT > 기타' 카테고리의 다른 글
DBeaver로 Hive 서버에 접속하는 방법 (1) | 2025.03.21 |
---|---|
유튜브 알고리즘의 편향성과 그로 인한 문제점 (3) | 2025.03.18 |
Spring Framework에서 .do URL을 변경하는 방법 (3) | 2025.03.17 |
Spring 기반 API를 WAS에서 분리하여 독립 운영하는 방법 (3) | 2025.03.17 |
Spring Boot API 관리 솔루션 추천: API Gateway, 모니터링, 배포 자동화까지 (2) | 2025.03.17 |