Develop/JAVA

[Java] REST API 호출 및 JSON 데이터를 DTO로 파싱하는 방법

issuemaker99 2025. 1. 8. 17:15
728x90

REST API를 호출하여 리턴받은 JSON 데이터를 Java DTO로 파싱하는 방법을 알아보겠습니다. 이번 예제는 JSON 데이터가 2-Depth 구조를 가지며, DTO 내부에 또 다른 DTO를 포함하는 구조를 가정합니다.

1. 준비 사항

REST API 호출과 JSON 파싱을 위해 다음 라이브러리를 사용합니다:

  • HttpClient (Java 11+ 기본 제공)
  • Jackson 라이브러리 (com.fasterxml.jackson)
<!-- Maven 의존성 추가 -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version>
</dependency>

 


2. JSON 데이터 예시

아래와 같은 JSON 데이터를 REST API로부터 받는다고 가정합니다.

{
  "id": 1,
  "name": "John Doe",
  "address": {
    "street": "123 Main St",
    "city": "Springfield",
    "zipCode": "12345"
  }
}

 


3. DTO 클래스 정의

JSON 데이터에 맞는 DTO 클래스를 정의합니다.

// Address DTO
public class AddressDto {
    private String street;
    private String city;
    private String zipCode;

    // Getters and Setters
    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getZipCode() {
        return zipCode;
    }

    public void setZipCode(String zipCode) {
        this.zipCode = zipCode;
    }

    @Override
    public String toString() {
        return "AddressDto{" +
                "street='" + street + '\'' +
                ", city='" + city + '\'' +
                ", zipCode='" + zipCode + '\'' +
                '}';
    }
}

// User DTO
public class UserDto {
    private int id;
    private String name;
    private AddressDto address;

    // Getters and Setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public AddressDto getAddress() {
        return address;
    }

    public void setAddress(AddressDto address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "UserDto{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", address=" + address +
                '}';
    }
}

 


4. REST API 호출 및 JSON 파싱

HttpClient를 사용하여 REST API를 호출하고 Jackson 라이브러리로 JSON 데이터를 DTO로 파싱합니다.

import com.fasterxml.jackson.databind.ObjectMapper;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;

public class RestApiExample {
    public static void main(String[] args) {
        try {
            // 1. HttpClient 생성
            HttpClient client = HttpClient.newHttpClient();

            // 2. HttpRequest 생성
            HttpRequest request = HttpRequest.newBuilder()
                    .uri(URI.create("https://api.example.com/user")) // REST API URL
                    .GET()
                    .build();

            // 3. REST API 호출
            HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

            // 4. JSON 파싱
            ObjectMapper objectMapper = new ObjectMapper();
            UserDto user = objectMapper.readValue(response.body(), UserDto.class);

            // 5. 결과 출력
            System.out.println("Response DTO: " + user);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 


5. 실행 결과

REST API가 아래 JSON을 반환한다고 가정합니다:

{
  "id": 1,
  "name": "John Doe",
  "address": {
    "street": "123 Main St",
    "city": "Springfield",
    "zipCode": "12345"
  }
}

 

프로그램 실행 시, 출력은 다음과 같습니다:

Response DTO: UserDto{id=1, name='John Doe', address=AddressDto{street='123 Main St', city='Springfield', zipCode='12345'}}

 

6. 마무리

위 예제는 JSON 데이터를 Java DTO로 파싱하는 가장 기본적인 방법입니다. Jackson 라이브러리는 강력한 기능을 제공하며, 복잡한 JSON 데이터도 쉽게 처리할 수 있습니다.

팁:

  • REST API 호출이 많다면, Retrofit 또는 Spring WebClient를 활용해도 좋습니다.
  • JSON 데이터가 복잡한 경우, DTO 클래스에 @JsonProperty를 사용해 JSON 필드 이름과 매핑할 수 있습니다.
LIST