1. ArgumentResolver란?

* 요청 매핑 핸들러 어댑터에 넘어온 요청을 객체, 변수로 바인딩
위의 그림은 Http 요청 메시지의 예시다. 사용자의 요청은 Http Method에 따라 다르지만 url에 '?'뒤에 오는 쿼리스트링으로 전달될 수도 있고 위의 예시처럼 body안에 저장돼 전해질 수도 있다. 또는 JSON, XML 등 다양한 형태로 요청 메시지가 서버로 전해진다.
이렇게 다양한 요청 메시지들을 프로그래머가 일일이 설정해주기란 상당히 불편한 일이다. 그래서 Spring에선 ArgumentResolver를 지원해 해당 요청 메시지들을 객체, 변수에 바인딩 해 해결해준다.
2. ArgumentResolver 동작과정

1. 요청에 적합한 Handler(Controller)가 있는 지 조회
2. 해당 핸들러의 어댑터가 목록에 있는지 조회
3. 해당 핸들러 어댑터에게 요청을 넘겨준다.
4. ArgumentResolver는 Handler에 있는 다양하게 요청을 받는 방식들(@RequestParam, @ModelAttribute 등)을 고려해 요청을 객체, 변수에 바인딩 시킨다.
4-1. 이때 필요한 경우 HttpMessageConverter를 통해 메시지->Json, text로 변환 한다.
5. 변환된 객체를 컨트롤러에 전달
6~7. 로직을 수행하고 반환값이 있을 경우 ReturnValueHandler를 통해 4, 4-1과 같은 과정을 거쳐 응답을 어댑터에게 전달한다.
3. ArgumentResolver의 활용
대부분의 기능은 Spring에서 제공하기 때문에 활용할일은 많지 않다. 하지만 필요할 경우 확장하여 사용할 수 있다.
package org.springframework.web.method.support;
import org.springframework.core.MethodParameter;
import org.springframework.lang.Nullable;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
public interface HandlerMethodArgumentResolver {
// 해당 파라미터가 이 리졸버로 지원되는지 확인
boolean supportsParameter(MethodParameter parameter);
//실제 로직을 처리
@Nullable
Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception;
}
ArgumentResolver는 위의 HandlerMethodArgumentResolver를 구현해 사용할 수 있다. 그렇게 생성한 Resolver를 아래와 같이 WebMvcConfigurer를 구현한 클래스에 등록해준다.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
}
}
'Spring' 카테고리의 다른 글
Spring - @Transactional 활용해 멀티 스레드 환경을 테스트할 때 주의점 (0) | 2024.05.06 |
---|---|
Spring - 요청 파라미터 LocalDate타입 필드에 바인딩 및 검증 (1) | 2024.04.12 |
Spring - Springboot + Vue3 + MariaDB를 카페24에 배포할 때 Tip(주의사항) (1) | 2023.07.26 |
Spring - DispatcherServlet에 대해 알아보자 (0) | 2023.07.15 |