Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

임도현의 성장

Spring-Boot Interceptor 본문

Spring Boot

Spring-Boot Interceptor

림도현 2024. 7. 26. 21:28
인터셉터 Interceptor 란?

스프링 인터셉터는 스프링 MVC가 제공하는 기술이다
스프링부트에서 인터셉터는 웹 애플리케이션에서 요청과 응답을 처리하는 중간 단계에서 사용된다.
인터셉터는 특정 URI 패턴에 대한 요청을 가로채어, 컨트롤러가 처리하기 전후에
추가적인 작업을 더욱 효율적으로 할 수 있게 해 준다.

1. 스프링 인터셉터 흐름

  • 스프링 인터셉터는 디스패처 서블릿과 컨트롤러 사이에서 컨트롤러 호출 직전에 호출 된다.
HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터 -> 컨트롤러
  • 스프링 인터셉터는 체인으로 구성되는데, 중간에 인터셉터를 자유롭게 추가할 수 있다. 예를 들어서 로그를 남기는 인터 셉터를 먼저 적용하고, 그 다음에 로그인 여부를 체크하는 인터셉터를 만들 수 있다.
HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 인터셉터1 -> 인터셉터2 -> 컨트롤러

 


2. HandlerInterceptor 추상 메서드

  • HandlerInterceptor 로 들어가보면 추상 메서드를 포함하고 있다.
  • preHandle : 컨트롤러 호출 전에 호출된다.
  • postHandle : 컨트롤러 호출 후에 호출된다. 컨트롤러에서 예외가 발생하면 postHandle 은 호출되지 않는다.
  • afterCompletion : 뷰가 렌더링 된 이휴에 호출된다.
public interface HandlerInterceptor {
    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }

    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }

    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }
}

 


3. HandlerInterceptor 인터페이스 구현

나는 로그인 여부를 체크하는 인터셉터를 만들기 위해 preHandle 만 사용하였다.
  • 세션이 비어있거나 로그인이 되어있지 않으면 로그인 뷰로 Reditect 하기로 했다.
@Slf4j
public class LoginCheckInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String requestURI = request.getRequestURI(); // 어디 URI로 왔는지
        log.info("인증 체크 인터셉터 실행 {}", requestURI);

        HttpSession session = request.getSession(false);

        if (session == null || session.getAttribute(SessionConst.LOGIN_MEMBER) == null) {
            log.info("미인증 사용자 요청");
            //로그인으로 redirect
            response.sendRedirect("/login?redirectURL=" + requestURI);
            return false; //false == 진행X
        }

        return true; // true == 정상 호출 다음 인터셉터나 컨트롤러가 호출된다.
    }
}

 


4. WebConfig 인터셉터 등록

WebMvcConfigurer 가 제공하는 addInterceptors() 를 사용해서 인터셉터를 등록할 수 있다.

  • registry.addInterceptor(new LogInterceptor()) : 인터셉터를 등록한다.
  • order(1) : 인터셉터의 호출 순서를 지정한다. 낮을 수록 먼저 호출된다.
  • addPathPatterns("/**") : 인터셉터를 적용할 URL 패턴을 지정한다.
  • excludePathPatterns("/css/**", "/*.ico", "/error") : 인터셉터에서 제외할 패턴을 지정한다.
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
	registry.addInterceptor(new LoginCheckInterceptor()) // 로그인 인중 체크
                .order(1)
                .addPathPatterns("/**")
                .excludePathPatterns(
                        "/", "/members/add", "/login", "/logout",
                        "/css/**", "/*.ico", "/error",  "/error-page/**"
                );
    }

}

 


5. 실행

실행을 시켜보면 URL이 로그인 뷰로 Reditect하는 것을 알 수 있다.

http://localhost:8008/login?redirectURL=/file/items/new

 

참고 자료

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 참고


 

'Spring Boot' 카테고리의 다른 글

Spring Data JPA + Query Dsl JPA  (2) 2024.09.07
Spring-Boot H2 데이터베이스 설정과 연결  (1) 2024.09.02
Spring-Boot MyBatis  (0) 2024.09.01
Spring-Boot Cookie Session  (1) 2024.08.13
Spring-Boot Bean validationn  (0) 2024.07.25