HTTP/2 클라이언트 API 소개
자바 9에서 새롭게 도입된 HTTP/2 클라이언트 API는 기존 HTTP/1.1 대비 뛰어난 성능 개선을 제공하며, 서버 푸시(Server Push) 이벤트까지 지원합니다. 덕분에 웹사이트를 더욱 효율적이고 빠르게 탐색할 수 있습니다.
특이한 점은 HTTP/2 클라이언트가 jdk.incubator.httpclient라는 이름의 인큐베이터(incubator) 모듈 형태로 제공된다는 것입니다. 인큐베이터 모듈이란 아직 정식 기능으로 확정되지 않아, 향후 자바 버전에서 변경 사항이 생길 수 있는 실험적 모듈을 의미합니다. 이 모듈은 모든 공개 API를 담고 있는 jdk.incubator.http 패키지를 외부로 노출합니다.
JShell에서 HTTP/2 클라이언트 활성화하기
HTTP/2 클라이언트를 사용하려면 먼저 인큐베이터 모듈을 활성화해야 합니다. JShell 실행 시 --add-modules 옵션에 httpclient 모듈을 지정하면 간단히 해결됩니다.
C:\>jshell -v --add-modules jdk.incubator.httpclient
| Welcome to JShell -- Version 9.0.4
| For an introduction type: /help intro
실습 예제
다음 예제는 JShell에서 HTTP 클라이언트 객체를 생성하고, 구글 사이트로 GET 요청을 전송한 뒤 응답 상태 코드와 본문을 확인하는 전체 과정입니다.
jshell> import jdk.incubator.http.*;
jshell> HttpClient httpClient = HttpClient.newHttpClient();
httpClient ==> jdk.incubator.http.HttpClientImpl@534df152
| created variable httpClient : HttpClient
jshell> HttpRequest httpRequest = HttpRequest.newBuilder().uri(new URI("https://www.google.com")).GET().build();
httpRequest ==> https://www.google.com GET
| created variable httpRequest : HttpRequest
jshell> HttpResponse httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandler.asString());
httpResponse ==> jdk.incubator.http.HttpResponseImpl@609cd4d8
| created variable httpResponse : HttpResponse
jshell> System.out.println(httpResponse.statusCode());
403
jshell> System.out.println(httpResponse.body());
(응답 본문 문자열 출력)
예제 코드 단계별 설명
1. HttpClient 생성 — HttpClient.newHttpClient() 메서드를 호출해 기본 설정값을 가진 클라이언트 인스턴스를 만듭니다.
2. HttpRequest 빌드 — HttpRequest.newBuilder()로 요청 빌더를 얻은 뒤, 대상 URI를 지정하고 .GET(), .build()를 호출해 불변(immutable) 요청 객체를 완성합니다.
3. 요청 전송 및 응답 수신 — httpClient.send() 메서드로 동기 방식 요청을 보내고, HttpResponse.BodyHandler.asString()을 지정해 응답 본문을 문자열로 변환해 받습니다.
4. 결과 확인 — statusCode()로 HTTP 상태 코드를, body()로 실제 응답 내용을 출력합니다. 위 예제에서는 403 상태 코드가 반환된 것을 확인할 수 있습니다.
참고: 자바 11에서의 변화
인큐베이터 상태였던 이 API는 피드백을 거쳐 자바 11에서 표준으로 승격되어 java.net.http 패키지에 정식 포함되었습니다. 따라서 실무 프로젝트에서는 자바 11 이상 환경에서 별도 모듈 추가 없이 바로 사용하는 것이 좋습니다.