Resolve argument를 사용해서 내가 원하는 방식으로 데이터 바인딩하기

winkite·2024년 9월 20일
0

정리

목록 보기
6/7

이번엔 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에서 넣어준 데이터도 함께 가져온다
이제 공통적으로 들어가야하는 데이터를 넣어서 편리하게 사용할 수 있다

profile
열심히 뛰는 개발자🏃

0개의 댓글