본문 바로가기
Web Programming

Java Map객체를 Pojo(Model) class로 변환 ( JsonSetter, ObjectMapper 사용법 )

by 맑은안개 2022. 11. 24.

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 객체로 변경 (관련된 서비스 인터페이스, 컨트롤러를 모두 변경해야 합니다.)
  • ObjectMapperconvertValue를 사용하여 변환 후, 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"
}
반응형