이번엔 resolver argument에 대해서 제대로 씹어보려고 한다.
처음에는 @RequestBody 어노테이션을 사용하던 도중 custom Resolver argument 가 동작이 안돼서 이것저것 찾아봤었고
api 요청이 컨트롤러에 도달하기 전에 거치는 순서에 대해서 제대로 정리해보고자 포스팅했었다.
그 다음에 @RequestBody 어노테이션을 사용하면서 파라미터에 값을 바인딩할 때 파라미터를 조작하는 방법에 대해서 포스팅했다.
그리고 이번엔 !
ResolveArgument를 사용하는 방법을 정리해보려고 한다.
사실 이 전 포스팅에서는 @RequestBody 등 argumnet Resolver의 구현체를 사용한 어노테이션을 다른 방법으로 파라미터 값을 조작하는 방법에 대해 포스팅해보겠다고 예고했는데
custom resolve argument 를 일단 구현해봐야지 하다가 막혀서 다시 글을 써본다...
정말 갈 길이 멀고요,, 힘들고요,,,
우선 HandlerMethodArgumnetResolver 구현체를 사용하여 custom argument resolver를 작성해보자
@Component
@RequiredArgsConstructor
public class CustomArgumentResolver implements HandlerMethodArgumentResolver{
@Override
public boolean supportsParameter(MethodParameter parameter) {
/**
* 현재 파라미터를 Resolver를 적용할지 안할지 검사한다.
* ex) 특정 어노테이션 여부, 특정 Dto 클래스인지 등등.. */
return true;
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
/**
* 파라미터와 기타 정보를 받아 실제 객체를 반환한다. */
Map<String, Object> result = new HashMap<>();
Map<String, String[]> parameterMap = webRequest.getParameterMap();
// 기존 파라미터 데이터를 넣어주는 작업
for(Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
String key = entry.getKey();
String value = entry.getValue()[0];
result.put(key, value);
}
ResponseDto responseDto = new ResponseDto();
responseDto.setBody(result);
return responseDto;
}
}
나는 ResponseDto 라는 새로운 객체를 만들어 데이터를 셋팅해줬다
커스텀 Resolver를 만들었으니 이제 해당 Resolver를 사용하겠다고 MvcConfig에 등록해야한다.
@Configuration
@RequiredArgsConstructor // lombok에서 자동으로 의존성 주입해주는 어노테이션
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new CustomArgumentResolver());
}
}
이렇게 작성하고 통신하면

제가 원하는대로 모든 데이터와 resolver에서 넣어준 데이터도 함께 가져온다
이제 공통적으로 들어가야하는 데이터를 넣어서 편리하게 사용할 수 있다