카테고리 없음

인터셉터 설정

최종군 2024. 10. 4. 21:45
  1. 요청 전 처리 (preHandle)
    • 클라이언트의 요청이 컨트롤러에 도달하기 전에 실행되는 메서드입니다.
    • 이 메서드에서 true를 반환하면 다음 처리(컨트롤러 메서드 실행)로 넘어가고, false를 반환하면 더 이상 요청 처리를 진행하지 않고 응답을 바로 반환합니다.
    • 주로 로그인 체크, 권한 확인 등의 작업을 수행합니다.
     
    @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 로그인 여부 확인 HttpSession session = request.getSession(); if (session.getAttribute("loginUser") == null) { response.sendRedirect("/login"); return false; // 요청 중단 } return true; // 요청 계속 처리 }
  2. 요청 후 처리 (postHandle)
    • 컨트롤러가 요청을 처리한 후, 뷰가 렌더링되기 전에 호출되는 메서드입니다.
    • 컨트롤러에서 반환된 **모델(Model)**이나 **뷰(View)**를 수정할 수 있습니다.
    • 예를 들어, 공통 데이터 추가, 응답 데이터 가공 등을 수행할 수 있습니다.
     
    @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 공통 데이터 추가 modelAndView.addObject("globalData", "This is common data for all views"); }
  3. 응답 완료 후 처리 (afterCompletion)
    • 뷰가 렌더링된 후에 실행되는 메서드입니다. 요청이 완전히 처리되고 난 후, 리소스 정리 등의 작업을 수행할 때 사용됩니다.
    • 예를 들어, 성능 로그 작성, 예외 처리 로깅, DB 연결 종료 등의 작업을 수행할 수 있습니다.
     
    @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 요청 처리 후 리소스 정리 System.out.println("Request completed"); }

인터셉터와 필터의 차이점

  • **필터(Filter)**는 서블릿 레벨에서 작동하고, **인터셉터(Interceptor)**는 Spring MVC에서 동작합니다.
  • 필터는 URL 패턴에 따라 동작하며, 요청과 응답 모두에 대해 전역적으로 적용됩니다.
  • 인터셉터는 Spring의 핸들러 실행 전에 동작하며, 컨트롤러 전후의 요청과 응답 흐름에 맞춰 더 세밀하게 동작합니다.

예시: 로그인 인터셉터

 
public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); if (session.getAttribute("loginUser") == null) { response.sendRedirect("/login"); return false; } return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 추가 로직 가능 } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 요청 완료 후 작업 가능 } }

이 인터셉터는 사용자가 로그인을 하지 않은 상태에서 특정 페이지에 접근하려고 할 때 로그인 페이지로 리다이렉트시키는 역할을 합니다. preHandle에서 로그인을 체크하고, 로그인 정보가 없으면 바로 응답을 중단합니다.

인터셉터 설정 방법

Spring 설정 파일(XML 또는 Java Config)에서 인터셉터를 설정할 수 있습니다.

 

XML 설정 예시:

 
<interceptors> <interceptor> <mapping path="/member/**"/> <beans:bean class="com.kh.spring.common.interceptor.LoginInterceptor" /> </interceptor> </interceptors>

Java Config 설정 예시:

 
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoginInterceptor()) .addPathPatterns("/member/**", "/board/enrollForm"); } }

인터셉터의 주요 용도

  • 로그인 및 인증 처리: 사용자가 특정 페이지에 접근하기 전에 로그인 여부를 확인합니다.
  • 권한 검증: 사용자가 해당 요청을 수행할 권한이 있는지 검증합니다.
  • 로깅 및 성능 모니터링: 요청과 응답 시간을 기록하거나, 요청에 대한 로그를 남깁니다.
  • 공통 데이터 처리: 여러 컨트롤러에서 공통으로 사용하는 데이터를 설정합니다.