Spring MVC로 Web개발을 할 때 쿼리 파라미터 혹은 HTTP Body에 들어오는 값을 Controller 메소드의 매개변수로만 선언을 해도 자동으로 바인딩을 해준다. 이럴 때 왜, 어떻게 바인딩을 해주지? 라는 의문이 들 것이다. 이런 바인딩을 개발자가 아닌 자동으로 해주는 것이 바로 Argument Resolver이다.
1. Argument Resolver (HandlerMethodArgumentResolver)
Argument Resolver는 컨트롤러 메서드의 매개변수에 값을 자동으로 주입하는 역할을 한다. 이는 HTTP 요청의 다양한 데이터를 컨트롤러 메서드의 인자로 전달하기 위해 사용된다. 예를 들어, 요청 파라미터, 헤더, 세션 정보 등을 컨트롤러의 인자에 맞게 변환하여 제공하는 작업을 처리한다.
A. 특징:
- 핸들러 메서드의 인자를 해석: 스프링은 컨트롤러 메서드가 호출될 때 각 인자에 적합한 값을 주입하기 위해 여러 개의 Argument Resolver를 순차적으로 시도한다.
- 커스텀 Argument Resolver 작성 가능: 기본 제공되는 Argument Resolver 외에도 개발자가 커스텀 Argument Resolver를 작성하여 특정한 데이터 바인딩 논리를 정의할 수 있다. 예를 들어 특정한 타입의 객체를 요청 데이터로부터 구성할 때 이를 쉽게 처리할 수 있다.
B. 주요 내장 Argument Resolver:
- RequestParamMethodArgumentResolver: @RequestParam을 사용하여 쿼리 파라미터나 폼 데이터를 메서드 인자에 바인딩한다.
- PathVariableMethodArgumentResolver: @PathVariable을 사용하여 URI 경로 변수 값을 바인딩한다.
- RequestBodyMethodArgumentResolver: @RequestBody를 사용하여 요청의 본문을 특정 객체로 변환해 메서드 인자로 전달한다.
- ModelAttributeMethodArgumentResolver: @ModelAttribute를 사용하여 폼 데이터를 바인딩한다.
C. 동작 방식:
- DispatcherServlet: 모든 HTTP 요청은 우선적으로 DispatcherServlet을 통해 들어온다.(Front Controller)
- RequestMapping 핸들러 어댑터: DispatcherServlet은 요청을 처리할 컨트롤러를 찾고, 해당 컨트롤러의 메서드를 호출하기 위해 RequestMapping 핸들러 어댑터를 사용한다. 이때 핸들러 어댑터는 메서드 호출을 위한 필요한 매개변수를 준비하기 위해 Argument Resolver를 사용한다.
- Argument Resolver: 요청(쿼리 파라미터, PathVariable, RequestBody)에서 데이터를 추출하고 컨트롤러 메서드의 매개변수로 바인딩 한다.
- Controller: Argument Resolver가 매개변수 바인딩을 완료후 컨트롤러 메서드가 호출된다.
- ReturnValue Handler: 컨트롤러에서 반환된 값은 ReturnValue Handler에 의해 처리된다.
- DispatcherServlet으로 반환: ReturnValue Handler에서 변환한 결과는 다시 DispatcherServlet으로 전달되고 최종적으로 클라이언트에게 HTTP 응답으로 전송된다.
2. HTTP 메시지 컨버터 (HTTP Message Converter)
HTTP 메시지 컨버터 (Http Message Converter)는 HTTP 요청 또는 응답의 본문을 변환하는 역할을 한다. 클라이언트에서 보내는 JSON, XML, 문자열 등의 데이터를 Java 객체로 변환하거나, 반대로 Java 객체를 HTTP 응답 본문으로 변환할 때 사용된다.
A. 주요 메시지 컨버터 종류
- MappingJackson2HttpMessageConverter: JSON 데이터를 Java 객체로 변환하거나 Java 객체를 JSON 형식으로 변환한다.
- StringHttpMessageConverter: 단순 문자열을 처리한다.
- FormHttpMessageConverter: 폼 데이터를 처리한다.
B. Argument Resolver와 HTTP 메시지 컨버터의 상호작용
@RequestBody와 같은 어노테이션을 사용하는 경우 Argument Resolver는 HTTP 메시지 컨버터를 이용하여 요청 본문 데이터를 Java 객체로 변환한다. 이때 RequestBodyMethodArgumentResolver는 HTTP 메시지 컨버터를 호출하여 JSON이나 XML과 같은 형식을 Java 객체로 변환한다.
예를 들어 컨트롤러 메서드에서 @RequestBody로 요청 데이터를 Java 객체로 받아야 한다면 'RequestBodyMethod ArgumentResolver' 는 요청 본문을 처리하기 위해 적절한 메시지 컨버터(MappingJackson2HttpMessageConverter 등)를 호출하게 된다.
'Spring Framework' 카테고리의 다른 글
[Spring] Bean Validation (검증) - 1 (4) | 2024.10.31 |
---|---|
[Spring] 스프링 메시지, 국제화 (1) | 2024.10.29 |
@Transactional을 선언해도 내부 메서드를 실행 시 ROLLBACK이 되지 않는 문제 (0) | 2024.08.03 |
(실습)객체지향 설계 원칙를 지키면서 설계하기 (0) | 2024.03.30 |
객체 지향 설계의 5가지 원칙(SOLID) (0) | 2024.03.30 |