[공부정리] RestTemplate list 반환 방법

jeyong·2024년 1월 24일
0

공부 / 생각 정리  

목록 보기
7/121


스프링에 대해서 여러가지 공부를 하던중, 정리 해놓으면 좋을 것 같은 주제를 정리하려고 한다.
이번에 다를 주제는 RestTemplate list 반환 방법이다. 해당 주제만을 들으면 이게 무슨소리지라고 생각할 것이 분명하다. 해당 주제를 다루게 된 이유는 정말 간단하다. 연구실 과제를 진행중에 있는데, 객체 검출 서버에 사진과 함께 요청을 보내면 검출된 정보들에 대해서 리스트로 제공되는데 해당 정보를 깔끔하게 받는 방법이 궁금했고, 해당 정보를 공부하기 시작하였다.
또한 restTemplate은 Mock 테스트에서도 종종 사용하기 때문에 정리해놓으면 언젠가 쓰지않을까라고 생각한다.

1. 기존 코드

HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers);
ResponseEntity<SnackDto[]> responseEntity = restTemplate.exchange(baseUrl, HttpMethod.POST, requestEntity, SnackDto[].class);

SnackDto[] snackDtos = responseEntity.getBody();

기존에서는 SnackDto[] 와 같이 배열을 사용하여 반환받는다. 해당 방법을 사용하여 받을 경우 평소 사용하는 리스트의 구조와는 달라져 코드를 다르게 구현해야한다는 귀찮음이 발생한다. 그렇다면 리스트로 받을 수 는 없을까?

2. List 사용

List<Resultclass> list = restTemplate.getForObject(baseUrl, List.class);

컴파일에는 문제가 없지만 호출하고 나서 list 값을 살펴보면 ResultClass 객체가 아닌 LinkedHashMap 객체를 가지고 있는 걸 확인할 수 있다. 왜냐하면 Java Generic 은 compile 시점에 소거된다. 그래서 문제가 발생하는 것이다.

2. ParameterizedTypeReference 사용

springframework 3.2 이후 ParameterizedTypeReference를 지원하여 리스트로 받아올 수 있다. 수정된 코드는 아래와 같다.

responseEntity<List<SnackDto>> responseEntity;
        try {
            responseEntity= restTemplate.exchange(baseUrl, HttpMethod.POST, requestEntity, new ParameterizedTypeReference<List<SnackDto>>() {});
        } catch (ResourceAccessException e) {
            throw new NullResponseFromApiException();
        }
        List<SnackDto> snackDtos = responseEntity.getBody();

new ParameterizedTypeReference<List>() {} 를 사용해서 반환되는 정보를 리스트로 받아오는 것에 성공하였다.

여기까지 온다면 궁금점이 생길 것이다. 왜냐하면 앞에서 제네릭으로 지정한 타입들은 Compiler 에 의해 소거되기 때문이다. 하지만 해당 코드에서는 잘 받아온 모습이다. 해당 이유에 대해서 간단하게 정리하자면 아래와 같다.

  • Super Type Token 의 전형적인 방식인 getGenericSuperClass 메소드 호출을
    통한 Generic Type 정보를 미리 저장한다.
  • abstract class 로 선언함으로써 강제로 익명 클래스를 사용하도록 유도한다.

3. 마무리

마지막으로 굉장히 잘 정리되어 있는 블로그를 하나 추천하고 마무리하겠다.

[Java] Generic Parameterized Type 정보를 런타임까지 유지하는 법? Super Type Token!

해당 게시글을 통해서 ParameterizedTypeReference이 왜 만들어지게 되었는지 또한 공부한다면, 이해하는데 도움이 많이 될 것이며 굉장히 잘 사용할 수 있을 것이다.

profile
노를 젓다 보면 언젠가는 물이 들어오겠지.

0개의 댓글