원본 링크: https://azure.microsoft.com/ko-kr/documentation/articles/storage-java-how-to-use-blob-storage/

 

개요

이 문서에서는 Microsoft Azure Blob 저장소를 사용하여 일반 시나리오를 수행하는 방법을 보여 줍니다. 샘플은 Java로 작성되었으며 Java용 Azure Storage SDK(영문)를 사용합니다. Blob업로드나열다운로드 및 삭제 시나리오를 다룹니다. Blob에 대한 자세한 내용은 다음 단계 섹션을 참조하십시오.

참고:

SDK는 Android 장치에서 Azure 저장소를 사용하는 개발자에게 제공됩니다. 자세한 내용은 Android용 Azure Storage SDK를 참조하세요.

Blob 저장소 정의

Azure Blob 저장소는 HTTP 또는 HTTPS를 통해 전 세계 어디에서든 액세스할 수 있는 다량의 구조화되지 않은 개체 데이터(예: 텍스트 또는 이진 데이터)를 저장할 수 있는 서비스입니다. Blob 저장소를 사용하여 세상에 공개적으로 표시하거나 응용 프로그램 데이터를 비공개적으로 저장할 수 있습니다.

Blob 저장소의 일반적인 사용은 다음과 같습니다.

  • 브라우저에 직접 이미지 또는 문서 제공
  • 분산 액세스를 위해 파일 저장
  • 동영상 및 오디오 스트리밍
  • 백업 및 복원, 재해 복구 및 보관 데이터 저장
  • 온-프레미스 또는 Azure 호스티드 서비스에서 분석하기 위해 데이터 저장

BLOB 서비스 개념

Blob 서비스에는 다음 구성 요소가 포함됩니다.

Blob1

  • 저장소 계정: Azure 저장소에 대한 모든 액세스는 저장소 계정을 통해 수행됩니다. 이 저장소 계정은 범용 저장소 계정이거나, 개체/Blob 저장용으로 특화된 Blob 저장소 계정이 될 수 있습니다. 저장소 계정에 대한 자세한 내용은 Azure 저장소 계정을 참조하세요.

  • 컨테이너: 컨테이너는 Blob 집합 그룹화를 제공합니다. 모든 Blob은 컨테이너에 있어야 합니다. 한 계정에 포함될 수 있는 컨테이너 수에는 제한이 없습니다. 한 컨테이너에 저장될 수 있는 Blob 수에도 제한이 없습니다. 컨테이너 이름은 소문자여야 합니다.

  • Blob: 모든 형식과 크기의 파일입니다. Azure 저장소에는 블록 Blob, 페이지 Blob 및 추가 Blob의 세 가지 Blob 유형이 있습니다.

    블록 Blob 은 문서 및 미디어 파일과 같은 텍스트 또는 이진 파일을 저장하기에 적합합니다.추가 Blob 은 블록으로 구성된다는 점에서 블록 Blob과 유사하지만 추가 작업에 최적화되었으므로 로깅 시나리오에 유용합니다. 단일 블록 Blob 또는 추가 Blob은 195GB(4MB X 50,000) 이상의 총 크기에 대해 최대 각 4MB의 최대 50,000 블록을 포함할 수 있습니다.

    페이지 Blob 은 최대 1TB 크기까지 가능하며 빈번한 읽기/쓰기 작업에 대해 더 효율적입니다. Azure 가상 컴퓨터는 OS 및 데이터 디스크로 페이지 Blob을 사용합니다.

    컨테이너 및 Blob를 명명하는 세부 정보는 컨테이너, Blob 및 메타데이터 명명 및 참조를 참조하세요.

Azure 저장소 계정 만들기

첫 번째 Azure 저장소 계정을 가장 쉽게 만드는 방법은 Azure 포털을 사용하는 것입니다. 자세한 내용은 저장소 계정 만들기를 참조하십시오.

Azure PowerShellAzure CLI 또는 .NET용 저장소 리소스 공급자 클라이언트 라이브러리를 사용하여 Azure 저장소 계정을 만들 수도 있습니다.

또한 이번에 저장소 계정을 만들지 않으려는 경우 Azure 저장소 에뮬레이터를 사용하여 로컬 환경에서 코드를 실행하고 테스트할 수 있습니다. 자세한 내용은 개발 및 테스트에 Azure 저장소 에뮬레이터 사용을 참조하세요.

