0Pricing
Java Academy · 강의

java.net.http.HttpClient

동기 요청을 전송합니다

java.net.http.HttpClient은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

최신 HTTP 클라이언트

Java 11부터 JDK는 java.net.http 패키지에 최신 HTTP 클라이언트를 제공합니다. 이 클라이언트는 기존의 HttpURLConnection을 대체하며, HTTP/1.1과 HTTP/2를 지원하는 간결한 연쇄형 API를 제공합니다.

핵심이 되는 세 가지 타입은 다음과 같습니다.

  • HttpClient — 요청을 전송하고 구성(시간 제한, 프록시, 리디렉션)을 관리합니다.
  • HttpRequest — 전송할 내용을 변경할 수 없는 형태로 설명합니다.
  • HttpResponse — 상태, 헤더, 본문을 포함한 결과입니다.

HttpClient 만들기

정적 newBuilder() 메서드로 클라이언트를 만듭니다. 하나의 클라이언트를 여러 요청에 재사용할 수 있으며 스레드 안전합니다.

여기서는 HTTP/2를 사용하도록 구성하고 연결 시간 제한을 설정합니다. 빠르게 기본 인스턴스를 만들 때는 newHttpClient()도 사용할 수 있습니다.

import java.net.http.HttpClient;
import java.time.Duration;

public class Main {
    public static void main(String[] args) {
        HttpClient client = HttpClient.newBuilder()
            .version(HttpClient.Version.HTTP_2)
            .connectTimeout(Duration.ofSeconds(10))
            .build();
        System.out.println("Client version: " + client.version());
    }
}

요청 만들기

HttpRequest는 불변이며 플루언트 빌더를 사용해 생성합니다. 최소한 URI를 제공해야 하며, 기본적으로 GET을 수행합니다.

문자열을 URI로 변환하려면 URI.create(...)를 사용합니다.

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

public class Main {
    public static void main(String[] args) {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://example.com/data"))
            .GET()
            .build();
        System.out.println("Method: " + request.method());
        System.out.println("URI: " + request.uri());
    }
}

동기적으로 전송하기

send 메서드는 응답이 도착할 때까지 호출한 스레드를 차단합니다. 클라이언트에 응답 본문을 해석하는 방법을 알려 주는 BodyHandler가 필요합니다.

BodyHandlers.ofString()은 본문을 String으로 읽습니다.

import java.net.URI;
import java.net.http.*;

public class Main {
    public static void main(String[] args) throws Exception {
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://example.com"))
            .build();
        HttpResponse<String> response =
            client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println("Status: " + response.statusCode());
    }
}

상태 코드 읽기

응답은 statusCode()를 int로 제공합니다. 2xx 범위의 코드는 성공을 의미하고, 3xx는 리디렉션, 4xx는 클라이언트 오류, 5xx는 서버 오류를 의미합니다.

참고: HTTP 클라이언트는 4xx/5xx 응답에서 예외를 발생시키지 않으므로 직접 코드를 확인해야 합니다.

public class Main {
    public static void main(String[] args) {
        int status = 404;
        String label;
        if (status >= 200 && status < 300) label = "Success";
        else if (status >= 300 && status < 400) label = "Redirect";
        else if (status >= 400 && status < 500) label = "Client error";
        else label = "Server error";
        System.out.println(status + " -> " + label);
    }
}

본문 읽기

BodyHandlers.ofString()을 사용하면 response.body()가 String을 반환합니다. 바이트, 파일, 스트림을 위한 다른 처리기도 있으며 이는 나중에 다룹니다.

이 코드 조각은 실제로 받게 될 본문 내용을 시뮬레이션합니다.

public class Main {
    public static void main(String[] args) {
        String body = "{\"message\":\"hello\"}";
        System.out.println("Body length: " + body.length());
        System.out.println("Body: " + body);
    }
}

리디렉션 처리하기

기본적으로 클라이언트는 리디렉션을 따라가지 않습니다. 빌더에서 followRedirects(...)를 사용해 구성합니다.

