HandlerMethodArgumentResolver
HandlerMethodArgumentResolver 인터페이스는 컨트롤러에서 파라미터 바인딩 해주는 역할을 합니다.
Strategy Interface for resolving method parameters into argument values in the context of a given request.
요청의 메서드 파라미터를 아규먼트의 값으로 resolve하는 인터페이스입니다. 흔히, 컨트롤러단에서 @RequestParam , @RequestBody, @ModelAttribute 와 같은 어노테이션 요청이나 클래스/인터페이스로 파라미터로 선언한 경우에 바인딩 해줍니다.
실제 구현체 예제- PageableHandlerMethodArgumentResolver
@RestController("/api/v1/post")
public Class PostController {
@Autowired
private PostService postService;
@GetMapping("/list")
public List<Post> list(Pageable pageable){
return postService.list(pageable);
}
}
게시판의 Post목록 데이터를 불러오는 list메서드를 생각해보면, 메서드의 인자로 Pageable(package org.springframework.data.domain
패키지에 있는)를 넘겼을 때 아무것도 한게 없는데 페이징이 되는 이유를 아시나요 ?
앞에서 설명했던 PageableHandlerMethodArgumentResolver 클래스가HandlerMethodArgumentResolver를 구현했기 때문에 메서드의 파라미터로 들어온 요청에 대한 Binding을 해당 구현클래스인 PageableHandlerMethodArgumentReoslver가 해줍니다. 그렇기 때문에 아무렇지 않게 사용할 수 있었던 것입니다.
커스텀하게 구현하기 - MyCustomHandlerMethodArgumentResolver
이번에는 앞에서 설명한 HandlerMethodArgumentResolver를 내 입맛에 맞는 구현을 직접 해봅시다.
@Data
public class User{
private final String name;
private final String email;
}
이름과 이메일을 받는 User라는 클래스를 만듭니다.
public class MyCustomHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return User.class.isAssignableFrom(parameter.getParameterType());
}
@Override
public User resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
// 바인딩할 객체를 조작할 수 있다.
return new User("andrew han", "umanking@gmail.com");
}
}
HandlerMethodArgumentResolver를 구현을 합니다. 첫번째 supportsParameter메서드는 바인딩할 클래스를 지정해줍니다. 두번째, resolveArgument메서드는 바인딩할 객체를 조작할 수 있다. 여기에서는 새로운 User 클래스를 만들어서 이름과 이메일정보를 넘겼습니다.
내 입맛에 맞게 구현한 MyCustomHandlerMethodArgumentResolver를 빈으로 등록합니다.
@Configuration
public class WebMvcConfigure implements WebMvcConfigurer {
@Bean
public MyCustomHandlerMethodArgumentResolver myCustomHandlerMethodArgumentResolver() { return new MyCustomHandlerMethodArgumentResolver();
}
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(myCustomHandlerMethodArgumentResolver())
}
}
실제 요청을 날리게 되면 MyCustomHandlerMethodArgumentResolver에서 정의한 resolveArgument 메서드를 호출함으로써 new User(“andrew”, “umanking@gmail.com”)
의 값을 리던하게 되고 원하는 결과를 얻게 됩니다.
@RestController("/api/v1/user")
public class UserController{
@GetMapping
public User getUser(User user){
return user;
}
}
참고
- http://wonwoo.ml/index.php/post/1092
- https://lelecoder.tistory.com/107
📚 Related Posts
- Spring WebFlux 테스트 방법
- Spring과 MongoDB 연동 실전 가이드
- SpringBoot, MongoDB 시작하기
- Spring Boot 서버 타임존 설정 방법
- SpringBoot CommandLineRunner, ApplicationRunner 초기화 방법
- Jackson, LocalDateTime Serialization, Deserialization 이슈
- Spring Boot, Dockerfile로 이미지 생성, 배포하기
- SpringBoot RabbitMQ 연동하기
- Junit5 정리
- Spring Sentry(에러 트래킹 서비스) 적용하기
- [Spring] 빈 주입하는 방법 && Best Practice
- Thymeleaf 실무에서 자주 사용하는 것들
- Thymeleaf Collection 정보 화면에 렌더링하기
- Spring, JPA를 이용한 REST API 만들기
- [Spring] MultipartFile을 이용한 파일 업로드
- [Spring] 모델 검증(validation)
- [Spring]HandlerMethodArgumentResolver 인터페이스
- [Spring] DispatcherServlet에 대해서 알아보자
- [Spring] MVC 만들어 보기
- [Spring] 메세지 컨버터
- [Spring] MVC 살펴보기
- [Spring] @ConfigurationProperties를 이용해서 properties값들을 클래스로 관리하기
- [Spring] Profile 설정하기
- [Spring] SpringApplication를 통한 코딩
- [Spring Boot] 스프링 부트 3가지 특징
- [Spring] @SpringBootAppllication 어노테이션에 대한 고찰
- [Spring] bean circular dependencies (빈 순환 참조)
- [Spring]Bean에 대해서 알아보자
- SpringBoot, JPA, H2를 이용한 간단한API 작성
- [Spring] Spring Data Common 프로젝트 살펴보기