-
Spring MVC - <mvc:interceptors> 사용법 및 설명Spring 2024. 12. 12. 14:50반응형
<mvc:interceptors> 사용법 및 설명
ex: mvc:interceptors
<mvc:interceptors> <!-- 모든 요청에 대해 MyInterceptor 적용 --> <mvc:interceptor> <mvc:mapping path="/**" /> <!-- 모든 경로에 대해 인터셉터 적용 --> <bean class="com.example.interceptor.MyInterceptor" /> </mvc:interceptor> <!-- 특정 경로만 인터셉터 실행 --> <mvc:interceptor> <mvc:mapping path="/secured/**" /> <!-- /secured/ 하위 URL에만 적용 --> <bean class="com.example.interceptor.SecureInterceptor" /> </mvc:interceptor> <!-- 특정 경로 제외 --> <mvc:interceptor> <mvc:mapping path="/**" /> <!-- 모든 경로 --> <mvc:exclude-mapping path="/public/**" /> <!-- /public/ 경로는 제외 --> <bean class="com.example.interceptor.LogInterceptor" /> </mvc:interceptor> </mvc:interceptors>
사용방법
- mvc:interceptors 선언
- <mvc:interceptors>는 dispatcher-servlet.xml 파일에 정의됩니다.
- 요청 경로와 이를 처리할 인터셉터를 매핑합니다.
- 인터셉터 클래스 생성
- 인터셉터 클래스는 HandlerInterceptor 인터페이스를 구현하거나 HandlerInterceptorAdapter를 확장하여 작성합니다.
package com.example.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("MyInterceptor: 요청 전에 실행"); return true; // true를 반환하면 요청 처리 계속 진행, false면 중단 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("MyInterceptor: 요청 후 처리"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("MyInterceptor: 요청 완료 후 실행"); } }
- 경로 매핑 설정
- <mvc:mapping>으로 인터셉터를 적용할 URL 경로를 지정합니다.
- <mvc:exclude-mapping>으로 특정 경로를 제외할 수도 있습니다.
- 빈 등록
- 인터셉터를 빈으로 등록하거나 <bean> 태그에서 직접 선언합니다.
활용 예
- 인증/권한 검증
- 특정 URL에 대한 접근 권한을 확인하여 인증되지 않은 사용자를 리다이렉트하거나 요청을 거부할 수 있습니다.
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader("Authorization"); if (token == null || !isValidToken(token)) { response.sendRedirect("/login"); return false; // 요청 중단 } return true; // 요청 진행 }
2. 로깅
- 요청 URL, HTTP 메서드, 처리 시간을 기록하여 디버깅 및 모니터링에 활용할 수 있습니다.
long startTime = System.currentTimeMillis(); request.setAttribute("startTime", startTime); @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { long startTime = (Long) request.getAttribute("startTime"); long endTime = System.currentTimeMillis(); System.out.println("요청 URL: " + request.getRequestURI() + " 처리 시간: " + (endTime - startTime) + "ms"); }
3. 공통 헤더 추가
- 모든 응답에 공통 헤더를 추가하거나, CORS 정책을 설정합니다.
@Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { response.setHeader("X-Application-Name", "MyApp"); }
4. 언어/로케일 설정
- 다국어 지원을 위해 요청에 따른 언어 및 로케일을 설정할 수 있습니다.
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String lang = request.getParameter("lang"); if (lang != null) { Locale locale = new Locale(lang); LocaleContextHolder.setLocale(locale); } return true; }
구성 요소의 흐름
인터셉터는 다음과 같은 요청 처리의 주요 단계에 개입합니다:
- preHandle
- 컨트롤러 실행 전에 호출.
- 인증, 요청 데이터 검증 등 선처리 로직을 실행.
- postHandle
- 컨트롤러가 실행된 후, View가 렌더링되기 전에 호출.
- 응답 데이터를 조작하거나 공통 데이터를 추가 가능.
- afterCompletion
- View가 렌더링된 후 호출.
- 리소스 정리, 로그 작성, 예외 처리 등을 수행.
장점
- 재사용 가능: 여러 요청 경로에 대해 공통된 작업을 중앙에서 관리.
- 유연성: 특정 요청을 제외하거나, 다중 인터셉터를 적용하여 순서를 제어할 수 있음.
- 모듈화: 인증, 로깅, 데이터 검증 등의 비즈니스 로직을 컨트롤러와 분리.
반응형'Spring' 카테고리의 다른 글
Spring - LogBack설정 (0) 2025.01.08 Spring - 스프링 서버 실행 흐름 및 설정 파일/어노테이션 실행 시점 (0) 2024.12.23 Vo 와 Dao 차이점 파헤치기 (0) 2024.12.03 초간단 SpringBoot DB데이터 Excel 다운로드 (0) 2024.10.25 SpringBoot 초간단 엑셀 다운로드 기능 구현(Apache POI) (0) 2024.10.25 - mvc:interceptors 선언