HttpClient.Redirect의 옵션은 NEVER, ALWAYS, NORMAL입니다. NORMAL은 HTTPS에서 HTTP로 다운그레이드하는 경우를 제외하고 리디렉션을 따릅니다.

import java.net.http.HttpClient;

public class Main {
    public static void main(String[] args) {
        HttpClient client = HttpClient.newBuilder()
            .followRedirects(HttpClient.Redirect.NORMAL)
            .build();
        System.out.println("Redirect policy: " + client.followRedirects());
    }
}

요청별 시간 제한

연결 시간 제한은 클라이언트에 설정합니다. 요청 시간 제한(응답을 기다리는 시간)은 timeout(...)을 통해 요청에 설정합니다.

시간 제한이 만료되면 send가 HttpTimeoutException을 발생시킵니다.

import java.net.URI;
import java.net.http.HttpRequest;
import java.time.Duration;

public class Main {
    public static void main(String[] args) {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://example.com"))
            .timeout(Duration.ofSeconds(5))
            .build();
        System.out.println("Timeout set: " + request.timeout().isPresent());
    }
}

응답 헤더 살펴보기

응답에는 headers()를 통해 접근할 수 있는 HttpHeaders 객체가 포함됩니다. 헤더 조회는 대소문자를 구분하지 않으며 여러 값을 반환할 수 있으므로 firstValue(...)는 Optional<String>을 반환합니다.

import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        // Simulating a header lookup result
        Optional<String> contentType = Optional.of("application/json");
        System.out.println("Content-Type: " + contentType.orElse("unknown"));
    }
}

검사 예외

동기식 send는 두 가지 검사 예외를 선언합니다.

  • 입출력 예외 — 네트워크 또는 프로토콜 오류입니다.
  • InterruptedException — 차단된 스레드가 인터럽트되었습니다.

두 예외를 모두 잡거나 선언해야 합니다. 비동기 호출은 퓨처를 반환하므로 이 문제를 피할 수 있으며, 이는 다음 레슨에서 다룹니다.

import java.io.IOException;

public class Main {
    public static void main(String[] args) {
        try {
            // client.send(...) would go here
            throw new IOException("connection refused");
        } catch (IOException e) {
            System.out.println("Network problem: " + e.getMessage());
        }
    }
}

재사용 가능한 클라이언트

권장 방식은 하나의 HttpClient를 만들고 애플리케이션 전체에서 재사용하는 것입니다. 연결을 풀링하며 스레드로부터 완전히 안전합니다.

요청마다 새 클라이언트를 만들면 리소스가 낭비되고 HTTP/2 다중화를 활용할 수 없습니다.

import java.net.http.HttpClient;

public class Main {
    private static final HttpClient SHARED = HttpClient.newHttpClient();

    public static void main(String[] args) {
        System.out.println("Shared client ready: " + (SHARED != null));
    }
}

빠른 확인

동기식 HTTP 클라이언트에 대한 이해도를 확인해 보십시오.

복습

JDK HTTP 클라이언트의 기본 사항을 배웠습니다.

  • HttpClient.newBuilder()는 버전, 시간 제한, 리디렉션을 구성하며 인스턴스 하나를 재사용합니다.
  • HttpRequest.newBuilder().uri(...).GET()는 불변 요청을 만듭니다.
  • client.send(request, BodyHandlers.ofString())는 차단하며 HttpResponse<String>을 반환합니다.
  • statusCode(), body(), headers()로 결과를 읽습니다.
  • 2xx가 아닌 코드는 예외를 발생시키지 않으므로 직접 확인해야 합니다.

자주 묻는 질문

“java.net.http.HttpClient” 강의는 무료인가요?

네 — “java.net.http.HttpClient” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“java.net.http.HttpClient”에서 뭘 배우나요?

동기 요청을 전송합니다 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Java Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“java.net.http.HttpClient” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. java.net.http.HttpClient
  2. 비동기 요청
  3. 요청 본문과 헤더
  4. 응답 처리
← Java Academy(으)로 돌아가기