Spring/Spring MVC

핸들러 인터셉터

100win10 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 값을 주어서 우선순위를 변경할 수도 있고 특정 패턴에만 동작하는 형식도 가능하다.