내가 알고있는 대략적인 프론트 컨트롤러 형태이다.
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 자식();
자바의 원칙 중 하나인 리스코프원칙(자식은 부모를 대체할 수 있다.) 으로 구현되어있다.
이렇게 스프링을 파다보면 자바를 얼마나 알차게 사용했는지 배울수있다.