티스토리 뷰
스프링의 HandlerMethodArgumentResolver 구현하여 커스텀 데이터를 binding해보자.
데이터를 객체에 바인딩하려는 경우가 있지만 직접적이지 않은 방식 (예 : 세션, 헤더 또는 쿠키 변수) 또는 데이터 소스에 저장되는 경우가 있습니다. 이 경우 HandlerMethodArgumentResolver 이용하면 쉽게 해결할 수 있다.
먼저 커스텀 어노테이션을 작성하자.
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface Version {
}
커스텀 어노테이션을 정의하고 HandlerMethodArgumentResolver에 등록하면 어노테이션만 달면 컨트롤러에서 쉽게 바인딩 할수있다. HandlerMethodArgumentResolver 정의한 어노테이션을 등록해주자.
public class HeaderVersionArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return methodParameter.getParameterAnnotation(Version.class) != null;
}
@Override
public Object resolveArgument(
MethodParameter methodParameter,
ModelAndViewContainer modelAndViewContainer,
NativeWebRequest nativeWebRequest,
WebDataBinderFactory webDataBinderFactory) throws Exception {
HttpServletRequest request
= (HttpServletRequest) nativeWebRequest.getNativeRequest();
return request.getHeader("Version");
}
}
이제 spring이 알수있게 등록한 HandlerMethodArgumentResolver를 스프링 resolver에 등록해야 해당HandlerMethodArgumentResolver가 작동된다. 아래와 같이 등록해주자.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(
List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new HeaderVersionArgumentResolver());
}
}
이제 controller를 만들고 테스트를 해보자.
@GetMapping("/entity")
public ResponseEntity findByVersion(@Version String version) {
log.info("version {}:", version);
return ResponseEntity.ok(version);
}
localhost:8080/entity를 요청하고 header에 Version 정보를 1.0 이런식으로 요청하면 콘솔에 version 1.0 찍히는걸 확인할 수 있다.
'Spring' 카테고리의 다른 글
Restful API 버전관리 (2) | 2019.10.25 |
---|---|
Spring ApplicationEvent (0) | 2019.10.10 |
IoC란 (0) | 2019.04.24 |
Spring Aop (0) | 2019.04.23 |
스프링에서 @Async로 비동기처리하기 (0) | 2017.04.21 |