Spring
Spring MVC의 구조와 HttpMessageConverter의 역할
김예나
2025. 2. 24. 18:02
HttpMessageConverter
@RequestBody, @ResponseBody 을 사용할때 사용됨 → 요청이나 응답 모두에 사용된다는 의미
- 요청시에는 Argument Resolver가 사용
- 응답시에는 ReturnValueHandler가 사용
- JSON을 객체로 변환하는데는 Jackson 라이브러리 사용 (@JsonFormat, Deserializer)
HttpMessageConverter 우선순위
- ByteArrayHttpMessageConverter : byte[] Data를 처리
- StringHttpMessageConverter : String Data를 처리
- MappingJackson2HttpMessageConverter : JSON Data를 처리
HttpMessageConverter 동작 순서
읽기
- 클라이언트가 HTTP 요청을 보냄
- Spring MVC가 컨트롤러의 @RequestBody를 확인하고 MessageConverter를 실행
- MessageConverter는 canRead() 메서드로 읽기가능 여부를 조회
- 요청 데이터 타입이 지원 가능한지 (ex: application/json )
- 변환할 객체 타입이 적절한지 (ex: RequestDto를 만들 수 있는지)
4. read() 메서드를 호출하여 객체 생성 : JSON 데이터를 RequestDto 객체로 변환
쓰기
- 컨트롤러 메서드에서 객체 반환 : return responseDto
- @ResponseBody가 붙어 있으므로 스프링에서 HttpMessageConverter가 실행
- canWrite()를 호출하여 데이터 변환 가능 여부 확인
- 반환 클래스가 byte[], String, Object 인지 여부 확인
- 요청 헤더 Accept 의 Media Type 지원여부 확인(produces)
- write() 메서드를 호출 : HTTP Response Message Body에 데이터를 입력
Spring MVC 구조
- HandlerMappingList를 조회하여 적절한 컨트롤러 찾기
- 여러 개의 HandlerMapping을 순차적으로 조회하면서 요청을 처리할 컨트롤러(Handler)를 찾음
- ex) RequestMappingHandlerMapping : @RequestMapping으로 해당 핸들러를 찾음
- GET /users/1 요청이 오면 RequestMappingHandlerMapping **@RequestMapping("/users/{id}")가 있는 컨트롤러를 찾아 반환
- HandlerAdapter는 찾은 컨트롤러를 실행할 수 있도록 변환해 주는 역할
- 찾은 컨트롤러의 실행을 담당
- 찾은 컨트롤러의 메서드를 실행하고 결과를 반환
- @RequestMapping("/users/{id}")가 있는 컨트롤러 메서드 실행
RequestMappingHandlerAdapter
- @RequestMapping (@PostMapping , @GetMapping)을 처리하는 HandlerAdapter의 구현체
ArgumentResolver
- 요청이 컨트롤러 메서드에 전달될 때 각 파라미터를 적절한 객체로 변환하여 주입하는 것을 담당
- RequestMappingHandlerAdapter는 ArgumentResolver를 호출하여 Controller가 필요한 다양한 파라미터의 값을 생성
- HttpServletRequest, Model, HttpEntity,@ModelAttribute, @RequestBody, @RequestParam 등 다양한 파라미터 바인딩을 할 수 있는 이유
- HandlerMethodArgumentResolver
- ArgumentResolver의 실제 이름, 인터페이스로 구성됐기에 mplements 하여 확장 가능
ReturnValueHandler
- ModelAndView, @ResponseBody, HttpEntity<> 등이 있으면 응답에 필요한 값으로 변환
- Controller에서 String으로 ViewName을 반환하여도 View가 동작하는 이유
- HandlerMethodReturnValueHandler
- ReturnValueHandler의 실제 이름, 인터페이스로 구성됐기에 mplements 하여 확장 가능