티스토리 뷰

Spring

HandlerMethodArgumentResolver

SonSeungWoo 2019. 10. 2. 13:56

스프링의 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
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함