Post

RestTemplate은 어떻게 response Object를 DataType 로 변환하는가

원래 그 데이터 타입으로는 캐스팅 가능
1
2
3
4
5
6
7
8
9
10
@Test
fun `테스트`() {
    val obj: Object = Coffee("id", "name") as Object
    val coffee: Coffee = obj as Coffee
    // 이건 원래 그 데이터가 Coffee라서 가능
 
    val obj2: Object = Object()
    val coffee2: Coffee = obj2 as Coffee
    // 이건 불가능. id 속성이랑 name 속성이 없으니까 당연 불가능하다
}

RestTemplate의 response Object -> T type casting 과정

  • RestTemplate도 내부적으로는 (T) 캐스팅을 이용하게 되는데
  • extractData()에서 비검사 형변환 경고를 제어하기 위해 @SuppressWarnings로 경고를 억제해준다.
1
2
3
4
@SuppressWarnings({"unchecked", "rawtypes", "resource"})
public T extractData(ClientHttpResponse response) throws IOException {
    ...
    return (T) genericMessageConverter.read(this.responseType, null, responseWrapper);
  • genericMessageConverter는 인터페이스
  • jackson을 사용시 MappingJackson2HttpMessageConverter를 구현체로 사용하게 됨
    • jackson은 ObjectMapper.read()를 이용하게 됨.
    • ObjectMapper.read() 와 그 안의 메서드를 실행하면서 type 정보가 일치하는지 보는 것 같다
      • Type 별로 다른 Deserializer를 사용하는 것 같은데 findRootDeserializer() 같은 메서드를 호출하는걸로 봐서는 context 상에서 Deserializer를 찾고, 없으면 새로 만드는 듯.
    • jackson deserialize mapping 기준에 대해서는 [Java] Jackson ObjectMapper Serialization 참고
This post is licensed under CC BY 4.0 by the author.