2022 03 11
2022-03-11¶
Spring ArgumentResolver & Interceptor¶
- 참고: https://tecoble.techcourse.co.kr/post/2021-05-24-spring-interceptor/
- ArgumentResolver
- 요청이 컨트롤러에 들어오면, 요청에 들어온 값으로 부터 원하는 객체를 만들어내는 일
- ex. 사용자가 자신의 정보 조회/수정하는 경우 올바른 사용자 인가를 확인해야 함
- 토큰에 저장된 id 꺼내 LoginMember 객체 만드는 과정 필요
- 해당 코드가 없다면 Controller에서 지저분하게 검증을 다 해줘야 함
- ArgumentResolver의 사용
HandlerMethodArgumentResolver를 구현- 원하는 ArgumentResolver가 실행되길 원하는 Parameter 앞에 특정 어노테이션 생성해 붙임
-
해당 인터페이스를 구현해야 함
boolean supportsParameter(MethodParameter parameter); @Nullable Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception;supportsParameter: 요청 받은 메서드의 인자에 원하는 어노테이션이 붙어 있는지 확인, 그렇다면 true 반환resolveArgument:supportsParameter에서 true 받은 경우, Parameter 원하는 형태로 정보 바인딩하여 반환- 검증의 책임을 Controller에서 위임시킬 수 있다
- Interceptor
- Handler의 실행을 가로챔 => 그래서 HandlerInterceptor
HandlerInterceptor인터페이스를 구현하여 사용하자preHandle: 조건에 맞는지 boolean 반환해 true면 실행, false면 실행 XpostHandle,afterCompletion: 실행 후에 추가적으로 공통된 처리를 하고 싶을 때 사용
- Interceptor의 사용
- 적용하고자 하는 url을 직접 추가해줌으로써 구현
- 사용자가 올바른 유저인지 관리자인지, 작성자인지에 따라 요청을 실행할 수 있는지 검증한다면, Interceptor를 통해 검증가능
- Spring의 요청 처리 과정
- 요청 들어옴
- filter 작동
- DispatcherServlet에 전달
- HandlerMapping을 통해 요청 처리할 Controller 찾음
- 이때 Controller 찾은게 Interceptor에 등록되어 있는 url이라면 Interceptor의 preHandle 발동
- DispatcherServlet은 Controller의 HandlerAdapter를 찾음
- 이떄 Adapter를 찾고 ArgumentResolver 발동
- Controller 실행
- Interceptor의 postHandle 발동
- DispatcherServlet은 실행한 결과 ViewResolver에 전달
- ViewResolver는 View에 전달
- Interceptor의 afterCompletion 실행
- DispatcherServlet의 View로 부터 받은 정보 Client에게 전달
- 응답 반환