728x90
반응형
Spring MVC 에서 HTTP 메시지 컨버터의 동작 위치
애노테이션 기반의 컨트롤러, @RequestMapping을 처리하는 핸들러 어댑터 - RequestMappingHandlerAdapter에서 동작
# 전체 동작 개요
- 이 때 RequestMappingHandlerAdapter에서는 들어온 request에 대해서 어떠한 형식(파라미터, 애노테이션 정보)를 기반으로 ArgumentResolver가 전달 데이터를 생성
- Controller 정보 - HttpServletRequest, Model, @RequestParam, @ModelAttribute, @RequestBody, HttpEntity 등
- 이후 ArgumentResolver가 전달해준 값을 RequestMappingHandlerAdapter가 컨트롤러에게 값을 전달한다.
- 그리고 컨트롤러에서 나온 값을 ReturnValueHandler에게 주고 응답 값을 변환하고 처리한다.
- ReturnValueHandler가 처리한 값을 다시 RequestMappingHandlerAdapter에게 전달한다.
# ArgumentResolver
- 컨트롤러는 다양한 파라미터가 존재
- HttpServletRequest, Model
- @RequestParam, @ModelAttribute
- @RequestBody, HttpEntity -(http 메시지를 처리하는 부분)
- 따라서 매우 큰 유연함이 필요함 → 이러한 유연성 제공을 ArgumentResolver가 해준다.
- ArgumentResolver 를 사용했을 때의 Controller 구현
@GetMapping("/member")
public ResponseEntity<MemberResponse> findMemberOfMine(@AuthenticationPrincipal LoginMember loginMember) {
MemberResponse memberResponse = memberService.findMember(loginMember.getId());
return ResponseEntity.ok().body(memberResponse);
}
정리
ArgumentResolver는 RequestMappingHandlerAdapter가 호출하여 컨트롤러(핸들러)가 필요로 하는 파라미터를 생성해주고 이 파라미터의 값을 RequestMappingHandlerAdapter가 받아서 컨트롤러를 호출하여 파라미터를 전달한다.
# ReturnValueHandler
- 컨트롤러에서 나온 값을 변환하여 RequestMappingHandlerAdapter에게 전달한다.
- 변환 및 처리한 값 ModelAndView, @ResponseBody, HttpEntity, String ...
전체적인 흐름에서 볼 땐 returnvalueHandler의 역할은 다음과 같다
# HttpMessageConverter
- ArgumentResolver와 ReturnValueHandler가 HttpMessageConverter를 사용한다.
- @RequestBody, @ResponseBody, HttpEntity 등 일 때 httpMessageConverter를 사용
- httpMessageConvert를 사용하는 @RequestBody, @ResponseBody 모두 컨트롤러의 파라미터의 값, 반환 값을 이용한다.
Spring MVC는
- @RequestBody , @ResponseBody 가 있을 때
- RequestResponseBodyMethodProcessor - [ ArgumentResolver ] 사용
- HttpEntity가 있을 때
- HttpEntityProcessor - [ ArgumentResolver ] 사용
이번 포스팅에서는 Spring MVC 에서 HTTP 메시지 컨버터의 동작 위치와 역할에 대해서 살펴보았다.
728x90
반응형
'Spring' 카테고리의 다른 글
Spring Webflux - Netty access log customize (0) | 2023.01.20 |
---|---|
@Transactional Propagation와 Spring Transaction Proxy Pattern (0) | 2022.11.13 |
Service Discovery 패턴 (0) | 2022.10.28 |