DevBoi

[Message Converter] 메시지 컨버터에 대해 알아보자 본문

Develop

[Message Converter] 메시지 컨버터에 대해 알아보자

HiSmith 2021. 12. 1. 17:36
반응형

Message Converter는 XML이나 JSON을 이용한 AJAX 기능이나, 웹서비스 기능을 개발할때 주로 사용할수있다.

HTTP 요청 메시지 본문과 HTTP 응답 메시지 본문을 통째로 메시지로 다루는 방식이다.

 

우선 Message Converter를 이해하기 위해서는, 사전 지식이 필요한 부분이있다.

 

* JAXB - xml은 이제, 데이터를 표현하는 표준이다. Java object를 String 과 맞춰주는 Json파싱방법이 존재하는 것처럼

xml과 java Object를 파싱하는 기술 SAXparser와 Domparser들이 나왔다. 또한 해당 파서를 사용하면서 즉각 적으로 테스트가 가능하도록 하는 기술이 JAXB이며, Java Architecture for XML Bind 의 약자이다.

 

* 언마샬링 - XML -> java Object 직렬화

* 마샬링 - java object -> xml 로 직렬화

 

 

1. 사용 종류

AnnotationMethodHandlerAdapter를 통해 등록된다. 기본 4가지가 제공된다.

 

1.ByteArrayHttpMessageConverter

(요청 받을때)지원하는 오브젝트 타입은, byte[] @RequestBody로 전달 받을때는, 모든 종류의 HTTP요청 메시지 본문을 byte배열로 가져올수 있다. 

반대로 @ResponseBody로 응답을 줄때는, application/octet-stream 으로 설정된다.

바이너리 포맷을 가진 정보를 주고 받아야 하는 시스템이 있다면, 활용 가능하다.

 

2.StringHttpMessageConverter

지원하는 오브젝트는 스트링 타입이다. 미디어 타입은 모든 종류를 허용한다.

HTTP가 기본적으로 텍스트 기반의 포맷이므로 가공하지 않은 본문을 직접 받아서 사용하고싶은 경우에 사용한다.

공개된 XML,JSON과 같은 형식외에 직접 정의한 문서 포멧이 있다면, 적절한 파서를 붙여서 활용할 수 있도록 문자열로 받는 것이 편리하다.

 

3.FormHttpMessageConverter

폼데이터를 주고 받을때 사용할수 있지만, 오브젝트 타입은 다중값을 갖는 맵확장 인터페이스인, MultiValueMap을 지원하고, 해당 정보는

ModelAttribute를 이용해 바인딩이 더 편하기 때문에 잘 사용하지 않는다.

 

4. SourceHttpMessageConverter

XML문서를 Source타입의 오브젝트로 전환하고싶을때 유용하게 쓸 수 있다. 최근에는 OXM기술발달로 XML을 바로 자바 오브젝트로 변환하는 경우가 많기 때문에 그다지 많이 쓰이지 않는다.

 

 

===========================실제로 많이 쓰이는 HttpMessageConverter 종류==========================

 

1. Jaxv2RootElementHttpMessageConverter

JAXB2의 @XmlRootElement 와 @XmlType 이 붙은 클래스를 이용해서 XML 과 오브젝트 사이의 메시지 변환을 지원한다. 기본적으로 SourceHttpMessageConverter 와 동일한 XML 미디어 타입을 지원한다. 오브젝트는 두 가지 에노테이션 중 하나가 적용됐다면 어떤 타입이든 사용할 수 있다.

JAXB2의 스키마 컴파일러를 통해 생성된 바인딩용 클래스를 이용해서 손쉽게 XML 과 오브젝트 사이의 변환 기능을 이용할 수 있다. JAXB2에 숙련된 개발자라면 이를 이용해 편리하게 XML 문서 기반의 컨트롤러를 만들 수 있다.



2.MarshallingHttpMessageConverter

스프링의 OXM 추상화의 Marshaller 와 Unmarshaller 를 이용해서 XML 문서와 자바 오브젝트 사이의 변환을 지원해주는 컨버터다. MarshallingHttpMessageConverter 를 빈으로 등록할 때 프로퍼티에 marshaller 와 unmarshaller 를 설정해줘야 한다. 미디어 타입은 다른 XML 기반 메시지 컨버터와 동일하며, 지원 오브젝트는 unmarshaller 의 supports() 메소드를 호출해서 판단한다. OXM 기술을 자유롭게 선택해서 XML 문서 기반의 컨트롤러를 작성하려고 한다면 편리하게 이용할 수 있다. 단, Marshaller 의 개수만큼 MarshallingHttpMessageConverter 를 등록해줘야 하는 것이 조금 번거로울 수 있다.



 

3.MappingJacksonHttpMessageConverter

Jackson ObjectMapper 를 이용해서 자바 오브젝트와 JSON 문서를 자동변환해주는 메시지 컨버터다. 지원 미디어 타입은 application/json 이다. 자바 오브젝트 타입에 제한은 없지만 프로퍼티를 가진 자바빈 스타일이거나 HashMap 을 이용해야 정확한 변환 결과를 얻을 수 있다.

Jackson 프로젝트의 ObjectMapper 가 대부분의 자바 타입을 무난히 JSON 으로 변환해주지만 날짜나 숫자 등에서 포맷을 적용하는 등의 부가적인 변환 기능이 필요하다면 ObjectMapper 를 확장해서 적용할 수 있다.

 

 

 

 

위의 세 가지 메시지 컨버터를 사용하려면 다음과 같이 AnnotationMethodHandlerAdapter 빈을 등록하고 messageConverters 프로퍼티에 등록해줘야 한다. 여타 전략과 마찬가지로 전략 프로퍼티를 직접 등록하면 디폴트 전략은 자동으로 추가되지 않는다는 점을 주의하자.

 

 

다음에는 해당 컨버터를 사용하는 예제를 진행해보도록하자

반응형