Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

[로그인] 스프링 인터셉터 본문

인프런/[인프런] 스프링 MVC 2

[로그인] 스프링 인터셉터

Seung__ 2021. 9. 26. 23:05
  • 스프링 인터셉터는 서블릿 필터와 같이 웹과 관련된 공통 관심 사항을 효과적으로 해결할 수 있는 기술
  • 해당 기능을 Servlet이 제공하면 ServletFilter,
  • Spring MVC가 제공하는 것은 Spring Iterceptor
  • 웹과 관련된 공통 관심 사항을 처리하지만, 적용되는 순서와 범위, 그리고 사용방법이 다름.

 

1. Spring Interceptor 흐름


HTTP 요청 -> WAS -> Filter -> DispatcherServlet -> Spring Interceptor -> Controller
  • Spring Interceptor는 Dispatchet Servlet과 컨트롤러 사이에서 컨트롤러 호출 직전에 호출 된다.
  • Spring Interceptor는 Spring MVC가 제공하는 기능이기 때문에 결국 Dispatchet Servlet 이후에 등장하게 된다.
  • (Spring MVC의 시작점이 Dispatchet Servlet이라고 생각해보면 이해가 될 것이다.)
  • Spring Interceptor에도 URL 패턴을 적용할 수 있음. Servlet URL 패턴과는 다르고, 매우 정밀하게 설정 가능

 

 

2. Spring Interceptor의 제한 기능


로그인 사용자 : HTTP 요청 -> WAS -> Filter -> Dispatcher Servlet -> Spring Interceptor -> Controller
비 로그인 사용자 : HTTP 요청 -> WAS -> Filter -> Dispatcher -> Spring Interceptor 
(적절하지 않은 요청이라 판단, 컨트롤러 호출 X)
  • 인터셉터에서 적절하지 않은 요청이라고 판단하면 거기에서 끝을 낼 수도 있다. 
  • 로그인 여부를 체크하기에 용이함.

 

 

3. Spring interceptor interface


public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response,
			Object handler) throws Exception {}

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 {}
}
  • 서블릿 필터의 경우 단순하게 doFilter() 하나만 제공된다. 
  • Spring Interceptor는 단계별로 제공한다.
    • controller 호출 전 : preHandle
    • controller 호출 후 : postHandle 
    • 요청 완료 이후 : afterCompletion 
  • 서블릿 필터의 경우 단순히 request , response 만 제공했지만,
  • Spring Interceptor 는 어떤 컨트롤러( handler )가 호출되는지에 대한  호출 정보도 받을 수 있다.
  • 그리고 어떤 modelAndView 가 반환되는지 응답 정보도 받을 수 있음.

 

 

4. Interceptor 호출 흐름


  • preHandle : 컨트롤러 호출 전에 호출된다. (더 정확히는 핸들러 어댑터 호출 전에 호출.)
    • preHandle 의 응답값이 true 이면 다음으로 진행하고, false 이면 더는 진행하지 않는다
    • false  인 경우 나머지 인터셉터는 물론이고, 핸들러 어댑터도 호출되지 않는다. 
    • 그림에서 1번에서 끝!!
  • postHandle : 컨트롤러 호출 후에 호출된다. (더 정확히는 핸들러 어댑터 호출 후에 호출된다.)
  • afterCompletion : 뷰가 렌더링 된 이후에 호출된다.

 

5. Interceptor 예외 상황


  • preHandle : 컨트롤러 호출 전에 호출된다.
  • postHandle : 컨트롤러에서 예외가 발생하면 postHandle 은 호출되지 않는다.
  • afterCompletion : afterCompletion 은 항상 호출된다. 
    • 이 경우 예외( ex )를 파라미터로 받아서 어떤 예외가 발생했는지 로그로 출력할 수 있다.
  • afterCompletion은 예외가 발생해도 호출된다.
    • 예외가 발생하면 postHandle() 는 호출되지 않으므로 예외와 무관하게 공통 처리를 하려면
    • afterCompletion() 을 사용해야 한다.
    • 예외가 발생하면 afterCompletion() 에 예외 정보( ex )를 포함해서 호출된다.

 

6. 정리


Spring Interceptor는 Spring MVC구조에 특화된 필터 기능을 제공!!!!!!

특별하게 Filter를 사용하는 상황이 아니면 SpringInterceptor를 사용하자. 더 좋아!.

Comments