seaking110 님의 블로그
HttpMessageConverter란 무엇인가 본문
HttpMessageConverter 란
- HttpMessageConverter 동작 순서
- 클라이언트의 요청
- 컨트롤러
- HttpMessageConverter
- 클라이언트로 반환
- HttpMassageConverter가 적용되는 경우
- @RequestBody, HttpEntity<>, RequestEntity<>, ResponseEntity<> 등
- 요청과 응답 모두 사용
- canRead(), canWriter() 메서드로 class 및 MediaType 지원 여부 체크
boolean canRead(Class<?> clazz, @Nullable MediaType mediaType);
boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType);
- read(), write() 메서드로 HttpMessage를 읽고 쓴다.
T read(
Class<? extends T> clazz,
HttpInputMessage inputMessage
) throws IOException, HttpMessageNotReadableException;
void write(
T t,
@Nullable MediaType contentType,
HttpOutputMessage outputMessage
) throws IOException, HttpMessageNotWritableException;
우선 순위
- 우선 순위 1등
- ByteArrayHttpMessageConverter
- byte[] Date를 처리
- MediaType : */*
- 반환 : application/octet-stream
- ByteArrayHttpMessageConverter
- 우선 순위 2등
- StringHttpMessageConverter
- String Date를 처리
- MediaType : */*
- 반환 : text/plain
- StringHttpMessageConverter
- 우선 순위 3등
- MappingJackson2HttpMessageConverter
- JSON Date를 처리
- object, HashMap이 대상
- MediaType : application/json
- 반환 : application/json
- 가장 중요함
- MappingJackson2HttpMessageConverter
ArgumentResolver
- Spring MVC에서 컨트롤러 메서드의 파라미터를 자동으로 바인딩하는 역할을 하는 인터페이스
- 요청이 컨트롤러 메서드에 전달될 때 각 파라미터를 적절한 객체로 변환하여 주입
- RequestBodyArgumentResolver (@RequestBody)
- RequestBody를 처리하는 Resolver 클래스
- RequestHeaderArgumentResolver (@RequestHeader)
- RequestHeader를 처리하는 Resolver 클래스
- HandlerMethodArgumentResolver
- ArgumentResolveer의 실제 이름
- 인터페이스로 구성
- 따라서 확장하여 커스텀하여 사용 가능
- supportParameter()를 활용하여 메서드의 파라미터를 지원하느지 여부 검사
- 지원한다면 객체로 만들어서 전달
- 따라서 supportParameter()를 사용하는 다양한 ArgumentResolver 구현체 생성 가능
ReturnValueHandler
- 컨트롤러 메서드가 반환하는 값을 처리하여 HTTP 응답에 맞게 변환하는 역할 수행
- ModelAndViewMethodReturnValueHandler (model and view 객체 반환)
- HttpEntityMethodReturnValueHandler (HttpEntity 객체 반환)
- HandlerMethodReturnValueHandler (ReturnValueHandler의 실제 이름)
- 인터페이스이므로 확장하여 구현 가능
데이터의 요청과 응답을 처리하는 과정
- RequestMappingHandlerAdater가 Request를 Argument Resolver로 전달
- Argument Resolver는 해당 Request의 타입에 맞는 HttpMessageConverter를 호출하여 필요한 객체로 변환
- 그후 변환한 데이터로 컨트롤러 호출
- 다시 컨트롤러가 반환한 값을 ReturnValueHandler로 전달
- ReturnValueHandler는 해당 반환 값을HttpMessageConverter를 호출하여 필요한 Response로 입력
- 즉 개발자는 HandlerMethodArgumentResolver, HandlerMethodReturnValueHandler, HttpMessageConverter라는 인터페이스를 잘 확장하여 사용하면 된다!
- 또한 기능을 확장 할때는 WebMvcConfigurer를 상속 받아서 Spring Bean으로 등록하고 구현하면 된다!
- addArgumentResolvers()
- addReturnValueHandlers()
- extendMessageConverters()
- 필요한 메서드를 오버라이딩 하면된다.
- @Configuration 사용
TypeConverter
- localhost:8080/qwer?person=youjung:20
- 입력 받은 문자열 데이터를 person 객체로 변환하는 방법
- Converter 인터페이스를 활용하여 새로운 타입을 만들어서 구현 가능
- 주의점
- org.springframework.core.convert.converter를 import 해야함!!
- Converter <S, T> S는 변환할 Source, T는 변환할 Type으로 설정
- Converter
- 기본적인 형 변환을 담당하는 인터페이스
Formatter
- 인터페이스로 되있어서 구현체로 구현 가능
- Printer
- 객체를 String으로로 변환
- Parser
- String을 객체로 변환
- Spring에서 Annotation
- Dto 필드에 대부분 적용
- @NumberFormat
- 숫자 관련 지정 Formatter
- @DateTimeFormat
- 날짜 관련 지정 Formatter
- 하지만 JSON에서의 직렬화나 역직렬화 과정에서는 수행되지 않음
- 따라서 @JsonFomat이나 커스텀 Deserializer를 사용하는 방식 필요
마무리 정리
HttpMessageConverter
- 사용처
더보기
HTTP 요청 : @ReqeustBody, HttpEntity<>, RequestEntity<>
HTTP 응답 : @ResponseBody, HttpEntity<>, ResponseEntity<>
- 우선 순위
더보기
1. Byte[]
2. String
3. JSON
ArgumentResolver
더보기
HTTP 요청이 컨트롤러 메서드에 전달될 때 각 파라미터에 알맞은 객체로 변환하는 인터페이스
ReturnValueHandler
더보기
컨트롤러 메서드가 반환하는 값을 처리하여 HTTP 응답에 맞게 변환하는 인터페이스
Converter
더보기
특정 타입을 다른 타입으로 변환할 때 사용하는 인터페이스
Formatter
더보기
사용자 지정 포맷을 적용하여 데이터 변환을 처리할 때 사용하는 인터페이스
JSON을 객체로 변환하는 방법
더보기
Deserializer 또는 @JsonFormat 사용
'Today I Learned' 카테고리의 다른 글
테스트 코드! (0) | 2025.02.25 |
---|---|
N+1 문제 + 동시성 제어 (0) | 2025.02.24 |
뉴스 피드 팀 프로젝트를 마치며 (0) | 2025.02.20 |
[Git] Conventional Commits에 대해 (0) | 2025.02.18 |
테이블 설계와 정규화 (0) | 2025.02.17 |