제네릭의 매개변수 타입과 Class<T>

임현규·2023년 2월 28일
0

문제 요약

ResponseEntity<Map> responseEntity = restTemplate.exchange(
			provider.getUserInfoEndpoint().getUri(),
			HttpMethod.GET,
			requestUserInfoEntity,
			Map.class
		);

restTemplate.exchange() 메서드를 활용해 ResponseEntity<Map<String, Object>> 타입의 데이터를 가져와야 하는 상황이 있었다. 문제는 restTemplate에 들어갈 인수에 Class<T>가 있었는데 이것은 해당 타입의 .class를 넣어야 하는 상황이었다.

ResponseEntity<Map>으로 로 타입으로 받는다면 컴파일러에서 로타입에 대한 경고가 뜬다. 그리고 타입에 대해서 안정적이지 않고 자바의 교과서라 불리는 이펙티브 자바에서도 사용하지 않을 것을 추천한다.

문제는 Map의 매개변수 타입 2개를 Class<T>로 표현할 수 없다. Map.class로만 표현 가능하기 때문에 다른 방법을 찾아야 한다.

ParameterizedTypeReference

ParameterizedTypeReference는 Spring에서 제공하는 제네릭 타입의 정보를 유지하고 추출하기 위한 유틸리티 클래스이다. 해당 클래스를 이용하면 컴파일에 의해 타입 소거되는 타입 정보를 유지하고, 타입 정보를 추출하는 메서드를 제공한다. 이러한 방식을 이용해서 Class<T>에서 T가 제네릭 타입이여도 컴파일러 오류 또는 로 타입을 사용한 경고 없이 타입 안전하게 코드를 작성할 수 있다.

ResponseEntity<Map<String, Object>> responseEntity = restTemplate.exchange(
			provider.getUserInfoEndpoint().getUri(),
			HttpMethod.GET,
			requestUserInfoEntity,
			new ParameterizedTypeReference<>() {
			}
		);

해당 코드는 위의 문제점 코드를 개선한 코드이다.

profile
엘 프사이 콩그루

0개의 댓글