반응형
- 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 :
( Map<String,Object> 부분을 아무거나로 변경해서 받으면 됨. )
ResponseDataDTO<Map<String,Object>> responseDataDTO =
restTemplate.exchange(
API_URL ,
HttpMethod.GET ,
null,
new ParameterizedTypeReference<ResponseDataDTO<Map<String,Object>>>() {}
).getBody();
위에서는 귀찮아서 Map형태로 받았는데 이걸 원하는 DTO로 넣어주면 된다.
반응형
'Spring > spring boot' 카테고리의 다른 글
Spring Boot 이메일 인증 구현하기 - 삽질중인 개발자 (9) | 2021.02.14 |
---|---|
@ConfigurationProperties 사용법 - 삽질중인 개발자 (0) | 2020.06.01 |
Spring boot 로그 설정 및 출력 방법- logback 설정하기 - 삽질중인 개발자 (0) | 2020.05.24 |
spring boot static 파일 다운로드 구현 - 삽질중인 개발자 (0) | 2020.04.05 |
Spring boot oracle db 연동 , spring boot oracle jdbc 설정 - 삽질중인 개발자 (0) | 2019.12.16 |