RequestMappingHandlerAdapter
📌 Spring MVC에서 HTTP 요청을 컨트롤러 메서드에 매핑하고 실행하는 핵심 구성 요소로, 클라이언트 요청을 적절한 컨트롤러 메서드와 연결한 후 이 메서드를 호출하여 결과를 반환하는 역할을 수행한다.
Spring MVC 구조
- 요청 데이터가 변환이된다.(HttpMessageConverter)
- 요청이 Controller에 전달되는 HandlerAdapter와 Handler 사이에서 어떤 일이 일어난다!
RequestMappingHandlerAdapter
@RequestMapping 을 처리하는 HandlerAdapter의 구현체
@PostMapping , @GetMapping, @PutMapping, @PatchMapping, @DeleteMapping 등은 모두 @RequestMapping의 일종이다.
ArgumentResolver
- RequestMappingHandlerAdapter는 ArgumentResolver를 호출하여 Controller가 필요한 다양한 파라미터의 값을 생성한다.
- HttpServletRequest, Model, HttpEntity,@ModelAttribute, @RequestBody, @RequestParam 등 다양한 파라미터 바인딩을 할 수 있는 이유이다.
- ArgumentResolver를 통하여 값이 준비되면 해당값을 가지고 실제 Controller를 호출한다.
- 어노테이션도 매핑 및 바인딩이 필요했다...
ArgumentResolver
📌 Spring MVC에서 컨트롤러 메서드의 파라미터를 자동으로 바인딩하는 역할을 하는 인터페이스로 요청이 컨트롤러 메서드에 전달될 때 각 파라미터를 적절한 객체로 변환하여 주입하는 것을 담당한다.
ArgumentResolver 종류
- Spring은 다양한 Argument Resolver들을 기본적으로 제공한다.
- RequestBodyArgumentResolver(@RequestBody)
2. RequestHeaderArgumentResolver(@RequestHeader)
HandlerMethodArgumentResolver
- ArgumentResolver의 실제 이름
- 인터페이스로 구성되어 있다.
- implements 하여 커스텀하게 파라미터를 만들 수 있다.(확장)
- supportsParameter(MethodParameter parameter);
- 컨트롤러가 필요로하는 메서드의 파라미터를 지원하는지 여부를 검사한다.
- 지원한다면 resolveArgument() 메서드를 통해 Object(객체)로 만들어준다.
- 만들어진 Object(객체)가 Controller 호출시 메서드의 파라미터로 전달된다.
- supportsParameter() 를 사용하는 다양한 ArgumentResolver 구현체
ReturnValueHandler
📌 Spring MVC에서 컨트롤러 메서드가 반환하는 값을 처리하여 HTTP 응답에 맞게 변환하는 역할을 하는 인터페이스로 컨트롤러 메서드가 실행된 후 그 반환값을 HTTP 응답의 본문에 적절히 담아 전송할 수 있도록 도와준다.
Spring MVC의 주요 컴포넌트 요약
1. ArgumentResolver
- 역할: 컨트롤러 메서드의 입력 파라미터를 동적으로 생성하여 주입.
- 일상 예시:
- "음식점에서 메뉴를 보고 '김치찌개'를 주문하면, 요리사가 요청에 맞는 재료를 준비해서 요리를 시작한다."
- 여기서 김치찌개라는 요청을 기반으로 필요한 재료(데이터)를 동적으로 준비하는 역할이 ArgumentResolver입니다.
예제 코드:
@GetMapping("/user")
public String getUser(@RequestParam String name) {
return "Hello " + name;
}
동작:
- 클라이언트 요청: /user?name=John
- **ArgumentResolver**가 name 값을 쿼리 파라미터에서 추출해 메서드 파라미터에 전달.
2. RequestMappingHandlerAdapter
- 역할:
- 클라이언트의 HTTP 요청을 적절한 컨트롤러 메서드에 매핑.
- 요청 파라미터를 ArgumentResolver로 처리하고, 응답 값을 ReturnValueHandler로 처리.
- 일상 예시:
- "레스토랑에서 웨이터가 손님의 요청을 듣고 적절한 요리사에게 요청을 전달한다."
- 웨이터(RequestMappingHandlerAdapter)가 요청을 받아, 요리사(Controller)에게 적절히 전달하고 결과를 받아 클라이언트에 응답.
예제 코드:
@PostMapping("/order")
public String placeOrder(@RequestBody OrderDto order) {
return "Order received for: " + order.getItemName();
}
동작:
- **RequestMappingHandlerAdapter**가 요청 /order를 탐지하고, 해당 메서드를 호출.
- ArgumentResolver를 사용해 요청 본문(JSON)을 OrderDto로 변환.
- 메서드 실행 후 반환된 값을 ReturnValueHandler로 처리.
3. ReturnValueHandler
- 역할: 컨트롤러 메서드가 반환한 값을 적절한 형식으로 변환하여 클라이언트로 전송.
- 일상 예시:
- "요리사가 음식을 만들어서 웨이터가 손님에게 적절한 포장(접시 또는 테이크아웃 박스)으로 전달한다."
- 반환된 결과 데이터를 JSON, HTML, XML 등 클라이언트가 원하는 형식으로 변환하는 역할이 ReturnValueHandler입니다.
예제 코드:
@GetMapping("/status")
public ResponseEntity<String> getStatus() {
return ResponseEntity.ok("Service is running");
}
동작:
- 컨트롤러 메서드가 ResponseEntity를 반환.
- **ReturnValueHandler**가 반환된 값을 HTTP 응답 본문에 쓰고, 상태 코드와 헤더를 설정.
요약된 동작 흐름 (일상 비유로 연결)
- 클라이언트 요청: 손님이 "김치찌개 주문" 요청.
- 클라이언트가 /order?item=kimchiStew로 HTTP 요청.
- RequestMappingHandlerAdapter: 웨이터가 요청을 접수.
- URL, HTTP 메서드 등에 따라 적절한 컨트롤러 메서드 매핑.
- ArgumentResolver: 요리사가 요청에 필요한 재료 준비.
- 쿼리 파라미터, 요청 본문 등을 읽어 메서드 파라미터에 맞는 데이터 생성.
- Controller 처리: 요리사가 음식을 만듦.
- 컨트롤러 로직이 비즈니스 처리를 수행.
- ReturnValueHandler: 웨이터가 음식을 손님에게 전달.
- 컨트롤러 결과를 JSON, HTML 등 클라이언트가 이해할 수 있는 형식으로 변환.
통합 예제
@RestController
public class ExampleController {
@GetMapping("/user")
public String getUser(@RequestParam String name) { // ArgumentResolver 처리
return "Hello " + name; // ReturnValueHandler 처리
}
@PostMapping("/order")
public ResponseEntity<OrderResponse> placeOrder(@RequestBody OrderDto order) {
// ArgumentResolver 처리
OrderResponse response = new OrderResponse(order.getItemName(), "Processing");
return ResponseEntity.ok(response); // ReturnValueHandler 처리
}
}
요청/응답 흐름:
- 클라이언트 요청: GET /user?name=John
- ArgumentResolver:
- RequestParamMethodArgumentResolver가 쿼리 파라미터 name=John을 추출해 메서드 파라미터에 전달.
- 컨트롤러 실행: return "Hello John";
- ReturnValueHandler:
- 반환값을 HTTP 응답 본문(Hello John)에 작성.
비유와 코딩을 연결한 간단 정리
- ArgumentResolver: 요청, 데이터(재료)를 준비.
- RequestMappingHandlerAdapter: 요청을 전달하고 전체 과정을 조율(웨이터).
- ReturnValueHandler: 응답, 반환값(요리 결과)을 클라이언트에게 적절히 포장해 전달.
이 과정을 통해 Spring MVC는 클라이언트의 요청을 유연하고 효과적으로 처리합니다!
'Back-End (Web) > Spring' 카테고리의 다른 글
TypeConverter (0) | 2025.01.10 |
---|---|
HttpMessageConverter (0) | 2025.01.09 |
[Spring] 스프링 정리 (0) | 2025.01.07 |
[Spring] 의존관계 주입 (0) | 2024.12.26 |
[Spring] Bean 등록 (0) | 2024.12.25 |