TypeReference
Jackson 라이브러리를 사용하여 JSON을 역직렬화할 때, 제네릭 타입 정보를 보존하기 위해 사용한다.
∨ ObjectMapper.readValue() 에서 안전한 매핑 가능
ObjectMapper.readValue(arg, type) 의 두번째 인자에 타입정보를 표기할 수 있다.
변환대상인 arg를 어떤 타입으로 매핑할 것인가의 정보를 주는 것이다.
만약 json을 어디선가 받아와서 변환하고 싶다면, type에는 Class 타입 또는 TypeReference가 온다.
특히 TypeReference를 ObjectMapper에 사용하면 경고(ClassCastException 발생 가능 경고)가 나지 않게 할 수 있다.
mapper.readValue(json, ArrayList.class);
mapper.readValue(json, new ArrayList<HashMap<String, String>>().getClass());
mapper.readValue(json, new TypeReference<ArrayList<HashMap<String, String>>>(){});
mapper.readValue(json, new TypeReference<Map<String, Object>>);
등..
왜 TypeReference 사용시 type safe 해질까?
만약 두번째 인자에 제네릭을 사용해서 HashMap<String, String> map = mapper.readValue(json, HashMap<String, String>.class) 를 실행하면, json을 완전 type safe하게 받아올 수 있는 것 아닌가?
그렇게 생각할 수 있지만 제네릭 타입 소거 규칙 (Generic Type Erasure) 때문에, 명시한 HashMap<String, String>은 런타임시 HashMap<Object, Object>가 되어버린다. 따라서 json 문자열을 역직렬화할 때 타입 정보를 알 수가 없어지고, 보장할 수 없고, ClassCastException 발생 가능하다.
그럼 도대체 TypeReference가 어떤 구조길래, 런타임시 타입 정보를 보존 가능한지?
TypeReference는, 타입 정보를 보존할 수 있는 Super Type Token이라는 방식을 차용하기 때문이다.
Super Type Token 방식을 쉽게 사용하게끔 한 것이 TypeReference라고도 볼 수 있다.
이 내용은 생략하지만 이 블로그에 설명이 잘 되어있다: https://yangbongsoo.gitbook.io/study/super_type_token
'JAVA' 카테고리의 다른 글
[Java] Generic Type erasure / 제네릭 타입 소거 (0) | 2024.08.22 |
---|---|
[Java] 시간낭비 방지 메모: HashXX를 보고 O(1)을 곧바로 떠올렸어야지...! (1) | 2023.12.06 |
[JDBC] DB Connection을 얻어서 query 실행 | DriverManager과 DataSource를 통하여 (+ Connection Pool 개념) (0) | 2023.01.11 |
[JAVA] Iterator의 remove() 이해하기 (0) | 2022.09.08 |
[Java] String 연결하기(더하기) 효율적인 방법 (0) | 2022.09.07 |