본문 바로가기

Spring/core

ArgumentResolver

ArgumentResolver 포스팅은 HandlerAdapter에 의존합니다.

 

목차

1. ArgumentResolver

2. ArgumentResolver가 처리할 수 있는 커스텀 애노테이션 만들기


ArgumentResolver : RequestMapping 메서드의 파라미터를 처리한다.

@RequestMapping 은 어떻게 @RequestBody 애노테이션을 인식할 수 있을까요? 그리고 HttpServletRequest 객체는 누가 넣어주는 것일까요? 이에 대한 해답은 ArgumentResolver에 있습니다.

 

 

잠깐 MVC 패턴의 요청/응답 구조를 봅시다. 클라이언트의 요청을 처리하는 4번 과정에서 ArgumentResolver가 동작하게 됩니다.

 

 

RequestMappingHandlerAdapter가 컨트롤러를 처리하기 전에 ArgumentResolver가 @RequestMapping 메서드에 들어온 인자들의 값을 생성해냅니다. 

 

 

스프링에서 ArgumentResolver가 다양한 파라미터에 대해 인자들을 생성할 수 있도록 구현해놓았기 때문입니다.

 

 

역으로 예시를 들면 이해가 잘 될 것 같은데요. 위 메서드를 호출하면 에러가 발생합니다. 왜냐하면 MemberDetails 객체는 ArgumentResolver가 생성할 수 없는 파라미터기 때문입니다.

 

 

 

ArgumentResolver가 처리할 수 있는 파라미터를 만들려면 HandlerMethodArgumentResolver를 구현하면 됩니다.

인터페이스 규약을 요약하면 아래와 같습니다.

 

1. supportsParameter()를 통해 해당 파라미터 지원 여부를 검사한다.

2.resolveArgument() 객체를 호출해서 실제 객체를 호출한다.

 

 

그럼 이제 실제로 ArgumentResolver가 처리할 수 있는 커스텀 애노테이션을 만들어봅시다.

 


ArgumentResolver가 처리할 수 있는 커스텀 애노테이션 만들기

 

구현 방법은 아래와 같습니다.

1. HandlerMethodArgumentResolver 구현

2. ArgumentResolver 등록

 

 

기존에는 HttpServletRequest 객체를 호출해서 1. 토큰을 가져오고 2. 자르고 3. jwtTokenManager 를 통해 MemberDetails 객체를 가져왔습니다. 1,2,3 과정을 HandlerMethodArgumentResolver 가 처리하도록 만들겠습니다.

 

우선 저는 애노테이션 기반으로 ArgumentResolver를 만들도록 하겠습니다.

 

 

0.ArgumentResolver 로 등록할 애노테이션을 만들어줍니다.

런타임에 동작해야하고 파라미터에 사용할 것이기 때문에 위와 같이 Retention, Target을 설정합니다.

 

 

1. HandlerMethodArgumentResolver 구현

supportsParameter()를 통해 지원 여부를 체크합시다.

1. AuthenticatedMember 애노테이션인지 확인합니다. 2. 파라미터 타입이 MemberDetails인지 확인합니다.

 

 

resolveArgument()를 통해 객체를 호출합시다.

객체를 호출하는 과정에서 필요한 처리를 여기서 해주면 됩니다.

 

2. ArgumentResolver 등록

 

WebMvcConfiguer를 구현하는 설정 파일(@Configuration) 클래스에서 아래와 같이 ArgumentResolver를

등록하면 사용가능합니다.