메세지 컨버터는 어떻게 동작할까 - 3
응답시의 메세지 컨버터의 동작
사용자의 응답을 반환하는 동작이 완료되고 나면 RequestResponseBodyMethodProcessor
의 writeWithMessageConverters
가 수행됩니다. 이때 응답을 줄 Content-Type
을 먼저 결정하게 되는데, 이 과정은 Request의 Accept 값
과 메세지 컨버터들이 지원하는 타입
에 의해 결정됩니다.
acceptableTypes
reqest Accept의 헤더 값들
producibleTypes
등록된 메세지 컨버터들 중에 응답 본문에 해당하는 타입에 대해 변환을 지원하는 메세지 컨버터들이 지원하는 미디어 타입
이 두개의 리스트를 가지고 교집합을 통해 Content-Type
의 후보 리스트를 구하게 됩니다. 이렇게 선정된 후보들은 Media Type
의 Quality
를 통해 정렬을 해 우선순위를 가지게 됩니다. Quality 값
은 acceptableTypes
의 값을 사용하게 됩니다. 이렇게 정렬된 Media Type
중에서 와일드 카드 타입이 아닌 미디어 타입 중 퀄리티가 높은 미디어 타입이 응답에 사용될 미디어 타입으로 선택되고, 등록된 메세지 컨버터
들 중 canWrite
메소드로 해당 미디어 타입과 변환을 지원하는 컨버터를 통해 적절한 메세지 컨버터를 선택해 응답에 대한 정보를 HttpOutputMessage
에 변환해 줍니다.
QnA
- 메세지 컨버터의 우선순위는 어떻게 결정되나요?
메세지 컨버터의 우선순위는 등록한 순서로 결정됩니다.
List
> 형태로 저장되는데 Iterator를 통해 앞에꺼 부터 순회합니다.
- 응답시에 동일하게 높은 Quality가 있다면 어떤 미디어 타입을 선택하나요?
동일한 퀄리티가 존재한다면 미디어 타입의 파라미터 사이즈나, 메인 타입과 서드 타입의 와일드 카드 타입 여부를 검사합니다.
MediaType.sortBySpecificityAndQuality();
를 참고하시면 됩니다.