Java 응용 프로그램 만들기

이 문서에서는 Java 응용 프로그램 내에서 로컬로 또는 Azure의 웹 역할 또는 작업자 역할 내에서 실행되는 코드에서 실행할 수 있는 저장소 기능을 사용합니다.

그러려면 JDK(Java Development Kit)를 설치하고 Azure 구독에서 Azure 저장소 계정을 만들어야 합니다. 그러고 나면 개발 시스템에서 GitHub의 Java용 Azure Storage SDK 리포지토리에 있는 최소 요구 사항과 종속성을 충족하는지 확인해야 합니다. 시스템에서 해당 요구 사항을 충족하는 경우에는 리포지토리에서 시스템의 Java용 Azure Storage Library를 다운로드 및 설치하기 위한 지침을 따를 수 있습니다. 작업을 완료하고 나면 이 문서의 예를 사용하는 Java 응용 프로그램을 만들 수 있습니다.

Blob 저장소에 액세스하도록 응용 프로그램 구성

Azure 저장소 API를 사용하여 Blob에 액세스하려는 Java 파일의 맨 위에 다음 import 문을 추가합니다.

// Include the following imports to use blob APIs.
import com.microsoft.azure.storage.*;
import com.microsoft.azure.storage.blob.*;

Azure 저장소 연결 문자열 설정

Azure 저장소 클라이언트는 저장소 연결 문자열을 사용하여 데이터 관리 서비스에 액세스하기 위한 끝점 및 자격 증명을 저장합니다. 클라이언트 응용 프로그램에서 실행할 경우, 저장소 계정의 이름 및 Azure 포털에 나열된 저장소 계정의 기본 액세스 키를 AccountName*과 *AccountKey 값에 사용하여 다음 형식의 저장소 연결 문자열을 제공해야 합니다. 다음 예제에서는 연결 문자열을 포함할 정적 필드를 선언하는 방법을 보여 줍니다.

// Define the connection-string with your values
public static final String storageConnectionString =
    "DefaultEndpointsProtocol=http;" +
    "AccountName=your_storage_account;" +
    "AccountKey=your_storage_account_key";

Microsoft Azure의 역할 내에서 실행되는 응용 프로그램에서는 이 문자열이 서비스 구성 파일 *ServiceConfiguration.cscfg*에 저장될 수 있고, RoleEnvironment.getConfigurationSettings메서드 호출을 통해 이 문자열에 액세스할 수 있습니다. 다음 예제에서는 서비스 구성 파일에서 이름이 *StorageConnectionString*인 설정 요소의 연결 문자열을 가져옵니다.

// Retrieve storage account from connection-string.
String storageConnectionString =
    RoleEnvironment.getConfigurationSettings().get("StorageConnectionString");

다음 샘플에서는 저장소 연결 문자열을 가져오기 위해 위의 두 메서드 중 하나를 사용한 것으로 가정합니다.

컨테이너 만들기

CloudBlobClient 개체를 사용하면 컨테이너 및 Blob에 대한 참조 개체를 가져올 수 있습니다. 다음 코드는 CloudBlobClient 개체를 만듭니다.

참고:

CloudStorageAccount 개체를 만들 수 있는 방법이 더 있습니다. 자세한 내용은 Azure Storage Client SDK 참조에서 CloudStorageAccount를 참조하세요.

Azure 저장소의 모든 Blob은 컨테이너에 있어야 합니다. 컨테이너는 Blob 이름의 일부를 형성합니다. 예를 들어 mycontainer은(는) 이러한 샘플 Blob URI에서 컨테이너의 이름입니다.

https://storagesample.blob.core.windows.net/mycontainer/blob1.txt
https://storagesample.blob.core.windows.net/mycontainer/photos/myphoto.jpg

컨테이너 이름은 유효한 DNS 이름이어야 하고 다음 명명 규칙을 따라야 합니다.

  1. 컨테이너 이름은 문자 또는 숫자로 시작해야 하며 문자, 숫자 및 대시(-) 문자를 포함할 수 있습니다.
  2. 컨테이너 이름에서 모든 대시(-) 문자는 문자 또는 숫자 바로 앞뒤에 와야 하며 연속 대시를 사용할 수 없습니다.
  3. 컨테이너 이름의 모든 문자는 소문자여야 합니다.
  4. 컨테이너 이름의 길이는 3자 이상, 63자 이하여야 합니다.
