Post

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

원래 그 데이터 타입으로는 캐스팅 가능
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
@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
5
@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.