경제학도의 개발공간

[20180501]HandlerInterceptor 본문

BackEnd/Spring

[20180501]HandlerInterceptor

reallifeliver 2018. 5. 1. 21:25
반응형

HandlerInterceptor


HandlerIntercetor는 특정 컨트롤러에 종속되는 것이 아닌, 여러 컨트롤러에 종속적으로 적용되는 기능들을 중복되는 코드없이 적용 가능하도록 도와주는 인터페이스이다. 이와 비슷한 개념으로 Filter와 AOP도 있다.


HandlerIntercetor에 대해 구체적으로 알아보기 전에 이 세가지 방법들의 차이점에 대해 간략히 알아보자. 


HandlerIntercetor , Filter, AOP의 차이






위 그림을 보면 필터와 인터셉터의 차이를 구분할 수가 있다. 작업처리를 위해 컨트롤러가 실행되기 전에 사용한다는 점에서 별반 차이가 없어보이지만 흐름을 보면 명확히 호출되는 시점이 다르다. 실행되는 메서드를 기준으로 다시 설명해보자면, 서버를 실행시켜 서블릿이 올라오는 동안 init이 실행되고, 그후 doFilter가 실행된다. 그후 컨트롤러에 들어가기 전에 preHandler가 실행된다. AOP가 실행된 후에 컨트롤러에서 나와 postHandler, after Completion, doFilter순서로대로 진행되고 destroy가 실행된다.



 

Interceptor

Filter 

AOP 

 실행 위치

서블릿

서블릿 

메소드  

 실행 순서

1(제일 먼저와 제일 나중)

 3

설정 위치 

xml or java 

web.xml 

 xml or java

실행 메소드

preHandler

postHandler

afterCompletion 

 init

dofilter

destroy

pointcut으로 @after, @before, @around등 위치를 지정하여 자유롭게 메소드 생성 가능





추가 : 


Filter
는 로우 레벨의 처리 로직을, HandlerInterceptor는 회원 인증 검사 등의 비즈니스 레벨의 처리 로직을 작성하는데 적합하다. 

출처: http://jsonobject.tistory.com/244 [지단로보트의 블로그]


HandlerInterceptor사용을 위한 xml설정



1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:context="http://www.springframework.org/schema/context"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
                          http://www.springframework.org/schema/beans/spring-beans.xsd
                          http://www.springframework.org/schema/context
                          http://www.springframework.org/schema/context/spring-context.xsd
                          http://www.springframework.org/schema/mvc
                          http://www.springframework.org/schema/mvc/spring-mvc.xsd"
      xmlns:mvc="http://www.springframework.org/schema/mvc">
cs






HandlerInterceptor의 활용




HandlerInterceptor활용 시점과 메소드


  • 컨트롤러 실행 전 

    • preHandler
      boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
      throws Exception;

      boolean타입을 return하며 false를 return할 경우 컨트롤러(혹은 다음 HandlerInterceptor)를 실행하지 않는다. preHandle() 메소드에서 false 를 리턴했을 경우에는 postHandle() 도 실행되지 않는다.

      handler 파라메터는 핸들러 매핑이 찾아 준 컨트롤러 빈 오브젝트다. 컨트롤러 실행 이전에 처리해야 할 작업이 있다거나, 요청정보를 가공하거나 추가하는 경우에 사용할 수 있다. 또는 요청에 요청에 대한 로그를 남기기 위해 사용하기도 한다. 

  • 컨트롤러 실핼 후, 뷰를 시작하기 전 

    • postHandler  

      void postHandle(
      HttpServletRequest request, HttpServletResponse response, Object handler,
      ModelAndView modelAndView)
      throws Exception;

      컨트롤러/핸들러가 정상적으로 실행된 이후에 추가 기능을 구현할 때 사용된다. 만약 컨트롤러에서 Exception이 발생하면 해당 메소드는 실행되지 않는다.

      이 메소드에는 컨트롤러가 돌려준 ModelAndView 타입의 정보가 제공되서 컨트롤러 작업 결과를 참조하거나 조작할 수 있다.

      출처: http://springsource.tistory.com/4 [Rednics Blog]

  • 뷰를 실행한 이후

    • afterCompletion

      void afterCompletion(
      HttpServletRequest request, HttpServletResponse response, Object handler,
      Exception ex)
      throws Exception;
       클라이언트에 뷰를 전송한 뒤에 실행된다. 만약 컨트롤러에서 Exception이 발생하지 않을 경우 해당함수의 4번째 파라미터(Exception ex)가 null이 된다. 따라서 컨트롤러 실행 이후에 발생한 Exception을 로그로 남기거나 실행 시간을 기롣하는 등의 후처리를 하기에 적합한 메소드이다.


핸들러 인터셉터는 하나 이상을 등록할 수 있다. preHandle() 은 인터셉터가 등록된 순서대로 실행된다. 반면에 postHandle() 과 afterCompletion() 은 preHandle() 이 실행된 순서와 반대로 실행된다.




HandlerInterceptor의 구현



인터셉터 클래스를 작성하려면 HandlerInterceptor 인터페이스를 구현해야 한다. 만약 전처리 또는 후처리만 하고자 할 경우 인터페이스의 모든 메써드를 구현하는 것은 번거롭다. 위와 같이 HandlerInterceptorAdapter 추상 클래스를 상속하면 원하는 메써드만 작성할 수 있어 편리하다.

출처: http://jsonobject.tistory.com/244 [지단로보트의 블로그]




참고 ! http://www.baeldung.com/spring-mvc-handlerinterceptor


https://www.mkyong.com/spring-mvc/spring-mvc-handler-interceptors-example/ >> 활용예시!!!!

반응형

'BackEnd > Spring' 카테고리의 다른 글

[20180503]Mybatis WIth Spring  (1) 2018.05.03
[20180503]Mybatis  (0) 2018.05.03
[20180425]AOP(Aspect Oriented Programming)  (0) 2018.05.02
[20180424]Spring_Annotation  (0) 2018.04.30
[20180426] Spring MVC  (0) 2018.04.30