중요:

컨테이너의 이름은 항상 소문자여야 합니다. 컨테이너 이름에 대문자를 포함하거나 컨테이너 명명 규칙을 위반하는 경우에 400 오류(잘못된 요청) 메시지를 받을 수 있습니다.

CloudBlobClient 개체를 사용하여 사용할 컨테이너에 대한 참조를 가져올 수 있습니다. 컨테이너가 없는 경우 createIfNotExists 메서드로 만들 수 있습니다. 기존 컨테이너가 있으면 해당 컨테이너가 반환됩니다. 기본적으로 새 컨테이너는 전용이므로 이 컨테이너에서 Blob을 다운로드하려면 앞에서 한 것처럼 저장소 액세스 키를 지정해야 합니다.

try
{
    // Retrieve storage account from connection-string.
    CloudStorageAccount storageAccount = CloudStorageAccount.parse(storageConnectionString);

    // Create the blob client.
   CloudBlobClient blobClient = storageAccount.createCloudBlobClient();

   // Get a reference to a container.
   // The container name must be lower case
   CloudBlobContainer container = blobClient.getContainerReference("mycontainer");

   // Create the container if it does not exist.
    container.createIfNotExists();
}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}

옵션: 공용 액세스에 대한 컨테이너 구성

컨테이너 권한은 기본적으로 개인 액세스용으로 구성되지만 인터넷에 있는 모든 사용자가 공용으로 읽기 전용 액세스를 사용할 수 있도록 컨테이너의 권한을 간단하게 구성할 수 있습니다.

// Create a permissions object.
BlobContainerPermissions containerPermissions = new BlobContainerPermissions();

// Include public access in the permissions object.
containerPermissions.setPublicAccess(BlobContainerPublicAccessType.CONTAINER);

// Set the permissions on the container.
container.uploadPermissions(containerPermissions);

컨테이너에 Blob 업로드

Blob에 파일을 업로드하려면 컨테이너 참조를 가져온 후 이 참조를 사용하여 Blob 참조를 가져옵니다. Blob 참조가 있으면 Blob 참조의 upload를 호출하여 스트림을 업로드할 수 있습니다. 이 작업은 Blob이 없는 경우 새로 만들고, Blob이 있는 경우 덮어씁니다. 다음 코드 샘플은 이 작업을 보여 주며, 컨테이너가 이미 만들어져 있다고 가정합니다.

try
{
    // Retrieve storage account from connection-string.
    CloudStorageAccount storageAccount = CloudStorageAccount.parse(storageConnectionString);

    // Create the blob client.
    CloudBlobClient blobClient = storageAccount.createCloudBlobClient();

   // Retrieve reference to a previously created container.
    CloudBlobContainer container = blobClient.getContainerReference("mycontainer");

    // Define the path to a local file.
    final String filePath = "C:\\myimages\\myimage.jpg";

    // Create or overwrite the "myimage.jpg" blob with contents from a local file.
    CloudBlockBlob blob = container.getBlockBlobReference("myimage.jpg");
    File source = new File(filePath);
    blob.upload(new FileInputStream(source), source.length());
}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}

컨테이너의 Blob 나열

컨테이너의 Blob을 나열하려면 Blob을 업로드할 때 수행한 것과 마찬가지로 컨테이너 참조를 가져옵니다. for 루프와 함께 컨테이너의 listBlobs 메서드를 사용할 수 있습니다. 다음 코드는 컨테이너에 있는 각 Blob의 Uri를 콘솔에 출력합니다.

try
{
    // Retrieve storage account from connection-string.
    CloudStorageAccount storageAccount = CloudStorageAccount.parse(storageConnectionString);

    // Create the blob client.
    CloudBlobClient blobClient = storageAccount.createCloudBlobClient();

    // Retrieve reference to a previously created container.
    CloudBlobContainer container = blobClient.getContainerReference("mycontainer");

    // Loop over blobs within the container and output the URI to each of them.
    for (ListBlobItem blobItem : container.listBlobs()) {
       System.out.println(blobItem.getUri());
   }
}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}

