RestTemplate은 어떻게 response Object를 DataType <T>로 변환하는가
원래 그 데이터 타입으로는 캐스팅 가능
```kt
@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)`` 캐스팅을 이용하게 되는데
- ``kt extractData()``에서 비검사 형변환 경고를 제어하기 위해 ``kt @SuppressWarnings``로 경고를 억제해준다.
```java
@SuppressWarnings({"unchecked", "rawtypes", "resource"})
public T extractData(ClientHttpResponse response) throws IOException {
...
return (T) genericMessageConverter.read(this.responseType, null, responseWrapper);
```
- genericMessageConverter는 인터페이스
- jackson을 사용시 MappingJackson2HttpMessageConverter를 구현체로 사용하게 됨
- jackson은 ``kt ObjectMapper.read()``를 이용하게 됨.
- ObjectMapper.read() 와 그 안의 메서드를 실행하면서 type 정보가 일치하는지 보는 것 같다
- Type 별로 다른 Deserializer를 사용하는 것 같은데 ``kt findRootDeserializer()`` 같은 메서드를 호출하는걸로 봐서는 context 상에서 Deserializer를 찾고, 없으면 새로 만드는 듯.
- jackson deserialize mapping 기준에 대해서는 [Java] Jackson ObjectMapper Serialization 참고
'Java Stack > Spring' 카테고리의 다른 글
spring-webmvc 5.2.4 이하(springboot 2.2.5 이하) 버전에서 발생하는 응답지연 현상 (0) | 2021.01.14 |
---|---|
Java Servlet 이란 (0) | 2020.06.15 |
[Spring] profile로 alpha, beta, real 빌드 구분하기 (0) | 2020.03.03 |
[Spring] Controller에서 사용하는 애너테이션 (0) | 2019.09.25 |
Spring AOP / @annotation resolve (0) | 2019.07.30 |