Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

seaking110 님의 블로그

HttpMessageConverter란 무엇인가 본문

Today I Learned

HttpMessageConverter란 무엇인가

seaking110 2025. 2. 21. 17:26

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
  • 우선 순위 2등
    • StringHttpMessageConverter
      • String Date를 처리
      • MediaType : */*
      • 반환 : text/plain
  • 우선 순위 3등
    •  MappingJackson2HttpMessageConverter
      • JSON Date를 처리
      • object, HashMap이 대상
      • MediaType : application/json
      • 반환 : application/json
      • 가장 중요함

 

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