Map객체를 Pojo기반의 Model객체로 변환하는 법을 알아봅니다.
📃 MoneyService.java
public interface MoneyService {
public Map<String, String> fetchCurrencyExchangeRate(String fromCurrrencyCode, String toCurrencyCode);
}
📃 MoneyServiceFake.java
위 서비스 인터페이스를 구현한 Fake객체입니다. 실제 API 인터페이스를 하기 전에 사전 테스트 용으로 사용했습니다.
@Service
public class MoneyServiceFake implements MoneyService {
@Override
public Map<String, String> fetchCurrencyExchangeRate(String fromCurrrencyCode, String toCurrencyCode) {
Map<String, String> result = new HashMap<>() {
{
put("1. From_Currency Code", "USD");
put("2. From_Currency Name", "United States Dollar");
put("3. To_Currency Code", "KRW");
put("4. To_Currency Name", "South Korean Won");
put("5. Exchange Rate", "1336.13000000");
put("6. Last Refreshed", "2022-11-24 00:30:45");
put("7. Time Zone", "UTC");
}
};
return result;
}
}
컨트롤러는 Json으로 파싱하여, 다음의 결과를 반환합니다.
{
"1. From_Currency Code": "USD",
"4. To_Currency Name": "South Korean Won",
"6. Last Refreshed": "2022-11-24 00:30:45",
"7. Time Zone": "UTC",
"5. Exchange Rate": "1336.13000000",
"3. To_Currency Code": "KRW",
"2. From_Currency Name": "United States Dollar"
}
Dependency 추가
Object매핑 라이브러리를 추가합니다.
implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.4.2'
📃 CurrencyEnchange.java
package com.trip.biz.money.model;
import com.fasterxml.jackson.annotation.JsonSetter;
import lombok.Getter;
@Getter
public class CurrencyExchangeDTO {
@JsonSetter("1. From_Currency Code")
private String fromCurCode;
@JsonSetter("2. From_Currency Name")
private String fromCurName;
@JsonSetter("3. To_Currency Code")
private String toCurCode;
@JsonSetter("4. To_Currency Name")
private String toCurName;
@JsonSetter("5. Exchange Rate")
private String exchangeRate;
@JsonSetter("6. Last Refreshed")
private String lastRefreshedAt;
@JsonSetter("7. Time Zone")
private String tz;
}
- Map객체의 Key값을 Model 객체에 매핑하기 위해
JsonSetter
사용합니다. - 단순 대소문자가 다른 경우 에러가 발생하므로, 위와 같이
JsonSetter
를 사용하여 매핑합니다. - 예제의 케이스는 Output으로 전달하려는
Key
값이 Model에 선언된 변수명과 동일하기 원하기 때문에, Setter를 각 변수에 지정했습니다. @Getter 를 사용하여 각 private 변수들의 Getter를 생성합니다. - 매핑되는 변수가 대소문자를 포함하여 모두 동일하다면, Lombok의 @Setter, @Getter만 설정합니다.
📃 MoneyServiceFake.java
@Service
public class MoneyServiceFake implements MoneyService {
final ObjectMapper mapper = new ObjectMapper();
@Override
public CurrencyExchangeDTO fetchCurrencyExchangeRate(String fromCurrrencyCode, String toCurrencyCode) {
Map<String, String> result = new HashMap<>() {
{
put("1. From_Currency Code", "USD");
put("2. From_Currency Name", "United States Dollar");
put("3. To_Currency Code", "KRW");
put("4. To_Currency Name", "South Korean Won");
put("5. Exchange Rate", "1336.13000000");
put("6. Last Refreshed", "2022-11-24 00:30:45");
put("7. Time Zone", "UTC");
}
};
CurrencyExchangeDTO ce = mapper.convertValue(result, CurrencyExchangeDTO.class);
return ce;
}
}
- Return 객체를 Map에서 DTO 객체로 변경 (관련된 서비스 인터페이스, 컨트롤러를 모두 변경해야 합니다.)
ObjectMapper
의convertValue
를 사용하여 변환 후, Return
Output
{
"fromCurCode": "USD",
"fromCurName": "United States Dollar",
"toCurCode": "KRW",
"toCurName": "South Korean Won",
"exchangeRate": "1336.13000000",
"lastRefreshedAt": "2022-11-24 00:30:45",
"tz": "UTC"
}
반응형
'Web Programming' 카테고리의 다른 글
Java 11 주요 특징 with 예제 샘플 코드 (0) | 2023.01.28 |
---|---|
Java - 문제 해결: UnrecognizedPropertyException: Unrecognized field (0) | 2022.11.24 |
Java - Lombok활용법, 쉽게 Builder class 만들기 (0) | 2022.10.14 |
gRPC - From Java(Spring) Client to Python Server 예제 (0) | 2022.09.02 |
문제해결: No ParameterResolver registered for parameter (0) | 2022.06.07 |