Spring Interceptor 호출 시기

성현·2024년 6월 28일
0

Spring Interceptor

목록 보기
3/3
post-custom-banner

인터페이스 호출 시기


내가 알고있는 대략적인 프론트 컨트롤러 형태이다.
1. handlermapping에서 컨트롤러를 찾고
2. handleradapter에서 해당 컨트롤러의 어뎁터를 찾는다.
3. 어뎁터에서 argument resolver를 통해 Http 데이터를 적절한 객체로 변환하고
4. controller에서 요청 처리 후
5. return value handler에서 적절하게 뷰로 반환하거나 Http message body로 반환하는 식이다.

여기 도대체 어느부분에서 Interceptor가 진행되는걸까?

수행할 handler 결정 이후 , Handler 수행 전/후에서 수행된다.
adapter에서 반환된 View도 Interceptor에서 처리할 수 있다.

[동작 순서]
1. HandlerMapping 할당
2. HandlerAdapter 할당
3. Interceptor의 preHandle 수행
4. HandlerAdapter 수행 -> 컨트롤러
5. Interceptor의 PostHandle 수행
6. View 렌더링
7. Interceptor의 afterCompletion 수행

단, 예외의 경우 postHandle은 타지 않으며 afterCompletion에서 exception을 인자로 받아 처리할 수 있다.
또한 Interceptor가 여러개일 경우 pre-post는 열리고 닫힌 순서대로 진행한다.
ex) interceptor 1 pre -> interceptor 2 pre -> handler -> interceptor 2 post -> interceptor 1 post

인터페이스 등록

WebMvcConfigurer 는 Spring mvc를 설정할 수 있게해준다. 해당 인터페이스를 구현하고 addInterceptors메소드를 통해 인터페이스를 등록할 수 있다.
이 addInterceptors는 파라미터로 InterceptorRegistry를 받는데,

InterceptorRegistry는 InterceptorRegistration 을 가공한다.

InterceptorRegistration에서는 내가 구현해서 등록한 인터페이스를 물고있다. 이 클래스를 보면 인터페이스들의 순서, 인터페이스를 안타는 Path 패턴 등 인터페이스 수행 관련하여 많은 제약을 담당한다.

final로 선언어 주입되는 HandlerInterceptor가 보이는가?
어디서 많이 보지 않았나
우리가 구현한 HandlerInterceptor인터페이스이다.
부모 클래스 = new 자식();

자바의 원칙 중 하나인 리스코프원칙(자식은 부모를 대체할 수 있다.) 으로 구현되어있다.
이렇게 스프링을 파다보면 자바를 얼마나 알차게 사용했는지 배울수있다.

profile
행동하는 사람
post-custom-banner

0개의 댓글