Java를 사용하여 블록 Blob 업로드
이 문서에서는 Java용 Azure Storage 클라이언트 라이브러리를 사용하여 블록 Blob을 업로드하는 방법을 보여 줍니다. 파일 경로, 스트림, 이진 개체 또는 텍스트 문자열에서 블록 Blob에 데이터를 업로드할 수 있습니다. 인덱스 태그를 사용하여 Blob을 업로드할 수도 있습니다.
필수 조건
- Azure 구독 - 체험 구독 만들기
- Azure Storage 계정 - 스토리지 계정 만들기
- JDK(Java Development Kit) 버전 8 이상(최상의 환경을 위해 버전 17을 권장합니다)
- Apache Maven은 이 예제에서 프로젝트 관리에 사용됩니다.
환경 설정
기존 프로젝트가 없는 경우, 이 섹션에서는 Java용 Azure Blob Storage 클라이언트 라이브러리를 사용해서 작동하도록 프로젝트를 설정하는 방법을 보여 줍니다. 자세한 내용은 Azure Blob Storage 및 Java 시작을 참조하세요.
이 문서의 코드 예제를 사용하려면 다음 단계에 따라 프로젝트를 설정합니다.
참고 항목
이 문서에서는 Maven 빌드 도구를 사용하여 코드 예를 빌드하고 실행합니다. Gradle과 같은 다른 빌드 도구도 Java용 Azure SDK에서 작동합니다.
패키지 설치
텍스트 편집기에서 pom.xml
파일을 엽니다. BOM 파일을 포함하거나 직접 종속성을 포함하여 패키지를 설치합니다.
Import 문 추가
다음 import
문을 추가합니다.
import com.azure.core.http.rest.*;
import com.azure.core.util.BinaryData;
import com.azure.storage.blob.*;
import com.azure.storage.blob.models.*;
import com.azure.storage.blob.options.BlobUploadFromFileOptions;
import com.azure.storage.blob.specialized.*;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.time.Duration;
import java.util.*;
권한 부여
권한 부여 메커니즘에는 Blob을 업로드하는 데 필요한 권한이 있어야 합니다. Microsoft Entra ID로 권한을 부여하려면(권장) Azure RBAC 기본 제공 역할 Storage Blob 데이터 기여자 이상이 필요합니다. 자세한 내용은 Blob 배치(REST API) 및 블록 배치(REST API)에 대한 권한 부여 지침을 참조하세요.
클라이언트 개체 만들기
Blob Storage에 앱을 연결하려면 BlobServiceClient의 인스턴스를 만듭니다.
다음 예에서는 BlobServiceClientBuilder를 사용하여 DefaultAzureCredential
을 사용해 BlobServiceClient
개체를 빌드하고 필요한 경우 컨테이너 및 Blob 클라이언트를 만드는 방법을 보여 줍니다.
// Azure SDK client builders accept the credential as a parameter
// TODO: Replace <storage-account-name> with your actual storage account name
BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
.endpoint("https://<storage-account-name>.blob.core.windows.net/")
.credential(new DefaultAzureCredentialBuilder().build())
.buildClient();
// If needed, you can create a BlobContainerClient object from the BlobServiceClient
BlobContainerClient containerClient = blobServiceClient
.getBlobContainerClient("<container-name>");
// If needed, you can create a BlobClient object from the BlobContainerClient
BlobClient blobClient = containerClient
.getBlobClient("<blob-name>");
클라이언트 개체 만들기 및 관리에 대한 자세한 내용은 데이터 리소스와 상호 작용하는 클라이언트 개체 만들기 및 관리를 참조하세요.
블록 Blob에 데이터 업로드
스트림 또는 이진 개체에서 블록 Blob을 업로드하려면 다음 메서드를 사용합니다.
파일 경로에서 블록 Blob을 업로드하려면 다음 메서드를 사용합니다.
이러한 각 메서드는 BlobClient 개체 또는 BlockBlobClient 개체를 사용하여 호출할 수 있습니다.
로컬 파일 경로에서 블록 Blob 업로드
다음 예제에서는 BlobClient
개체를 사용하여 블록 Blob에 파일을 업로드합니다.
public void uploadBlobFromFile(BlobContainerClient blobContainerClient) {
BlobClient blobClient = blobContainerClient.getBlobClient("sampleBlob.txt");
try {
blobClient.uploadFromFile("filepath/local-file.png");
} catch (UncheckedIOException ex) {
System.err.printf("Failed to upload from file: %s%n", ex.getMessage());
}
}
스트림에서 블록 Blob 업로드
다음 예제에서는 ByteArrayInputStream
개체를 만든 다음, 해당 스트림 개체를 업로드하여 블록 Blob을 업로드합니다.
public void uploadBlobFromStream(BlobContainerClient blobContainerClient) {
BlockBlobClient blockBlobClient = blobContainerClient.getBlobClient("sampleBlob.txt").getBlockBlobClient();
String sampleData = "Sample data for blob";
try (ByteArrayInputStream dataStream = new ByteArrayInputStream(sampleData.getBytes())) {
blockBlobClient.upload(dataStream, sampleData.length());
} catch (IOException ex) {
ex.printStackTrace();
}
}
BinaryData 개체에서 블록 Blob 업로드
다음 예제에서는 BlobClient
개체를 사용하여 BinaryData
를 블록 Blob에 업로드합니다.
public void uploadDataToBlob(BlobContainerClient blobContainerClient) {
// Create a BlobClient object from BlobContainerClient
BlobClient blobClient = blobContainerClient.getBlobClient("sampleBlob.txt");
String sampleData = "Sample data for blob";
blobClient.upload(BinaryData.fromString(sampleData));
}
구성 옵션을 사용하여 블록 Blob 업로드
Blob을 업로드할 때 클라이언트 라이브러리 구성 옵션을 정의할 수 있습니다. 이러한 옵션을 조정하여 성능을 개선하고 안정성을 향상시키고 비용을 최적화할 수 있습니다. 다음 코드 예제에서는 업로드 메서드를 호출할 때 BlobUploadFromFileOptions를 사용하여 구성 옵션을 정의하는 방법을 보여 줍니다. 파일에서 업로드하지 않는 경우 업로드 메서드에서 BlobParallelUploadOptions를 사용하여 유사한 옵션을 설정할 수 있습니다.
업로드할 때 데이터 전송 옵션 지정
ParallelTransferOptions의 값을 구성하여 데이터 전송 작업에 대한 성능을 향상시킬 수 있습니다. 앱의 요구 사항에 따라 업로드에 대해 다음 값을 조정할 수 있습니다.
blockSize
: 각 요청에 대해 전송할 최대 블록 크기입니다. setBlockSizeLong 메서드를 사용하여 이 값을 설정할 수 있습니다.maxSingleUploadSize
: 데이터 크기가 이 값보다 작거나 같으면 청크로 나뉘지 않고 단일 배치로 업로드됩니다. 단일 실행에서 데이터를 업로드하면 블록 크기가 무시됩니다. setMaxSingleUploadSizeLong 메서드를 사용하여 이 값을 설정할 수 있습니다.maxConcurrency
: 단일 병렬 전송의 일부로 지정된 시간에 발급되는 최대 병렬 요청 수 setMaxConcurrency 메서드를 사용하여 이 값을 설정할 수 있습니다.
업로드에 ParallelTransferOptions
를 사용하려면 다음 import
지시문이 있는지 확인합니다.
import com.azure.storage.blob.models.*;
다음 코드 예제에서는 ParallelTransferOptions에 대한 값을 설정하고 BlobUploadFromFileOptions 인스턴스의 일부로 옵션을 포함하는 방법을 보여 줍니다. 이 샘플에 제공된 값은 권장 사항이 아닙니다. 이러한 값을 올바르게 조정하려면 앱의 특정 요구 사항을 고려해야 합니다.
public void uploadBlockBlobWithTransferOptions(BlobContainerClient blobContainerClient, Path filePath) {
String fileName = filePath.getFileName().toString();
BlobClient blobClient = blobContainerClient.getBlobClient(fileName);
ParallelTransferOptions parallelTransferOptions = new ParallelTransferOptions()
.setBlockSizeLong((long) (4 * 1024 * 1024)) // 4 MiB block size
.setMaxConcurrency(2)
.setMaxSingleUploadSizeLong((long) 8 * 1024 * 1024); // 8 MiB max size for single request upload
BlobUploadFromFileOptions options = new BlobUploadFromFileOptions(filePath.toString());
options.setParallelTransferOptions(parallelTransferOptions);
try {
Response<BlockBlobItem> blockBlob = blobClient.uploadFromFileWithResponse(options, null, null);
} catch (UncheckedIOException ex) {
System.err.printf("Failed to upload from file: %s%n", ex.getMessage());
}
}
데이터 전송 옵션 튜닝에 대한 자세한 내용은 Java를 사용하여 업로드 및 다운로드에 대한 성능 조정을 참조하세요.
인덱스 태그를 사용하여 블록 Blob 업로드
Blob 인덱스 태그는 키-값 태그 특성을 사용하여 스토리지 계정의 데이터를 분류합니다. 이러한 태그는 데이터를 쉽게 찾을 수 있도록 검색 가능한 다차원 인덱스로 자동으로 인덱싱되고 표시됩니다.
다음 예제에서는 BlobUploadFromFileOptions를 사용하여 인덱스 태그가 설정된 블록 Blob을 업로드합니다.
public void uploadBlockBlobWithIndexTags(BlobContainerClient blobContainerClient, Path filePath) {
String fileName = filePath.getFileName().toString();
BlobClient blobClient = blobContainerClient.getBlobClient(fileName);
Map<String, String> tags = new HashMap<String, String>();
tags.put("Content", "image");
tags.put("Date", "2022-01-01");
Duration timeout = Duration.ofSeconds(10);
BlobUploadFromFileOptions options = new BlobUploadFromFileOptions(filePath.toString());
options.setTags(tags);
try {
// Create a new block blob, or update the content of an existing blob
Response<BlockBlobItem> blockBlob = blobClient.uploadFromFileWithResponse(options, timeout, null);
} catch (UncheckedIOException ex) {
System.err.printf("Failed to upload from file: %s%n", ex.getMessage());
}
}
업로드 시 Blob의 액세스 계층 설정
BlobUploadFromFileOptions 클래스를 사용하여 업로드 시 Blob의 액세스 계층을 설정할 수 있습니다. 다음 코드 예제에서는 BLOB을 업로드할 때 액세스 계층을 설정하는 방법을 보여 줍니다.
public void uploadBlobWithAccessTier(BlobContainerClient blobContainerClient, Path filePath) {
String fileName = filePath.getFileName().toString();
BlobClient blobClient = blobContainerClient.getBlobClient(fileName);
BlobUploadFromFileOptions options = new BlobUploadFromFileOptions(filePath.toString())
.setTier(AccessTier.COOL);
try {
Response<BlockBlobItem> blockBlob = blobClient.uploadFromFileWithResponse(options, null, null);
} catch (UncheckedIOException ex) {
System.err.printf("Failed to upload from file: %s%n", ex.getMessage());
}
}
액세스 계층 설정은 블록 Blob에서만 허용됩니다. 블록 Blob에 대한 액세스 계층을 Hot
, Cool
, Cold
또는 Archive
로 설정할 수 있습니다. 액세스 계층을 Cold
로 설정하려면 최소 클라이언트 라이브러리 버전, 12.21.0을 사용해야 합니다.
액세스 계층에 대한 자세한 내용은 액세스 계층 개요를 참조하세요.
블록을 준비하고 커밋하여 블록 Blob 업로드
개별 데이터 블록을 수동으로 스테이징하여 업로드를 블록으로 나누는 방법을 보다 효율적으로 제어할 수 있습니다. Blob을 구성하는 모든 블록이 준비되면 Blob Storage에 커밋할 수 있습니다. 이 접근방식을 사용하여 블록을 병렬로 업로드하여 성능을 향상시킬 수 있습니다.
public void uploadBlocks(BlobContainerClient blobContainerClient, Path filePath, int blockSize) throws IOException {
String fileName = filePath.getFileName().toString();
BlockBlobClient blobClient = blobContainerClient.getBlobClient(fileName).getBlockBlobClient();
FileInputStream fileStream = new FileInputStream(filePath.toString());
List<String> blockIDArrayList = new ArrayList<>();
byte[] buffer = new byte[blockSize];
int bytesRead;
while ((bytesRead = fileStream.read(buffer, 0, blockSize)) != -1) {
try (ByteArrayInputStream stream = new ByteArrayInputStream(buffer)) {
String blockID = Base64.getEncoder().encodeToString(UUID.randomUUID().toString().getBytes(StandardCharsets.UTF_8));
blockIDArrayList.add(blockID);
blobClient.stageBlock(blockID, stream, buffer.length);
}
}
blobClient.commitBlockList(blockIDArrayList);
fileStream.close();
}
리소스
Java용 Azure Blob Storage 클라이언트 라이브러리를 사용하여 Blob을 업로드하는 방법에 대한 자세한 내용은 다음 리소스를 참조하세요.
코드 샘플
REST API 작업
Java용 Azure SDK에는 Azure REST API를 기반으로 빌드되는 라이브러리가 포함되어 있으므로 익숙한 Java 패러다임을 통해 REST API 작업과 상호 작용할 수 있습니다. Blob을 업로드하기 위한 클라이언트 라이브러리 메서드는 다음 REST API 작업을 사용합니다.
클라이언트 라이브러리 리소스
참고 항목
관련 콘텐츠
- 이 문서는 Java용 Blob Storage 개발자 가이드의 일부입니다. 자세한 내용은 Java 앱 빌드에서 개발자 가이드 문서의 전체 목록을 참조하세요.