-
핸들러 인터셉터Spring/Spring MVC 2020. 4. 28. 00:28
어떤 핸들러의 요청처리 전 후로 부가적인 작업을 하고 싶다면 핸들러 인터셉터를 만들어서 사용할 수 있다.
이 핸들러는 hello에 대해 요청처리 후 뷰 렌더링이 되는 핸들러이다.
이 핸들러의 요청을 처리하기 전에 PreHandle 전처리 작업과
요청을 처리한 후 뷰 렌더링 처리 직전 postHandler 처리가 가능하다.
뷰 랜더링 까지 완전히 끝난 이후에도 afterCompletion 으로 전후 처리의 템플릿을 제공하고 있다.
* 서블릿 필터와 비슷하지만 좀 더 구체적인 것 같다.
핸들러 인터셉터는 preHandle시 true나 false를 return 하게 되는데 true 시 이 다음 핸들러가 쭉 진행되고
false 시 응답 처리를 끝내고 다음 핸들러로 가지말고 요청 처리를 끝내라는 것을 의미한다. afterCompletion
가지 않는다.
preHandle (true 시)=> 요청 처리 => postHandler => 뷰 랜더링 => afterCompletion
핸들러 인터셉터의 순서?
preHandle과 postHandler가 2개라면
preHandler1
preHandler2
.
.
postHandler2
postHandler1
.
.
afterCompletion 2
afterCompletion 1
다음과 같이 postHandler는 역순으로 호출이 된다. afterCompletiont은 뷰 랜더링이 완전히 끝난 다음에
호출이 되는데 RestController의 경우 뷰 랜더링 과정이 없으므로 postHandler 이후 바로 호출되게 된다.
핸들러 인터셉터 와 서블릿 필터의 차이?
핸들러 인터셉터의 템플릿이 더 구체적이다. ModelAndView와 핸들러 정보등 제공되는 것이 더 많다.
따라서 핸들러에 따라 특정 로직을 변경해야 한다면 핸들러 인터셉터를 구현해야 한다.
Spring MVC에 특화된 정보 : 핸들러 인터셉터 구현
일반적인 정보 : 서블릿 필터
핸들러 인터셉터 구현해보기
GreetingInterceptor와 AnotherInterceptor 2개의 핸들러 인터셉터를 만들어주었다.
두 클래스 모두 실제 핸들러 까지 처리할 수 있도록 preHandle을 true로 리턴해주었다.
preHandle은 handler의 정보를 참조할 수 있다.
postHandler는 modelAndview 정보를 수정할 수 있다.
afterCompletion은 어떤 핸들러가 처리했고 에러가 발생했는지 등을 Exception을 통해 확인 가능하다.
registry에 우리가 만든 인터셉터들을 등록한다.
이때 별다른 order가 없을 시 add 한 순서대로 먼저 적용이 된다.
이제 테스트를 만들어서 해당 get 메소드로 /hello 요청을 한다면 전처리 작업이 진행이 된다.
order 값을 주어서 우선순위를 변경할 수도 있고 특정 패턴에만 동작하는 형식도 가능하다.
'Spring > Spring MVC' 카테고리의 다른 글
WebMvcConfigurer 살펴보기 (0) 2020.05.31 Json 컨버터 (0) 2020.05.28 HTTP 메세지 컨버터와 String (0) 2020.05.28 리소스 핸들러 (0) 2020.05.02 Spring MVC Formatter 사용법 (0) 2020.04.21