Spring의 HttpMessageConverter와 내부 구조
📌 1. HttpMessageConverter
🔹 사용처
- HTTP 요청:
@RequestBody
HttpEntity<>
RequestEntity<>
- HTTP 응답:
@ResponseBody
HttpEntity<>
ResponseEntity<>
🔹 변환 우선순위
byte[]
String
JSON
📌 2. Spring 내부 구조


🔹 ArgumentResolver
- HTTP 요청이 컨트롤러 메서드에 전달될 때 각 파라미터를 알맞은 객체로 변환하는 인터페이스
🔹 ReturnValueHandler
- 컨트롤러 메서드가 반환하는 값을 처리하여 HTTP 응답에 맞게 변환하는 인터페이스
🔹 Converter
- 특정 타입을 다른 타입으로 변환할 때 사용하는 인터페이스
- 사용자 지정 포맷을 적용해 데이터 변환을 처리할 때 사용하는 인터페이스
- 설정을 통해 Converter, Formatter를 추가할 수 있음.
🔹 ConversionService
- 어댑터 패턴을 적용하여
Converter와 Formatter를 일관성 있게 사용할 수 있도록 함.
🔹 HttpMessageConverter
ConversionService가 적용되지 않음.
- 역할:
- 요청 메시지 본문(
RequestBody)을 객체로 변환하거나
- 객체를 응답 본문(
ResponseBody)으로 변환
- JSON을 객체로 변환하는 데는 Jackson 라이브러리를 사용함.
@JsonFormat, Deserializer 등을 활용 가능
🔹 ConversionService 사용 예시
@RequestParam, @ModelAttribute, @PathVariable 등에서 활용됨.
Converter, Formatter를 직접 구현하여 ConversionService에 등록할 수 있음.
📌 4. 핵심 개념 정리
- Spring에서 제공하는 대부분의 기능은 인터페이스로 만들어져 있음.
- 기본적으로 제공하는 구현체들이 다양함.
- 개발자는 만들어진 기능을 잘 사용하면 됨.
- 확장하고자 하는 영역이 있다면 인터페이스를 확장하여 프로젝트에 적용하면 됨.
- 확장을 위해 내부 구조를 이해하는 것이 중요함!
📌 5. 활용 예시
👉 엔티티를 DB에 저장할 때, 노출되도 괜찮은 데이터는 쿼리 파라미터를 바로 객체로 변환하여 Service의 save() 메서드에서 repository.save()만 하면 된다. 🎉 개꿀! 🚀
참고:
https://teamsparta.notion.site/Spring-53a92a994a3e458aa0536c4caedb3e5e