Spring

Java Spring MVC에서 ArgumentResolver

curiousKidd 2024. 12. 22. 21:57
반응형

Spring MVC에서 ArgumentResolver는 컨트롤러 메서드의 매개변수를 처리하고 주입하는 데 사용되는 중요한 구성 요소입니다.
이 글에서는 HandlerMethodArgumentResolver와 이를 활용하여 사용자 정의 로직을 구현하는 방법에 대해 설명하겠습니다.


ArgumentResolver란 무엇인가?

Spring MVC의 HandlerMethodArgumentResolver는 컨트롤러 메서드의 매개변수를 처리하는 전략 인터페이스입니다.
이를 통해 HTTP 요청 데이터를 분석하거나 추가적인 비즈니스 로직을 적용하여 매개변수 값을 동적으로 생성할 수 있습니다.

기본 동작 방식

  1. Spring MVC는 HTTP 요청을 처리하는 과정에서 컨트롤러 메서드와 매핑된 매개변수를 확인합니다.
  2. 각 매개변수에 대해 등록된 ArgumentResolver를 확인하여 어떤 ArgumentResolver가 해당 매개변수를 처리할지 결정합니다.
  3. 적합한 ArgumentResolver가 매개변수 값을 생성하고, 이를 컨트롤러 메서드에 주입합니다.

HandlerMethodArgumentResolver 인터페이스

이 인터페이스는 두 가지 주요 메서드를 제공합니다:

1. boolean supportsParameter(MethodParameter parameter)

  • 특정 매개변수를 이 ArgumentResolver가 처리할 수 있는지 여부를 반환합니다.
  • 보통 매개변수 타입이나 특정 애노테이션 존재 여부를 기준으로 처리 가능합니다.

2. Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory)

  • 실제 매개변수를 처리하고 값을 반환합니다.
  • 요청 데이터에서 값을 추출하거나 객체를 생성하는 로직을 포함합니다.

기본 제공 ArgumentResolver

Spring MVC는 다양한 기본 ArgumentResolver를 제공합니다. 다음은 대표적인 예입니다:

  • RequestParamMethodArgumentResolver: @RequestParam을 처리합니다.
  • PathVariableMethodArgumentResolver: @PathVariable을 처리합니다.
  • RequestBodyArgumentResolver: @RequestBody를 처리합니다.
  • ModelAttributeMethodProcessor: @ModelAttribute를 처리합니다.

이 외에도 여러 기본 구현이 있으며, 대부분의 일반적인 요청 처리 시 기본 제공 ArgumentResolver로 충분합니다.


사용자 정의 ArgumentResolver

사용자 정의 ArgumentResolver를 구현하여 특정 요구 사항을 처리할 수 있습니다. 아래는 간단한 예제입니다:

1. 사용자 정의 ArgumentResolver 구현

@Component
public class CustomArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        // 특정 애노테이션이 존재하는 경우 처리
        return parameter.hasParameterAnnotation(CustomAnnotation.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter,
                                  ModelAndViewContainer mavContainer,
                                  NativeWebRequest webRequest,
                                  WebDataBinderFactory binderFactory) throws Exception {
        // 요청에서 데이터를 추출하여 객체 생성
        String value = webRequest.getParameter("customParam");
        return new CustomObject(value);
    }
}

2. ArgumentResolver 등록

WebMvcConfigurer를 구현하여 위에서 작성한 ArgumentResolver를 등록합니다.

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(new CustomArgumentResolver());
    }
}

활용 사례

  1. 요청 데이터를 객체로 변환
    • HTTP 요청 데이터를 분석하여 특정 객체를 생성하고 컨트롤러 메서드에 전달합니다.
  2. 인증 및 권한 처리
    • 인증 토큰을 기반으로 사용자 정보를 주입하거나 권한 검사를 수행합니다.
  3. 특정 애노테이션 기반 로직 적용
    • 메서드 매개변수에 커스텀 애노테이션을 추가하여 특별한 동작을 정의합니다.

반응형