[SpringMVC] HTTP 메시지 컨버터

재호·2022년 7월 10일
0

스프링 MVC

목록 보기
3/3

HTTP 메시지 컨버터

컨트롤러에 @RequestBodyHttpEntity(RequestEntity)@ResponseBodyHttpEntity(ResponseEntity)가 있다면 HTTP 메시지 컨버터가 작동하게 된다.

HTTP 메시지 컨버터의 기본 작동은 아래와 같다.

  • canRead(), canWrite() : 메시지 컨버터가 해당 클래서, 미디어 타입을 지원하는 체크
  • read(), write(): 메시지 컨버터를 통해서 메시지를 읽고 쓰는 기능

스프링 부트의 기본 메시지 컨버터는 대표적으로 아래와 같다.(일부 생략)

0 = ByteArrayHttpMessageConverter
1 = StringHttpMessageConverter 
2 = MappingJackson2HttpMessageConverter

앞에 적힌 숫자는 우선순위이다.

  • ByteArrayHttpMessageConverter : byte[] 데이터를 처리한다.
    클래스 타입: byte[] , 미디어타입: / ,

  • StringHttpMessageConverter : String 문자로 데이터를 처리한다.
    클래스 타입: String , 미디어타입: /

  • MappingJackson2HttpMessageConverter : application/json
    클래스 타입: 객체 또는 HashMap , 미디어타입 application/json 관련

만약 HTTP 요청이 들어왔는데 컨트롤러에서 @RequestBody를 사용중이고 데이터 타입이 String이라면 바이트 메시지 컨버터는 클래스 타입에서 걸러지고 스트링 메시지 컨버터에게 우선순위가 넘어간다. 클래스 타입까지 맞았다면 HTTP 요청의 미디어타입을 확인하는데 스트링 컨버터 타입은 모든 미디어타입이 호환가능하기 때문에 문제없이 작동할 것이다.

하지만 만약 클래스타입이 객체타입이고 미디어타입은 text/plain 이라면 오류가 날 것이다.

RequestMappingHandlerAdapter

SpringMVC를 생각해보면 애노테이션 기반의 컨트롤러는 매우 매우 다양한 파라미어를 사용할 수 있다. 이런 유여한 처리 능력은 ArgumentResolver덕분이다.

ArgumentResolver

애노테이션 기반 컨트롤러를 처리하는 RequestMappingHandlerAdapter는 바로 이 ArgumentResolver를 호출해서 컨트롤러(핸들러)가 필요로 하는 다양한 파라미터의 값(객체)를 생성한다. 그리고 이렇게 파라미터의 값이 모두 준비되면 컨트롤러를 호출하면서 값을 넘겨준다.

또란 우리는 응답 부분에서도 이와 비슷한 도움을 받고 있다.

ReturnValueHandler

HandlerMethodReturnValueHandler를 줄여서 ReturnValueHandler라 부른다. ArgumentResolver와 비슷한데, 이것은 응답 값을 변환하고 처리한다.

HTTP 메시지 컨버터 위치


위에서 설명한 HTTP 메시지 컨버터ArgumentResolverReturnValueHandler에 각각 속해 있다. RequestMappingHandlerAdapter가 컨트롤러를 호출하며 argument들에 대해 적절한 리졸버를 요청하고 해당 리졸버는 메시지 컨버터를 통해 데이터를 변환하고 처리하는 것이다.
응답 또한 이와 마찬가지이다.

맺음

스프링은 오늘 소개한 HttpMessageConverter,HandlerMethodArgumentResolver,HandlerMethodReturnValueHandler 모두를 인터페이스로 제공한다. 따라서 필요하면 언제등지 기능을 확장하여 사용할 수 있다는 것을 알아두면 좋을 것이다.

profile
Java, Spring, SpringMVC, JPA, MyBatis

0개의 댓글