-
스프링 인터셉터란(Interceptor)란? 인터셉터 적용해보기SPRING/Filter & Interceptor 2021. 10. 13. 23:14반응형
스프링 인터셉터란 사전적 의미로 가로채다는 의미가 있습니다.
이걸 스프링에 적목 시키면 인터셉터는 Controller에 들어오는 요청(HttpRequest), 응답(HttpResponse)를 가로채는 역할을 하는 객체입니다.
인터셉터는 이전 시간에 본 서블릿 필터와 같이 웹과 관련된 공통 관심 사항을 효과적으로 해결할 수 있는 기술입니다.
차이점 이라하면 서블릿 필터는 서블릿이 제공하는 기술이고, 스프링 인터셉터는 스프링 MVC가 제공하는 기술이고,
둘 다 웹과 관련된 공통 관심 사항을 처리하지만, 적용되는 순서와 범위, 그리고 사용법이 차이점이 있습니다.
인터셉터는 어떻게 적용되고, 사용되는지 알아보겠습니다.
스프링 인터셉터 흐름
HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터 -> 컨트롤러
• 스프링 인터셉터는 디스패처 서블릿과 컨트롤러 사이에서 컨트롤러 호출 직전에 호출된다.
• 스프링 인터셉터는 스프링 MVC가 제공하는 기능이기 때문에 결국 디스패처 서블릿 이후에 등장하게 된다.
• 스프링 인터셉터에도 URL 패턴을 적용할 수 있는데, 서블릿 URL 패턴과는 다르고, 매우 정밀하게 설정할
수 있다.스프링 인터셉터 제한
HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터 -> 컨트롤러 //로그인 사용자
HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터(적절하지 않은 요청이라 판단, 컨트롤러 호출 X) // 비 로그인 사용자인터셉터에서 적절하지 않은 요청이라고 판단하면 거기에서 끝을 낼 수도 있다.
스프링 인터셉터 체인
HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 인터셉터1 -> 인터셉터2 -> 컨트롤러
스프링 인터셉터는 필터와 마찬가지로 체인으로 구성할수있다.
예를 들어서 로그를 남기는 인터셉터를 먼저 적용하고, 그 다음에 로그인 여부를 체크하는 인터셉터를 만들 수 있다.
얼핏 이전시간에 살펴본 서블릿 필터와 비슷한 거 같지만 스프링 인터셉터는 필터보다 편리하고 더 정교하고 다양한 기능을 지원합니다.
인터셉터 사용을 위한 HandlerInterceptor 인터페이스 살펴보기
서블릿 필터는 doFilter() 하나만 제공이 되었지만 인터셉터는 컨트롤러 호출 전(preHandle), 호출 후(postHandle), 요청이 완료 후(afterCompletion)와 같이 단계적으로 세분화되어있다.
서블릿 필터의 경우 단순히 request, response 만 제공했지만, 인터셉터는 어떤 컨트롤러(hanlder)가 호출되었는지 정보를 받을 수 있고, 어떤 modelAndView가 반환되는지 응답 정보도 받을 수 있다.
스프링 인터셉터 정상 흐름과, 예외 발생 시 흐름 살펴보기
• preHandle : 컨트롤러 호출 전에 호출된다. (더 정확히는 핸들러 어댑터 호출 전에 호출된다.)
preHandle의 응답 값이 true 이면 다음으로 진행하고, false 이면 더는 진행하지 않는다.
false인 경우 나머지 인터셉터는 물론이고, 핸들러 어댑터도 호출되지 않는다.
그림에서 1번에서 끝이나 버린다.
• postHandle : 컨트롤러 호출 후에 호출된다. (더 정확히는 핸들러 어댑터 호출 후에 호출된다.)
• afterCompletion : 뷰가 렌더링 된 이후에 호출된다.• preHandle : 컨트롤러 호출 전에 호출된다.
• postHandle : 컨트롤러에서 예외가 발생하면 postHandle 은 호출되지 않는다.
• afterCompletion : afterCompletion 은 항상 호출된다. 이 경우 예외( ex )를 파라미터로 받아서 어떤
예외가 발생했는지 로그로 출력할 수 있다.WebConfig - 인터셉터 설정
• registry.addInterceptor(new LogInterceptor()) : 인터셉터를 등록한다.
• order(1) : 인터셉터의 호출 순서를 지정한다. 낮을수록 먼저 호출된다.
• addPathPatterns("/**") : 인터셉터를 적용할 URL 패턴을 지정한다.
• excludePathPatterns("/css/**", "/*.ico", "/error") : 인터셉터에서 제외할 패턴을 지정한다.필터와 비교해보면 인터셉터는 addPathPatterns , excludePathPatterns로 매우 정밀하게 URL
패턴을 지정할 수 있다.스프링이 제공하는 URL 경로는 서블릿 기술이 제공하는 URL 경로와 완전히 다르다. 더욱 자세하고,
세밀하게 설정할 수 있다.PathPattern 공식 문서
인터셉터 적용해보기(로그 남기기)
인터셉터를 사용하려면 앞에서 방금 앞에서 보셨던 HandlerInterceptor 인터페이스를 구현해야 합니다.
http://localhost:8080/ 접속 후 로그를 살펴보겠습니다.(메인 페이지)
서버가 실행되고, http://localhost:8080(메인 페이지)를 접속하였을 때 나오는 로그입니다.
21Line : 먼저 디스패처 서블릿이 초기회 된 다음 preHandle이 실행되는 것을 볼 수 있습니다.
preHandle 실행 후 Main GetMethod invoked(컨트롤러에서 찍은 로그) 실행
27Line : 컨트롤러 호출 후 postHandle 이 실행되는 것을 볼 수 있습니다.
32Line : 마지막으로 뷰가 렌더링 된 이후 찍히는 afterCompletion 이 순서대로 실행되는 것을 확인하실 수 있습니다.
간단하게 실행 흐름을 알아보았습니다.
이를 이용해 각각의 상황을 응용해보는 시간을 가져봅시다!!
참고 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2 (김영한님 스프링2편)
반응형'SPRING > Filter & Interceptor' 카테고리의 다른 글
서블릿 필터(Filter)란? 필터 적용해보기 (2) 2021.10.13