웹 애플리케이션 개발 시 요청의 전처리 및 후처리 작업을 효율적으로 처리하는 방법을 이해하는 것은 매우 중요하다. 이러한 작업을 수행하기 위해 Spring에서는 HandlerInterceptor 인터페이스를 제공한다.
1. Interceptor란?
Interceptor는 클라이언트의 요청을 컨트롤러가 처리하기 전과 후에 특정 작업을 수행할 수 있도록 도와주는 컴포넌트이다. 이는 요청 처리의 흐름을 제어하거나 추가적인 로직을 삽입하는 데 유용하다. 예를 들어, 사용자의 인증 상태를 확인하거나, 요청의 로깅을 처리하는 작업에 활용할 수 있다.
Interceptor는 Filter와 유사한 역할을 하지만, Spring MVC의 DispatcherServlet과 연동되어 동작하는 것이 특징이다. 이를 통해 특정 컨트롤러나 요청에 대해 정교하게 동작할 수 있다.
2. Interceptor의 주요 메서드
HandlerInterceptor
인터페이스에는 다음과 같은 세 가지 주요 메서드가 있다.
preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
- 컨트롤러가 호출되기 전에 실행된다.
- 여기서 인증/인가 여부를 확인하거나, 특정 조건을 만족하지 않을 경우 요청을 중단하고 응답을 반환할 수 있다.
postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
- 컨트롤러가 정상적으로 실행된 후, 뷰를 렌더링하기 전에 호출된다.
- 여기서 모델에 추가 데이터를 삽입하거나, 응답 데이터를 수정할 수 있다.
afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
- 뷰가 렌더링된 이후에 호출된다.
- 주로 요청 처리 후 리소스를 해제하거나 로깅을 수행하는 데 사용된다.
3. Interceptor 구현하기
Spring에서 Interceptor를 구현하려면 HandlerInterceptor
인터페이스를 구현하거나, HandlerInterceptorAdapter
클래스를 상속받아야 한다. 다음은 간단한 예제이다.
public class LoggingInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("[preHandle] 요청 URI: " + request.getRequestURI());
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] 요청 완료 후 실행");
}
}
4. Interceptor 등록하기
Interceptor를 사용하기 위해서는 Spring의 설정에 등록해야 한다. 이를 위해 WebMvcConfigurer
인터페이스를 구현하여 Interceptor를 추가한다.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoggingInterceptor())
.addPathPatterns("/api/**") // 특정 URL 패턴에만 Interceptor 적용
.excludePathPatterns("/api/login"); // 특정 URL 패턴 제외
}
}
위 예제에서 addInterceptors
메서드를 사용하여 LoggingInterceptor
를 등록하고, 특정 경로에만 Interceptor가 동작하도록 설정할 수 있다.
5. Interceptor의 활용 예
- 인증 및 인가: 요청이 컨트롤러에 도달하기 전에 사용자가 인증되었는지 확인하고, 인증되지 않았다면 로그인 페이지로 리다이렉트할 수 있다.
- 로깅 및 모니터링: 요청의 정보를 로깅하거나, 요청 처리 시간을 측정하여 성능을 모니터링할 수 있다.
- 데이터 가공: 컨트롤러가 반환하는 모델 데이터에 추가 정보를 삽입하거나, 특정 조건에 따라 데이터를 수정할 수 있다.
6. 결론
Interceptor는 Spring MVC에서 요청과 응답의 흐름을 제어하고, 공통적인 로직을 처리하는 데 매우 유용한 도구이다. 이를 통해 애플리케이션의 유지보수성을 높이고, 코드의 중복을 줄일 수 있다. 필터와 달리 Spring MVC의 컨트롤러와 밀접하게 연동되기 때문에, 특정 요청 경로에 대해 정교하게 동작하도록 설계할 수 있다.
'Programming > Spring \ Spring Boot' 카테고리의 다른 글
Spring Framework의 WebDataBinder 알아보기 (0) | 2024.12.04 |
---|