JDK 21에서 정식 버전으로 출시된 가상 스레드는 동시성이 높은 애플리케이션의 개발을 간소화합니다. 주요 이점은 다음과 같습니다.
- 특히 차단 I/O 작업이 있는 애플리케이션에서 처리량이 높습니다.
- 경량 특성으로 인한 메모리 최적화
- 애플리케이션이 요청당 스레드 스타일로 표현될 수 있는 간단한 동시 실행 모델
애플리케이션에 가상 스레드를 적용하기 전에 Open JDK 문서의 JEP 444: 가상 스레드에서 이 기능의 이점과 제한사항을 자세히 알아보세요.
이 가이드에서는 googleapis/google-cloud-java 저장소에서 자바용 Cloud 클라이언트 라이브러리를 구성하여 가상 스레드를 사용하는 방법을 설명합니다.
기본 요건
애플리케이션에서 사용할 Java용 Cloud 클라이언트 라이브러리와 함께 가상 스레드를 사용하려면 다음 필수 단계를 따르세요.
- 아직 만들지 않았다면 Google Cloud 프로젝트를 만듭니다. 프로젝트 만들기 및 관리를 참조하세요.
- 프로젝트의 사용자 인증 정보로 샘플을 실행할 수 있는 Google Cloud CLI를 설치합니다.
다음 명령어를 사용하여 애플리케이션 기본 사용자 인증 정보로 로그인합니다. 자세한 내용은 애플리케이션 기본 사용자 인증 정보 설정을 참고하세요.
gcloud auth application-default loginJDK (Java Development Kit) 21 이상이 설치되어 있는지 확인하려면
java -version명령어를 실행하고 다음 출력이 표시되는지 확인합니다. JDK 설치 단계는 Java 개발 환경 설정을 참고하세요.openjdk version "21.0.2" 2024-01-16 LTS OpenJDK Runtime Environment Temurin-21.0.2+13 (build 21.0.2+13-LTS) OpenJDK 64-Bit Server VM Temurin-21.0.2+13 (build 21.0.2+13-LTS, mixed mode, sharing)
프로젝트에 라이브러리 가져오기
이 예시에서는 google-cloud-translate을 사용합니다. Maven 또는 Gradle에서 라이브러리를 사용하는 단계는 Java용 Cloud Translation 사용을 참고하세요.
클라이언트 라이브러리에서 가상 스레드 실행기 사용
클라이언트 라이브러리 클래스를 인스턴스화할 때 전송 구현 (gRPC 및 REST)을 선택할 수 있습니다.
REST 전송
REST 전송을 구현하는 클라이언트 라이브러리는 차단 네트워크 I/O 호출을 사용하며, 이는 가상 스레드에서 제공하는 처리량 개선의 이점을 누립니다. 다음 코드 스니펫은 Java용 Cloud 클라이언트 라이브러리에서 차단 네트워크 I/O 트래픽을 가상 스레드로 관리하는 방법을 보여줍니다. TransportChannelProvider 인스턴스에서 가상 스레드 실행자로 기본 실행자를 재정의하여 자체 애플리케이션에서 이를 구현할 수 있습니다.
import com.google.cloud.translate.*;
import java.util.concurrent.Executors;
ExecutorService virtualThreadExecutor = Executors.newVirtualThreadPerTaskExecutor();
InstantiatingHttpJsonChannelProvider httpJsonChannelProvider =
TranslationServiceSettings.defaultHttpJsonTransportProviderBuilder()
// Use virtual threads for network I/O calls.
.setExecutor(virtualThreadExecutor)
.build();
try (TranslationServiceClient client =
TranslationServiceClient.create(
TranslationServiceSettings.newHttpJsonBuilder()
.setTransportChannelProvider(httpJsonChannelProvider)
.build())) {
// Make translate requests
}
gRPC 전송
gRPC는 이미 비동기 로직을 사용하여 요청을 처리하므로 가상 스레드의 처리량 개선이 덜 두드러질 수 있습니다. 하지만 경량형 특성으로 인해 메모리 최적화 이점을 제공할 수 있습니다. 다음 코드 스니펫은 가상 스레드로 gRPC 전송 작업을 관리하는 방법을 보여줍니다. TransportChannelProvider 인스턴스에서 가상 스레드 실행자로 기본 실행자를 재정의하여 자체 애플리케이션에서 이를 구현할 수 있습니다.
import com.google.cloud.translate.*;
import java.util.concurrent.Executors;
ExecutorService virtualThreadExecutor = Executors.newVirtualThreadPerTaskExecutor();
InstantiatingGrpcChannelProvider grpcChannelProvider =
TranslationServiceSettings.defaultGrpcTransportProviderBuilder()
// Use virtual threads for gRPC transport operations.
.setExecutor(virtualThreadExecutor)
.build();
try (TranslationServiceClient client =
TranslationServiceClient.create(
TranslationServiceSettings.newBuilder()
.setTransportChannelProvider(grpcChannelProvider)
.build())) {
// Make translate requests
}