ArgumentResolver
컨트롤러의 메서드 파라미터에 들어오는 데이터를 자동으로 처리하고 바인딩하는 도구
@RequestBody, Param, PathVariable 등의 어노테이션을 적기만 하면
알아서 바인딩 해주는데, 이때 리졸버에게 값의 생성을 위임함
구현하기
💡
왜 구현하는 방법을 알아야하는가?
인증/인가를 위해 토큰에서 정보를 추출할 때
공통 파라미터의 처리, 도메인 객체 변환에 커스텀된 무언가를 할 때
매번 토큰 정보 추출 하는 로직을 추가한다면 → 유지보수가 힘들어질 것
공통 파라미터도 매번 추가하는 로직을 추가하면 → 코드의 결합도 높아짐
커스텀된 무언가가 필요할 때 → 회사의 보안 지침이나 로직 준수를 위해
구현하는 방법을 알아야 한다
가장 많이 쓰이는 것이 알아보니
인증/인가를 위한 JWT 토큰을 사용자 객체로 바꿀 때 필요한 것 같다
그냥 얼버무려 알 기에는 한 눈에 파악하기 어려우니 몇가지 절차를 알아가보자
커스텀 어노테이션 만들기
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentTime {
}
ArgumentResolver 구현
@Component
public class CurrentTimeArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
boolean hasAnnotation = parameter.hasParameterAnnotation(CurrentTime.class);
boolean isLocalDateTimeType = LocalDateTime.class.equals(parameter.getParameterType());
return hasAnnotation && isLocalDateTimeType;
}
@Override
public Object resolveArgument(
MethodParameter parameter,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception {
return LocalDateTime.now();
}
}
WebConfig 등록
package com.example.demo.config;
import com.example.demo.resolver.CurrentTimeArgumentResolver;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
@Configuration
public class WebConfig implements WebMvcConfigurer {
private final CurrentTimeArgumentResolver currentTimeArgumentResolver;
public WebConfig(CurrentTimeArgumentResolver currentTimeArgumentResolver) {
this.currentTimeArgumentResolver = currentTimeArgumentResolver;
}
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(currentTimeArgumentResolver);
}
}
요약
커스텀 어노테이션 생성
(@Target, @Retention, @interface 사용)
→ ArgumentResolver 를 구현한다
(HandlerMethodArgumentResolver implements)
(supportsParameter → 이 파라미터의 처리 여부 서술)
(resolveArgument → 뭘 반환할지 서술)
→ WebConfig 등록
(WebMvcConfiguerer implements)
(addArgumentResolvers 의 resolvers에 add)