[2025-02-22] HttpMessageConverter를 알아보자!

이규정·2025년 2월 22일

Spring의 HttpMessageConverter와 내부 구조

📌 1. HttpMessageConverter

🔹 사용처

  1. HTTP 요청:
    • @RequestBody
    • HttpEntity<>
    • RequestEntity<>
  2. HTTP 응답:
    • @ResponseBody
    • HttpEntity<>
    • ResponseEntity<>

🔹 변환 우선순위

  1. byte[]
  2. String
  3. JSON

📌 2. Spring 내부 구조


🔹 ArgumentResolver

  • HTTP 요청이 컨트롤러 메서드에 전달될 때 각 파라미터를 알맞은 객체로 변환하는 인터페이스

🔹 ReturnValueHandler

  • 컨트롤러 메서드가 반환하는 값을 처리하여 HTTP 응답에 맞게 변환하는 인터페이스

📌 3. Converter, Formatter

🔹 Converter

  • 특정 타입을 다른 타입으로 변환할 때 사용하는 인터페이스

🔹 Formatter

  • 사용자 지정 포맷을 적용해 데이터 변환을 처리할 때 사용하는 인터페이스

🔹 WebMvcConfigurer

  • 설정을 통해 Converter, Formatter를 추가할 수 있음.

🔹 ConversionService

  • 어댑터 패턴을 적용하여 ConverterFormatter를 일관성 있게 사용할 수 있도록 함.

🔹 HttpMessageConverter

  • ConversionService가 적용되지 않음.
  • 역할:
    1. 요청 메시지 본문(RequestBody)을 객체로 변환하거나
    2. 객체를 응답 본문(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

profile
반갑습니다. 백엔드 개발자가 되기 위해 노력중입니다.

0개의 댓글