Java에서 택배 조회 API를 HTTP 클라이언트로 직접 연동하는 방법을 안내합니다. 별도 SDK 없이 REST API를 활용하여 택배 조회 기능을 구현할 수 있습니다.

Java 11+라면 바로 시작 가능합니다
• Java 11부터 java.net.http.HttpClient 기본 제공 — 별도 HTTP 라이브러리 불필요
• JSON 파싱 라이브러리(Gson 또는 Jackson)만 추가하면 바로 시작 가능
• Spring Boot, Android 등 다양한 환경에서 동일한 API 사용

1. 의존성 추가

Java 11+ HttpClient는 JDK에 포함되어 있으므로 HTTP 요청을 위한 별도 라이브러리는 필요 없습니다. JSON 응답 파싱을 위해 Gson만 추가합니다.

Maven (pom.xml)

<dependency>
  <groupId>com.google.code.gson</groupId>
  <artifactId>gson</artifactId>
  <version>2.11.0</version>
</dependency>

2. API 키 설정

API 키와 Secret Key를 환경 변수에서 읽어옵니다.

String apiKey = System.getenv("DELIVERY_API_KEY");
String secretKey = System.getenv("DELIVERY_SECRET_KEY");
String authHeader = "Bearer " + apiKey + ":" + secretKey;
API 키를 코드에 직접 작성하지 마세요
Secret Key가 소스 코드에 포함되면 Git 저장소를 통해 노출될 수 있습니다. 반드시 환경 변수, application.properties, 또는 비밀 관리 시스템을 사용하세요.

3. 단건 조회

java.net.http.HttpClient를 사용하여 택배 조회 API를 호출합니다. Java 15+에서는 텍스트 블록(""")으로 JSON 문자열을 깔끔하게 작성할 수 있습니다.

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

HttpClient client = HttpClient.newHttpClient();

String body = """
    {
      "items": [{
        "courierCode": "cj",
        "trackingNumber": "1234567890"
      }]
    }
    """;

HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.deliveryapi.co.kr/v1/tracking/trace"))
    .header("Content-Type", "application/json")
    .header("Authorization", authHeader)
    .POST(HttpRequest.BodyPublishers.ofString(body))
    .build();

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());

4. 응답 파싱

Gson을 사용하여 JSON 응답을 파싱합니다. results 배열의 각 항목에서 success 필드로 건별 성공 여부를 확인합니다.

import com.google.gson.*;

JsonObject json = JsonParser.parseString(response.body()).getAsJsonObject();
JsonArray results = json.getAsJsonObject("data").getAsJsonArray("results");

for (JsonElement el : results) {
    JsonObject result = el.getAsJsonObject();
    if (result.get("success").getAsBoolean()) {
        JsonObject data = result.getAsJsonObject("data");
        System.out.println("상태: " + data.get("deliveryStatusText").getAsString());
        System.out.println("택배사: " + data.get("courierName").getAsString());
    } else {
        JsonObject error = result.getAsJsonObject("error");
        System.out.println("실패: " + error.get("code").getAsString());
    }
}

주요 응답 필드:

5. 다건 조회

items 배열에 여러 운송장을 넣으면 한 번의 API 호출로 동시에 조회할 수 있습니다. clientId를 지정하면 응답에서 어떤 주문인지 쉽게 식별할 수 있습니다.

String body = """
    {
      "items": [
        { "courierCode": "cj",     "trackingNumber": "1111111111", "clientId": "order_001" },
        { "courierCode": "lotte",  "trackingNumber": "2222222222", "clientId": "order_002" },
        { "courierCode": "hanjin", "trackingNumber": "3333333333", "clientId": "order_003" }
      ]
    }
    """;

HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.deliveryapi.co.kr/v1/tracking/trace"))
    .header("Content-Type", "application/json")
    .header("Authorization", authHeader)
    .POST(HttpRequest.BodyPublishers.ofString(body))
    .build();

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

JsonObject json = JsonParser.parseString(response.body()).getAsJsonObject();
JsonObject data = json.getAsJsonObject("data");
JsonObject summary = data.getAsJsonObject("summary");

System.out.println("전체: " + summary.get("total").getAsInt()
    + ", 성공: " + summary.get("successful").getAsInt()
    + ", 실패: " + summary.get("failed").getAsInt());

6. OkHttp 사용 예시

Android 개발이나 Spring 프로젝트에서 널리 사용되는 OkHttp로도 연동할 수 있습니다.

Maven 의존성

<dependency>
  <groupId>com.squareup.okhttp3</groupId>
  <artifactId>okhttp</artifactId>
  <version>4.12.0</version>
</dependency>

OkHttp 코드

import okhttp3.*;

OkHttpClient client = new OkHttpClient();

String jsonBody = """
    {
      "items": [{
        "courierCode": "cj",
        "trackingNumber": "1234567890"
      }]
    }
    """;

RequestBody requestBody = RequestBody.create(
    jsonBody, MediaType.parse("application/json"));

Request request = new Request.Builder()
    .url("https://api.deliveryapi.co.kr/v1/tracking/trace")
    .addHeader("Authorization", authHeader)
    .post(requestBody)
    .build();

try (Response response = client.newCall(request).execute()) {
    System.out.println(response.body().string());
}

7. Spring Boot 연동

Spring Boot에서는 WebClient를 사용하여 비동기 방식으로 API를 호출할 수 있습니다. RestTemplate도 사용 가능하지만, Spring 6부터는 WebClient 사용을 권장합니다.

import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;

@Service
public class TrackingService {

    private final WebClient webClient;

    public TrackingService() {
        this.webClient = WebClient.builder()
            .baseUrl("https://api.deliveryapi.co.kr")
            .defaultHeader("Authorization",
                "Bearer " + System.getenv("DELIVERY_API_KEY")
                + ":" + System.getenv("DELIVERY_SECRET_KEY"))
            .defaultHeader("Content-Type", "application/json")
            .build();
    }

    public Mono<String> trace(String courierCode, String trackingNumber) {
        String body = String.format("""
            {
              "items": [{
                "courierCode": "%s",
                "trackingNumber": "%s"
              }]
            }
            """, courierCode, trackingNumber);

        return webClient.post()
            .uri("/v1/tracking/trace")
            .bodyValue(body)
            .retrieve()
            .bodyToMono(String.class);
    }
}

8. 에러 처리

HTTP 상태 코드에 따라 적절한 에러 처리를 구현합니다. 건별 조회 실패는 200 응답 내 results에서 확인해야 합니다.

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

int statusCode = response.statusCode();

switch (statusCode) {
    case 200:
        // Success - parse response
        JsonObject json = JsonParser.parseString(response.body()).getAsJsonObject();
        // ... handle results
        break;
    case 401:
        System.err.println("인증 실패 — API 키를 확인하세요");
        break;
    case 429:
        System.err.println("요청 한도 초과 — 잠시 후 재시도하세요");
        break;
    case 500:
        System.err.println("서버 오류 — 잠시 후 재시도하세요");
        break;
    default:
        System.err.println("HTTP " + statusCode + ": " + response.body());
}

주요 HTTP 상태 코드:

다음 단계

지금 바로 시작하세요!

무료 플랜으로 월 30,000건까지 사용 가능합니다.

무료로 시작하기 →