ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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>

    사용방법

    1. mvc:interceptors 선언
      • <mvc:interceptors>는 dispatcher-servlet.xml 파일에 정의됩니다.
      • 요청 경로와 이를 처리할 인터셉터를 매핑합니다.
    2. 인터셉터 클래스 생성
      • 인터셉터 클래스는 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> 태그에서 직접 선언합니다.

    활용 예

    1. 인증/권한 검증
      • 특정 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;
    }

    구성 요소의 흐름

    인터셉터는 다음과 같은 요청 처리의 주요 단계에 개입합니다:

    1. preHandle
      • 컨트롤러 실행 전에 호출.
      • 인증, 요청 데이터 검증 등 선처리 로직을 실행.
    2. postHandle
      • 컨트롤러가 실행된 후, View가 렌더링되기 전에 호출.
      • 응답 데이터를 조작하거나 공통 데이터를 추가 가능.
    3. afterCompletion
      • View가 렌더링된 후 호출.
      • 리소스 정리, 로그 작성, 예외 처리 등을 수행.

    장점

    • 재사용 가능: 여러 요청 경로에 대해 공통된 작업을 중앙에서 관리.
    • 유연성: 특정 요청을 제외하거나, 다중 인터셉터를 적용하여 순서를 제어할 수 있음.
    • 모듈화: 인증, 로깅, 데이터 검증 등의 비즈니스 로직을 컨트롤러와 분리.
    반응형

    댓글

Designed by Tistory.