경제학도의 개발공간
[20180501]HandlerInterceptor 본문
HandlerInterceptor
HandlerIntercetor는 특정 컨트롤러에 종속되는 것이 아닌, 여러 컨트롤러에 종속적으로 적용되는 기능들을 중복되는 코드없이 적용 가능하도록 도와주는 인터페이스이다. 이와 비슷한 개념으로 Filter와 AOP도 있다.
HandlerIntercetor에 대해 구체적으로 알아보기 전에 이 세가지 방법들의 차이점에 대해 간략히 알아보자.
HandlerIntercetor , Filter, AOP의 차이
위 그림을 보면 필터와 인터셉터의 차이를 구분할 수가 있다. 작업처리를 위해 컨트롤러가 실행되기 전에 사용한다는 점에서 별반 차이가 없어보이지만 흐름을 보면 명확히 호출되는 시점이 다르다. 실행되는 메서드를 기준으로 다시 설명해보자면, 서버를 실행시켜 서블릿이 올라오는 동안 init이 실행되고, 그후 doFilter가 실행된다. 그후 컨트롤러에 들어가기 전에 preHandler가 실행된다. AOP가 실행된 후에 컨트롤러에서 나와 postHandler, after Completion, doFilter순서로대로 진행되고 destroy가 실행된다.
Interceptor
Filter
AOP
실행 위치
서블릿
서블릿
메소드
실행 순서
2
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활용 시점과 메소드
- 컨트롤러 실행 전
- preHandlerboolean 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 클라이언트에 뷰를 전송한 뒤에 실행된다. 만약 컨트롤러에서 Exception이 발생하지 않을 경우 해당함수의 4번째 파라미터(Exception ex)가 null이 된다. 따라서 컨트롤러 실행 이후에 발생한 Exception을 로그로 남기거나 실행 시간을 기롣하는 등의 후처리를 하기에 적합한 메소드이다.void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,Exception ex)throws Exception;
인터셉터 클래스를 작성하려면 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 |