이름에 대한 경로 정보를 사용하여 Blob 이름을 지정할 수 있습니다. 이렇게 하면 기존 파일 시스템과 같이 구성 및 트래버스할 수 있는 가상 디렉터리 구조를 만듭니다. 디렉터리 구조는 가상만 해당됩니다. Blob 저장소에서 사용할 수 있는 리소스만 컨테이너 및 Blob입니다. 하지만 클라이언트 라이브러리는 가상 디렉터리를 참조하도록 CloudBlobDirectory 개체를 제공하며 이러한 방식으로 구성되는 Blob을 사용한 작업 과정을 단순화합니다.

예를 들어 이름이 "photos"인 컨테이너가 있는 경우 이 컨테이너에서 이름이 "rootphoto1", "2010/photo1", "2010/photo2" 및 "2011/photo1"인 Blob을 업로드할 수 있습니다. 이 작업은 "photos" 컨테이너 내에 "2010" 및 "2011" 가상 디렉터리를 만듭니다. "photos" 컨테이너에서listBlobs를 호출하면 최상위 수준에서 포함된 디렉터리 및 Blob을 나타내는CloudBlobDirectory 및 CloudBlob 개체가 반환된 컬렉션에 포함됩니다. 이 경우에는 디렉터리 "2010", "2011" 및 사진 "rootphoto1"이 반환됩니다. instanceof 연산자를 사용하여 이러한 개체를 구분할 수 있습니다.

선택적으로 useFlatBlobListing 매개 변수의 값을 True로 설정하여 listBlobs 메서드에 전달할 수도 있습니다. 그러면 모든 Blob이 디렉터리에 상관없이 반환됩니다. 자세한 내용은 Azure 저장소 클라이언트 SDK 참조에서 CloudBlobContainer.listBlobs를 참조하세요.

Blob 다운로드

Blob을 다운로드하려면 Blob 참조를 가져오기 위해 Blob을 업로드할 때 수행한 것과 동일한 단계를 따릅니다. 업로드 예제에서는 Blob 개체에 대해 upload를 호출했습니다. 다음 예제에서는 download를 호출하여 Blob을 로컬 파일에 저장하는 데 사용할 수 있는 FileOutputStream과 같은 스트림 개체로 Blob 콘텐츠를 전송합니다.

try
{
    // Retrieve storage account from connection-string.
   CloudStorageAccount storageAccount = CloudStorageAccount.parse(storageConnectionString);

   // Create the blob client.
   CloudBlobClient blobClient = storageAccount.createCloudBlobClient();

   // Retrieve reference to a previously created container.
   CloudBlobContainer container = blobClient.getContainerReference("mycontainer");

   // Loop through each blob item in the container.
   for (ListBlobItem blobItem : container.listBlobs()) {
       // If the item is a blob, not a virtual directory.
       if (blobItem instanceof CloudBlob) {
           // Download the item and save it to a file with the same name.
            CloudBlob blob = (CloudBlob) blobItem;
            blob.download(new FileOutputStream("C:\\mydownloads\" + blob.getName()));
        }
    }
}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}

Blob 삭제

Blob을 삭제하려면 Blob 참조를 가져온 후 deleteIfExists를 호출합니다.

try
{
   // Retrieve storage account from connection-string.
   CloudStorageAccount storageAccount = CloudStorageAccount.parse(storageConnectionString);

   // Create the blob client.
   CloudBlobClient blobClient = storageAccount.createCloudBlobClient();

   // Retrieve reference to a previously created container.
   CloudBlobContainer container = blobClient.getContainerReference("mycontainer");

   // Retrieve reference to a blob named "myimage.jpg".
   CloudBlockBlob blob = container.getBlockBlobReference("myimage.jpg");

   // Delete the blob.
   blob.deleteIfExists();
}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}

Blob 컨테이너 삭제

마지막으로 Blob 컨테이너를 삭제하려면 Blob 컨테이너 참조를 가져온 후 deleteIfExists를 호출합니다.

try
{
   // Retrieve storage account from connection-string.
   CloudStorageAccount storageAccount = CloudStorageAccount.parse(storageConnectionString);

   // Create the blob client.
   CloudBlobClient blobClient = storageAccount.createCloudBlobClient();

   // Retrieve reference to a previously created container.
   CloudBlobContainer container = blobClient.getContainerReference("mycontainer");

   // Delete the blob container.
   container.deleteIfExists();
}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}