아규먼트 리졸버(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 |