다음을 통해 공유


Java를 사용하여 비동기 일정으로 Blob 복사

이 문서에서는 Java용 Azure Storage 클라이언트 라이브러리를 사용하여 비동기 일정으로 Blob을 복사하는 방법을 보여 줍니다. 동일한 스토리지 계정 내의 원본, 다른 스토리지 계정의 원본 또는 지정된 URL의 HTTP GET 요청을 통해 검색되어 액세스 가능한 개체에서 Blob을 복사할 수 있습니다. 보류 중인 복사 작업을 중단할 수도 있습니다.

이 문서에서 다루는 클라이언트 라이브러리 메서드는 Blob 복사 REST API 작업을 사용하며 비동기 일정으로 복사를 수행하려는 경우에 사용할 수 있습니다. 데이터를 스토리지 계정으로 이동하고 원본 개체에 대한 URL을 포함하려는 대부분의 복사 시나리오에 대해서는 Java를 사용하여 원본 개체 URL에서 Blob 복사를 참조하세요.

필수 조건

환경 설정

기존 프로젝트가 없는 경우, 이 섹션에서는 Java용 Azure Blob Storage 클라이언트 라이브러리를 사용해서 작동하도록 프로젝트를 설정하는 방법을 보여 줍니다. 자세한 내용은 Azure Blob Storage 및 Java 시작을 참조하세요.

이 문서의 코드 예제를 사용하려면 다음 단계에 따라 프로젝트를 설정합니다.

참고 항목

이 문서에서는 Maven 빌드 도구를 사용하여 코드 예를 빌드하고 실행합니다. Gradle과 같은 다른 빌드 도구도 Java용 Azure SDK에서 작동합니다.

패키지 설치

텍스트 편집기에서 pom.xml 파일을 엽니다. BOM 파일을 포함하거나 직접 종속성을 포함하여 패키지를 설치합니다.

Import 문 추가

다음 import 문을 추가합니다.

import com.azure.core.util.polling.*;
import com.azure.storage.blob.*;
import com.azure.storage.blob.models.*;
import com.azure.storage.blob.options.*;
import com.azure.storage.blob.sas.BlobSasPermission;
import com.azure.storage.blob.sas.BlobServiceSasSignatureValues;
import com.azure.storage.blob.specialized.*;

import java.time.*;
import java.util.*;

권한 부여

