콘텐츠로 이동

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면 실행 X
      • postHandle, afterCompletion : 실행 후에 추가적으로 공통된 처리를 하고 싶을 때 사용
  • Interceptor의 사용
    • 적용하고자 하는 url을 직접 추가해줌으로써 구현
    • 사용자가 올바른 유저인지 관리자인지, 작성자인지에 따라 요청을 실행할 수 있는지 검증한다면, Interceptor를 통해 검증가능
  • Spring의 요청 처리 과정
    1. 요청 들어옴
    2. filter 작동
    3. DispatcherServlet에 전달
    4. HandlerMapping을 통해 요청 처리할 Controller 찾음
      • 이때 Controller 찾은게 Interceptor에 등록되어 있는 url이라면 Interceptor의 preHandle 발동
    5. DispatcherServlet은 Controller의 HandlerAdapter를 찾음
      • 이떄 Adapter를 찾고 ArgumentResolver 발동
    6. Controller 실행
      • Interceptor의 postHandle 발동
    7. DispatcherServlet은 실행한 결과 ViewResolver에 전달
    8. ViewResolver는 View에 전달
      • Interceptor의 afterCompletion 실행
    9. DispatcherServlet의 View로 부터 받은 정보 Client에게 전달
    10. 응답 반환