본문 바로가기

Spring/spring boot

RestTemplate generic response type 매핑 방법 - 삽질중인 개발자

반응형

- RestTemplate Exchange 매소드 ResponseType 을 Generic Type 으로 매핑하기 -

 

RestTemplate 을 사용하다 보면 Map 형태로 응답을 받아야 할 때가 있다.

이 포스팅에서는 resttemplate에서  map으로 응답받는 방법에 대해 포스팅한다.

 

우선 RestTemplate을 사용해서 API를 호출할 때 잘 만들어진 API라면 아래와 같은 형태를 갖고 있다.

//네이버 API 호출 
//https://developers.naver.com/docs/login/profile/

{
  "resultcode": "00",
  "message": "success",
  "response": {
    "email": "openapi@naver.com",
    "nickname": "OpenAPI",
    "profile_image": "https://ssl.pstatic.net/static/pwe/address/nodata_33x33.gif",
    "age": "40-49",
    "gender": "F",
    "id": "32742776",
    "name": "오픈 API",
    "birthday": "10-01"
  }
}

 

대부분 resultCode(API 상태) 와 message(메세지) 는 항상 있는 값이고 response(요청한 데이터) 부분만 변해

아래와 같은 제네릭타입의 응답데이터를 담을 수 있는 DTO를 만들어서 관리한다.

 

import lombok.Data;

@Data
public class ResponseDataDTO<T> {
	private String responseCode;
	private T response;
	private String message;
}

 

 

 

RestTemplate을 사용하여 API 통신을 하려고 하면 exchange 매소드의 responseType 타입 부분을 채워야 하는데 일반 클래스의 경우 그냥 responseDTO.class 를 해서 class를 넘겨주면 되는데 제네릭 타입의 경우는 이게 불가능해 아래의 방법으로 매핑을 시켜줘야 한다.

 

new ParameterizedTypeReference<ResponseDataDTO<Map<String,Object>>>() {} 를

사용하면 제네릭 타입으로 자동 매핑된다.

(ParameterizedTypeReference docs : 

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/ParameterizedTypeReference.html )

( Map<String,Object>  부분을 아무거나로 변경해서 받으면 됨. )

ResponseDataDTO<Map<String,Object>> responseDataDTO = 
	restTemplate.exchange(
    		API_URL ,
            HttpMethod.GET ,
            null, 
            new ParameterizedTypeReference<ResponseDataDTO<Map<String,Object>>>() {}
    ).getBody();

 

위에서는 귀찮아서 Map형태로 받았는데 이걸 원하는 DTO로 넣어주면 된다.

 

 

 

 

 

 

 

 

반응형