Spring Framework / / 2024. 12. 16. 23:55

아규먼트 리졸버(Argument Resolver)

아규먼트 리졸버(Argument Resolver)Spring MVC에서 컨트롤러 메서드의 파라미터(Arguments)를 자동으로 해석하고 값을 주입하는 역할을 하는 기능입니다.


1. 아규먼트 리졸버란?

  • Spring MVC에서 HandlerMethodArgumentResolver를 통해 구현된 메커니즘입니다.
  • 컨트롤러 메서드의 파라미터 타입이나 어노테이션을 보고 적절한 값을 주입해줍니다.
  • 스프링이 기본적으로 제공하는 리졸버들이 존재하며, 필요에 따라 커스텀 리졸버를 만들 수도 있습니다.

2. 기본 아규먼트 리졸버

Spring MVC는 기본적으로 다음과 같은 아규먼트 리졸버를 제공합니다.

어노테이션/객체 설명
@RequestParam 요청의 쿼리 파라미터 값을 가져와 메서드 인자에 주입합니다.
@PathVariable URL의 경로 변수 값을 메서드 인자에 주입합니다.
@RequestBody HTTP 요청 본문을 객체로 변환하여 바인딩합니다.
@RequestHeader HTTP 요청 헤더 값을 가져옵니다.
@CookieValue HTTP 요청 쿠키 값을 가져옵니다.
@ModelAttribute 요청 데이터를 객체에 바인딩합니다.
HttpServletRequest 서블릿 요청 객체를 직접 사용할 수 있도록 주입합니다.
HttpSession HTTP 세션 객체를 주입합니다.
Principal 인증된 사용자 정보를 가져옵니다.
BindingResult 검증 오류 정보를 가져옵니다.

3. 기본 리졸버 예시

1) @RequestParam (쿼리 파라미터 바인딩)

@GetMapping("/user")
public String getUser(@RequestParam("id") String userId) {
    return "User ID: " + userId;
}
  • 요청 예시:
     GET /user?id=123

2) @PathVariable (경로 변수 바인딩)

@GetMapping("/user/{id}")
public String getUser(@PathVariable("id") String userId) {
    return "User ID: " + userId;
}
  • 요청 예시:
     GET /user/123

3) @RequestHeader (HTTP 헤더 값 바인딩)

@GetMapping("/header")
public String getHeader(@RequestHeader("X-Correlation-ID") String correlationId) {
    return "Correlation ID: " + correlationId;
}
  • 요청 헤더 예시:
     X-Correlation-ID: abc123

4) @RequestBody (요청 본문 바인딩)

@PostMapping("/user")
public String createUser(@RequestBody User user) {
    return "Created user: " + user.getName();
}
  • 요청 본문 예시:
     {
         "name": "John Doe",
         "age": 30
     }

4. 커스텀 아규먼트 리졸버

스프링의 기본 리졸버로 처리할 수 없는 경우, HandlerMethodArgumentResolver 인터페이스를 구현해 커스텀 리졸버를 만들 수 있습니다.

커스텀 아규먼트 리졸버 구현 예시

1. 커스텀 어노테이션 생성

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomHeader {
    String value();
}

2. 리졸버 구현

import org.springframework.core.MethodParameter;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

public class CustomHeaderArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(CustomHeader.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
                                  NativeWebRequest webRequest, org.springframework.web.bind.support.WebDataBinderFactory binderFactory) {
        CustomHeader annotation = parameter.getParameterAnnotation(CustomHeader.class);
        return webRequest.getHeader(annotation.value());
    }
}

3. WebMvcConfigurer에 등록

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(new CustomHeaderArgumentResolver());
    }
}

4. 컨트롤러에서 사용

@GetMapping("/custom-header")
public String getCustomHeader(@CustomHeader("X-Correlation-ID") String correlationId) {
    return "Correlation ID: " + correlationId;
}

5. 정리

  • 아규먼트 리졸버컨트롤러 메서드의 파라미터를 해석하고 값을 주입하는 스프링 MVC의 핵심 기능입니다.
  • 스프링이 기본적으로 제공하는 리졸버 외에도 커스텀 리졸버를 구현해 원하는 값을 바인딩할 수 있습니다.

'Spring Framework' 카테고리의 다른 글

필터(Filter)와 인터셉터(Interceptor)  (0) 2024.12.16
InitializingBean  (0) 2024.10.29
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유