오늘부터 다시 TIL 힘내자!!
View를 응답하는 것이 아닌, Rest API(HTTP API)로 JSON, TEXT, XML 등의 데이터를 응답 Message Body에 직접 입력하는 경우 HttpMessageConverter를 사용한다.
일전에 Spring MVC 디자인패턴을 정리하면서 사용했던 사진이 있다.

요건데
여기서보면 ViewResolver가 존재한다.
ViewResolver는 HTTP 응답을 할 때 보여줄 Viw단이 있을 때 사용하는것이고
우리는 지금 est API(HTTP API)로 JSON, TEXT, XML 등의 데이터를 응답하는 경우가 많아서 이 뷰 리졸버 대신에 HttpMessageConverter를 사용한다.
저 사진에서 8~12번이 생략되는것임!!!!!
@RequestBody, HttpEntity<>, RequestEntity<> @ResponseBody, HttpEntity<>, ResponseEntity<>HttpMessageConverter는 요청과 응답 모두 사용된다.강의에서는 이 HttpMessageConverter의 대표적인 구현체 3가지를 소개했다.
각 구현체들은 공통적으로 읽을 수 있는지(canRead())와 쓸 수 있는지(canWrite())를 판별함.

byte[] Data를 처리한다.byte[]*/*application/octet-stream

JSON Data를 처리한다.Object, HashMapapplication/jsonapplication/json
| 키워드 | 설명 |
|---|---|
| 역할 | HTTP 메시지 <-> 자바 객체 자동 변환 |
| 관련 애노테이션 | @RequestBody, @ResponseBody, @RestController |
| 동작 시점 | 컨트롤러 매핑 전/후 |
| 대표 사용 | JSON ↔ 객체 변환 (Jackson 기반) |

여기서 HttpMessageConverter를 사용하면 요청 데이터가 변환이된다.
-> 즉, 요청이 Controller에 전달되는 HandlerAdapter와 Handler 사이에서 어떤 일이 일어난다! 는 것을 알 수 잇다.
저기 빨간 상자를 확대해보면

이런식으로 데이터가 왓다갔따한다.
그림에서 보이다 싶이 ArgumentResolver를 통하여 값이 준비되면 해당값을 가지고 실제 Controller를 호출한다.
Request로 받아온 값들을 정렬하고 Controller 입력에 맞는 값으로 고친다는 뜻!!
참고로 ArgumentResolver는 스프링 MVC에서 컨트롤러 메서드의 파라미터를 "자동 주입"해주는 핵심 컴포넌트 라고한다.
컴포넌트다!
📌HttpMessageConverter는 1️⃣ ArgumentResolver와 2️⃣ ReturnValueHandler에서 각각 사용된다.
얘는 인터페이스이다
Spring MVC에서 컨트롤러 메서드의 파라미터를 자동으로 바인딩하는 역할을 하는 인터페이스로 요청이 컨트롤러 메서드에 전달될 때 각 파라미터를 적절한 객체로 변환하여 주입하는 것을 담당한다.
사용가능한 파라미터 목록링크
https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/arguments.html
주요 인터페이스 : HandlerMethodArgumentResolver
얘도 인터페이스이다.
Spring MVC에서 컨트롤러 메서드가 반환하는 값을 처리하여 HTTP 응답에 맞게 변환하는 역할을 하는 인터페이스로 컨트롤러 메서드가 실행된 후 그 반환값을 HTTP 응답의 본문에 적절히 담아 전송할 수 있도록 도와준다.
주요 인터페이스 : HandlerMethodReturnValueHandler
Spring MVC의 설정을 사용자 정의할 수 있도록 제공되는 인터페이스로 implements하여 설정을 확장하거나 커스터마이징할 수 있다.
@Configuration 클래스에서 구현org.springframework.web.servlet.config.annotation.WebMvcConfigurer
주요 인터페이스
1. HandlerMethodArgumentResolver
2. HandlerMethodReturnValueHandler
3. HttpMessageConverter
- 모두 인터페이스로 구현되어 있으며 대부분 구현되어 있다.
- Spring에서 기본적으로 제공하고 있다.
- 개발자는 잘 사용하면 된다.

Converter, Formatter는 모두 타입 변환을 담당하는 인터페이스이다.
@RequestParam, @ModelAttribute, @PathVariable등에서 활용WebMvcConfigurer에서 addFormatters()로 등록Spring에서 객체의 타입을 서로 변환하는 데 사용되는 인터페이스로 Spring의 데이터 바인딩 과정에서 문자열을 특정 객체로 변환하거나 하나의 객체 타입을 다른 타입으로 변환할 때 사용한다.

사용할 때 라이브러리랑 파라미터 확인하기!!
예시
url :
localhost:8080/type-converter?person=wonuk:1200public class StringToPersonConverter implements Converter<String, Person> { // source = "wonuk:1200" @Override public Person convert(String source) { // ':' 를 구분자로 나누어 배열로 만든다. String[] parts = source.split(":"); // 첫번째 배열은 이름이다. -> wonuk String name = parts[0]; // 두번째 배열은 개월수이다. -> 1200 int months = Integer.parseInt(parts[1]); // 개월수 나누기 12로 나이를 구하는 로직 (12개월 단위만 고려) int age = months / 12; return new Person(name, age); } }요런식으로 만들어서
Converter+ConversionService조합으로 많이 사용된다고 함!!
ConversionService선언해주고addConverter으로 컨버터 추가
주로 사용자 지정 포맷을 적용해 데이터 변환을 처리할 때 사용된다.
Formatter는ConversionService와 비슷한 목적을 가지지만 문자열을 객체로 변환하거나 객체를 문자열로 변환하는 과정에서 포맷팅을 세밀하게 제어할 수 있다.
정의 : 문자열 ↔ 객체 간 변환에서 포맷팅이 필요한 경우 사용 (날짜, 통화 등)
Formatter<T> (String ↔ T)공식문서 : https://docs.spring.io/spring-framework/reference/core/validation/format.html
Fomatter이다.Converter보다 조금 더 세부적인 기능이라고 생각하면 된다.예시
@Data (<< 어노테이션 사용 주의 - 쓰지말것) public class FormatForm { @NumberFormat(pattern = "#,###.##") private BigDecimal price; @DateTimeFormat(pattern = "dd-MM-yyyy") private LocalDate orderDate; }직접 어떤식으로 변환할건지 형식을 지정할 수 잇음!
구조적인 차이때문에 스프링에서 Formatter를 사용할 때, 입력값이 JSON으로 들어오면 우리가 기대한 대로 포매팅이 안된다.
JSON 요청 (@RequestBody)
HttpMessageConverter가 처리함.MappingJackson2HttpMessageConverter가 작동.ConversionService (Formatter 포함)는 사용되지 않음!@DateTimeFormat이나 직접 만든 Formatter가 무시됨.폼 데이터 (@ModelAttribute, @RequestParam)
ConversionService가 작동됨.@DateTimeFormat, @NumberFormat, 사용자 정의 Formatter가 제대로 작동함.따라서,
@RequestBody (JSON)요청방식은 Formatter 미적용 됨!!
→ ✅ @JsonFormat, Deserializer 사용해야 함
| 요청 방식 | 사용 가능한 포매터 |
|---|---|
@RequestParam, @ModelAttribute | ✅ @DateTimeFormat, Formatter, ConversionService |
| @RequestBody (JSON) | ❌ Formatter 미적용 → ✅ @JsonFormat, Deserializer 사용해야 함 |
| 항목 | 설명 |
|---|---|
| 목적 | 타입 변환을 담당함 (문자열 → 객체 등) |
| 사용처 | @RequestParam, @ModelAttribute, @PathVariable 등에서 활용 |
| 등록 방법 | WebMvcConfigurer에서 addFormatters()로 등록 |
| 사용 대상 | 스프링의 ConversionService가 이를 관리 |
ConversionService와의 관계| 항목 | 설명 |
|---|---|
| ConversionService | Converter와 Formatter를 한곳에서 통합 관리하는 인터페이스 |
| DefaultFormattingConversionService | ConversionService + Formatter 기능 포함 |
| 등록 | WebMvcConfigurer#addFormatters()에서 등록 |
Converter는 단순한 타입 변환, Formatter는 포맷이 중요한 변환.
이 둘은 ConversionService에서 함께 관리되고, 스프링 MVC에서 자동으로 적용된다.