권한 부여 메커니즘에는 복사 작업을 수행하거나 보류 중인 복사를 중단하는 데 필요한 권한이 있어야 합니다. Microsoft Entra ID를 통한 권한 부여(권장)의 경우, 권한이 가장 낮은 Azure RBAC 기본 제공 역할은 여러 가지 요소에 따라 달라집니다. 자세한 내용은 Blob 복사(REST API) 또는 Blob 복사 중단(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 복사 정보

Copy Blob 작업은 비동기적으로 완료될 수 있으며 최선의 노력으로 수행됩니다. 즉, 작업이 즉시 시작되거나 지정된 시간 프레임 내 완료된다고 보장되지 않습니다. 복사 작업은 백그라운드에서 예약되고 서버에 사용 가능한 리소스가 있을 때 수행됩니다. 복사가 동일한 스토리지 계정 내에서 발생하는 경우 작업은 동기적으로 완료할 수 있습니다.

Copy Blob 작업은 다음 작업을 수행할 수 있습니다.

  • 다른 이름을 사용해서 원본 Blob을 대상 Blob에 복사합니다. 대상 Blob은 동일한 Blob 유형(블록, 추가 또는 페이지)의 기존 Blob이거나 복사 작업으로 생성된 새 Blob일 수 있습니다.
  • 동일한 이름을 사용해 원본 Blob을 대상 Blob으로 복사하여 대상 Blob을 바꿀 수 있습니다. 이 유형의 복사 작업은 커밋되지 않은 블록을 제거하고 대상 Blob의 메타데이터를 덮어씁니다.
  • Azure 파일 서비스의 원본 파일을 대상 Blob에 복사합니다. 대상 blob은 기존 블록 Blob이거나 복사 작업을 통해 만든 새 블록 Blob일 수 있습니다. 파일에서 페이지 Blob 또는 추가 Blob으로 복사하는 것은 지원되지 않습니다.
  • 기본 Blob에 대해 스냅샷을 복사합니다. 스냅샷의 수준을 기본 Blob 위치로 올리면 이전 Blob 버전을 복원할 수 있습니다.
  • 스냅샷을 다른 이름으로 대상 Blob에 복사합니다. 복사된 대상 Blob는 쓰기 가능한 Blob이고 스냅샷이 아닙니다.

속성, 인덱스 태그, 메타데이터 및 청구에 대한 정보를 포함하여 Copy Blob 작업에 대한 자세한 내용은 Blob 설명 복사를 참조하세요.

비동기 일정으로 BLOB 복사

이 섹션에서는 비동기 일정으로 복사 작업을 수행하기 위해 Java용 Azure Storage 클라이언트 라이브러리에서 제공하는 메서드에 대한 개요를 제공합니다.

다음 메서드는 BLOB 복사 REST API 작업을 래핑하고 원본 BLOB에서 데이터의 비동기 복사를 시작합니다.

beginCopy 메서드는 SyncPoller를 반환하여 복사 작업의 진행률을 폴링합니다. 폴링 응답 유형은 BlobCopyInfo입니다. beginCopy 메서드는 복사 작업에 대한 비동기 일정을 원할 때 사용됩니다.

Azure 내 원본에서 Blob 복사

동일한 스토리지 계정 내에서 Blob을 복사하는 경우 작업을 동기적으로 완료할 수 있습니다. 원본 Blob에 대한 액세스는 Microsoft Entra ID, SAS(공유 액세스 서명) 또는 계정 키를 통해 권한 부여될 수 있습니다. 다른 동기 복사 작업에 대해서는 Java로 원본 개체 URL에서 BLOB 복사를 참조하세요.

복사 원본이 다른 스토리지 계정의 BLOB인 경우 작업을 비동기적으로 완료할 수 있습니다. 원본 Blob은 공용이거나 SAS 토큰을 통해 권한이 부여되어야 합니다. SAS 토큰에는 읽기(‘r’) 권한이 포함되어야 합니다. SAS 토큰에 대한 자세한 내용은 공유 액세스 서명을 사용하여 액세스 위임을 참조하세요.

다음 예제에서는 비동기 일정으로 다른 스토리지 계정에서 원본 Blob을 복사하는 시나리오를 보여 줍니다. 이 예제에서는 추가된 사용자 위임 SAS 토큰을 사용하여 원본 Blob URL을 만듭니다. 이 예제에서는 클라이언트 라이브러리를 사용하여 SAS 토큰을 생성하는 방법을 보여 주지만, 직접 제공할 수도 있습니다. 또한 이 예제에서는 복사 작업 중에 원본 Blob을 임대하여 다른 클라이언트에서 Blob에 대한 변경 내용을 방지하는 방법을 보여줍니다. Copy Blob 작업은 복사 작업이 시작될 때 원본 Blob의 ETag 값을 저장합니다. 복사 작업이 완료되기 전에 ETag 값이 변경되면 작업이 실패합니다.

public void copyBlobAcrossStorageAccounts(BlobClient sourceBlob, BlockBlobClient destinationBlob) {
    // Lease the source blob during copy to prevent other clients from modifying it
    BlobLeaseClient lease = new BlobLeaseClientBuilder()
            .blobClient(sourceBlob)
            .buildClient();

    // Create a SAS token for the source blob or use an existing one
    String sasToken = generateUserDelegationSAS(
            sourceBlob.getContainerClient().getServiceClient(),
            sourceBlob);

    // Get the source blob URL and append the SAS token
    String sourceBlobSasURL = sourceBlob.getBlobUrl() + "?" + sasToken;

    try {
        // Specifying -1 creates an infinite lease
        lease.acquireLease(-1);

        // Start the copy operation and wait for it to complete
        final SyncPoller<BlobCopyInfo, Void> poller = destinationBlob.beginCopy(
                sourceBlobSasURL,
                Duration.ofSeconds(2));
        PollResponse<BlobCopyInfo> response = poller.waitUntil(LongRunningOperationStatus.SUCCESSFULLY_COMPLETED);
    } finally {
        // Release the lease once the copy operation completes
        lease.releaseLease();
    }
}

public String generateUserDelegationSAS(BlobServiceClient blobServiceClient, BlobClient sourceBlob) {
    // Get a user delegation key
    OffsetDateTime delegationKeyStartTime = OffsetDateTime.now();
    OffsetDateTime delegationKeyExpiryTime = OffsetDateTime.now().plusDays(1);
    UserDelegationKey key = blobServiceClient.getUserDelegationKey(
        delegationKeyStartTime,
        delegationKeyExpiryTime);

    // Create a SAS token that's valid for one day, as an example
    OffsetDateTime expiryTime = OffsetDateTime.now().plusDays(1);

    // Set the Read (r) permission on the SAS token
    BlobSasPermission permission = new BlobSasPermission().setReadPermission(true);

    BlobServiceSasSignatureValues sasValues = new BlobServiceSasSignatureValues(expiryTime, permission)
            .setStartTime(OffsetDateTime.now());

    // Create a SAS token that's valid for one day
    String sasToken = sourceBlob.generateUserDelegationSas(sasValues, key);

    return sasToken;
}

참고 항목

사용자 위임 SAS 토큰은 계정 키 대신 Microsoft Entra 자격 증명으로 서명되므로 더 강력한 보안을 제공합니다. 사용자 위임 SAS 토큰을 만들려면 Microsoft Entra 보안 주체에 적절한 권한이 필요합니다. 권한 부여 요구 사항은 사용자 위임 키 가져오기를 참조하세요.

Azure 외부의 원본에서 Blob 복사

Azure 외부의 액세스 가능한 개체를 포함하여 지정된 URL에서 HTTP GET 요청을 통해 검색할 수 있는 모든 원본 개체에 대해 복사 작업을 수행할 수 있습니다. 다음 예제에서는 액세스 가능한 원본 개체 URL에서 Blob을 복사하는 시나리오를 보여줍니다.

public void copyFromExternalSourceAsyncScheduling(String sourceURL, BlockBlobClient destinationBlob) {
    // Start the copy operation and wait for it to complete
    final SyncPoller<BlobCopyInfo, Void> poller = destinationBlob.beginCopy(
            sourceURL,
            Duration.ofSeconds(2));
    PollResponse<BlobCopyInfo> response = poller.waitUntil(LongRunningOperationStatus.SUCCESSFULLY_COMPLETED);
}

복사 작업의 상태 확인

Copy Blob 작업의 상태를 확인하려면 SyncPoller에서 반환된 BlobCopyInfo 개체에 getCopyStatus를 호출할 수 있습니다.

다음 코드 예제에서는 복사 작업의 상태를 확인하는 방법을 보여 줍니다.

public void checkCopyStatus(BlobCopyInfo copyInfo) {
    // Check the status of the copy operation 
    System.out.printf("Copy status", copyInfo.getCopyStatus());
}

복사 작업 중단

보류 중인 Copy Blob 작업을 중단하면 대상 Blob의 길이가 0이 됩니다. 하지만 대상 Blob의 메타데이터는 원본 Blob에서 복사되었거나 복사 작업 중에 명시적으로 설정된 새 값을 가집니다. 복사 전의 원본 메타데이터를 보존하려면 복사 메서드 중 하나를 호출하기 전에 대상 Blob의 스냅샷을 만듭니다.

보류 중인 복사 작업을 중단하려면 다음 메서드를 호출합니다.

이 메서드는 Blob 복사 중단 REST API 작업을 래핑하여, 보류 중인 Copy Blob 작업을 취소합니다. 다음 코드 예제에서는 보류 중인 Copy Blob 작업을 중단하는 방법을 보여줍니다.

public void abortCopy(BlobCopyInfo copyInfo, BlobClient destinationBlob) {
    // Check the copy status and abort if pending
    if (copyInfo.getCopyStatus() == CopyStatusType.PENDING) {
        destinationBlob.abortCopyFromUrl(copyInfo.getCopyId());
        System.out.printf("Copy operation %s has been aborted%n", copyInfo.getCopyId());
    }
}

리소스

Java용 Azure Blob Storage 클라이언트 라이브러리를 사용하여 Blob을 복사하는 방법에 대해 자세히 알아보려면 다음 리소스를 참조하세요.

코드 샘플

REST API 작업

Java용 Azure SDK에는 Azure REST API를 기반으로 빌드되는 라이브러리가 포함되어 있으므로 익숙한 Java 패러다임을 통해 REST API 작업과 상호 작용할 수 있습니다. 이 문서에서 다루는 클라이언트 라이브러리 메서드는 다음 REST API 작업을 사용합니다.

클라이언트 라이브러리 리소스

  • 이 문서는 Java용 Blob Storage 개발자 가이드의 일부입니다. 자세한 내용은 Java 앱 빌드에서 개발자 가이드 문서의 전체 목록을 참조하세요.