본문 바로가기
IT 학습/Spring

RestTemplate json 데이터 전송시 HttpMessageConverter 에러 발생하는경우

by A.S.L 2021. 1. 8.

최근 spring 4.3x -> 5.3x 버전을 변경하고나서 어느 한 코드에서 오류가 지속적으로 발생하는 현상이 있었습니다.

(기존 서비스 코드는 변경x)

 

"No HttpMessageConverter for java.util.Collections$SingletonMap and type "application/json;charset=EUC-KR"

 

기존에 잘 동작하던 부분에서 갑자기 메세지 사용가능한 컨버터가 없다는 오류를 던지고 있었습니다.

 

기존코드


 

 

발생원인 


AbstractJackson2HttpMessageConverter canWirte 부분에 인코딩을 체크하는 로직이 아래처럼 추가되었습니다.

 

 

빨간줄 친 부분처럼 ENCODINGS map에 들어있는 인코딩만 허용하도록 코드가 추가되어 있었고

ENCODINGS에는 세팅되는 값은 아래와 같으며 US-ASCII 부분도 JsonEncoding에 포함되지 않은 부분은 추가로 세팅 해주고 있습니다.

 

 

 

위 변경과 관련해서는 아래와 같은 내용이 있었습니다.

 

https://github.com/spring-projects/spring-framework/commit/eb0aae066c83ae0b7be280bd5c9e0679ed394a92#diff-a8617e83ec66c776272480fb9bacb4bc2ed98bfd170ed0f584708acf196cdf8d

 

요약해보면 이전 코드에서는 canRead, canWrite 메소드에서 미디어 타입 인코딩 체크를 하지 않았기 때문에 AbstractJackson2HttpMessageConverter와 서브 클래스들에서 "application/json;charset=ISO-8859-1" 과 같은 타입을 처리 할 수 있다고 알려져있었는데, 실상은 인코딩을 UTF-8로 바꿔서 세팅했다고 합니다.

 

 

즉, 이전 버전에서도 인코딩을 UTF-8로 세팅해서 리퀘스트를 날렸다는 말입니다.

 

poutsma님도 언급 해주셨듯, 이전 버전에 메세지 컨버터는 어떤 값으로 charset이 설정 되어있던, 모두 무시하고 UTF-8로 세팅했었다고 말해주고 있습니다.

 

 

 

결론


사실 JSON specification을 보면 아래처럼 나와있습니다.

https://www.ietf.org/rfc/rfc4627.txt

"JSON 은 유니코드로 인코딩되어야하고 기본은 UTF-8"

 

결국 제대로 알지 못하고 작성해둔 코드가, 프레임웍 버전이 올라가고 검증 로직이 추가되면서 에러를 던진거였습니다.

 

어떤 기술을 사용하던, 기술 스팩에 대해서 꼼꼼하게 알고 적용하는 습관을 갖는게 중요할 것 같습니다. : )