에서 Azure Storage에 데이터 저장 및 액세스 Xamarin.Forms

Download Sample 샘플 다운로드

Azure Storage는 비정형 및 구조화된 데이터를 저장하는 데 사용할 수 있는 확장 가능한 클라우드 스토리지 솔루션입니다. 이 문서에서는 Azure Storage에 텍스트 및 이진 데이터를 저장하는 데 사용하는 Xamarin.Forms 방법과 데이터에 액세스하는 방법을 보여 줍니다.

Azure Storage는 다음과 같은 4가지 스토리지 서비스를 제공합니다.

  • Blob Storage Blob은 백업, 가상 머신, 미디어 파일 또는 문서와 같은 텍스트 또는 이진 데이터일 수 있습니다.
  • Table Storage는 NoSQL 키 특성 저장소입니다.
  • Queue Storage는 클라우드 서비스 간의 워크플로 처리 및 통신을 위한 메시징 서비스입니다.
  • File Storage는 SMB 프로토콜을 사용하여 공유 스토리지를 제공합니다.

스토리지 계정에는 다음과 같은 두 종류가 있습니다.

  • 범용 스토리지 계정은 단일 계정에서 Azure Storage 서비스에 대한 액세스를 제공합니다.
  • Blob Storage 계정은 Blob을 저장하기 위한 특수 스토리지 계정입니다. 이 계정 유형은 Blob 데이터만 저장해야 하는 경우에 권장됩니다.

이 문서와 함께 제공되는 샘플 애플리케이션에서는 이미지 및 텍스트 파일을 Blob Storage에 업로드하고 다운로드하는 방법을 보여 줍니다. 또한 Blob Storage에서 파일 목록을 검색하고 파일을 삭제하는 방법을 보여 줍니다.

Azure Storage에 대한 자세한 내용은 Storage 소개를 참조하세요.

참고 항목

Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.

Blob Storage 소개

Blob Storage는 다음 다이어그램에 표시된 세 가지 구성 요소로 구성됩니다.

Blob Storage Concepts

Azure Storage에 대한 모든 액세스는 스토리지 계정을 통해서입니다. 스토리지 계정에는 무제한의 컨테이너가 포함될 수 있으며, 컨테이너는 스토리지 계정의 용량 제한까지 무제한의 Blob을 저장할 수 있습니다.

Blob은 모든 형식 및 크기의 파일입니다. Azure Storage는 세 가지 Blob 유형을 지원합니다.

  • 블록 Blob은 클라우드 개체의 스트리밍 및 저장에 최적화되어 있으며 백업, 미디어 파일, 문서 등을 저장하는 데 적합합니다. 블록 Blob의 크기는 최대 195Gb일 수 있습니다.
  • 추가 Blob은 블록 Blob과 유사하지만 로깅과 같은 추가 작업에 최적화되어 있습니다. 추가 Blob의 크기는 최대 195Gb일 수 있습니다.
  • 페이지 Blob은 자주 읽기/쓰기 작업에 최적화되며 일반적으로 가상 머신 및 해당 디스크를 저장하는 데 사용됩니다. 페이지 Blob의 크기는 최대 1Tb일 수 있습니다.

참고 항목

Blob Storage 계정은 블록 및 추가 Blob을 지원하지만 페이지 Blob은 지원하지 않습니다.

Blob은 Azure Storage에 업로드되고 Azure Storage에서 바이트 스트림으로 다운로드됩니다. 따라서 파일을 업로드하기 전에 바이트 스트림으로 변환하고 다운로드 후 원래 표현으로 다시 변환해야 합니다.

Azure Storage에 저장된 모든 개체에는 고유한 URL 주소가 있습니다. 스토리지 계정 이름은 해당 주소의 하위 기본 형성하며, subdo기본 및 do기본 이름의 조합은 스토리지 계정에 대한 엔드포인트형성합니다. 예를 들어 스토리지 계정의 이름이 mystorageaccount인 경우 스토리지 계정의 기본 Blob 엔드포인트는 다음과 같습니다 https://mystorageaccount.blob.core.windows.net.

스토리지 계정의 개체에 액세스하기 위한 URL은 스토리지 계정의 개체 위치를 엔드포인트에 추가하여 작성됩니다. 예를 들어 Blob 주소의 형식 https://mystorageaccount.blob.core.windows.net/mycontainer/myblob은 다음과 같습니다.

설정

Azure Storage 계정을 애플리케이션에 Xamarin.Forms 통합하는 프로세스는 다음과 같습니다.

  1. 스토리지 계정 만들기 자세한 내용은 스토리지 계정 만들기 를 참조하세요.
  2. 애플리케이션에 Azure Storage 클라이언트 라이브러리 를 추가합니다 Xamarin.Forms .
  3. 스토리지 연결 문자열 구성합니다. 자세한 내용은 Azure Storage에 커넥트 참조하세요.
  4. Azure Storage에 액세스할 클래스에 Microsoft.WindowsAzure.Storage 해당 및 Microsoft.WindowsAzure.Storage.Blob 네임스페이스에 대한 지시문을 추가 using 합니다.

Azure Storage에 연결

스토리지 계정 리소스에 대한 모든 요청은 인증되어야 합니다. 익명 인증을 지원하도록 Blob을 구성할 수 있지만 애플리케이션이 스토리지 계정으로 인증하는 데 사용할 수 있는 두 가지 기본 방법이 있습니다.

  • 공유 키. 이 방법은 Azure Storage 계정 이름 및 계정 키를 사용하여 스토리지 서비스에 액세스합니다. 스토리지 계정에는 공유 키 인증에 사용할 수 있는 두 개의 프라이빗 키가 생성될 때 할당됩니다.
  • 공유 액세스 서명입니다. 이는 유효한 기간 동안 지정한 사용 권한으로 스토리지 리소스에 대한 위임된 액세스를 가능하게 하는 URL에 추가할 수 있는 토큰입니다.

애플리케이션에서 Azure Storage 리소스에 액세스하는 데 필요한 인증 정보를 포함하는 커넥트ion 문자열을 지정할 수 있습니다. 또한 Visual Studio에서 Azure Storage 에뮬레이터에 연결하도록 연결 문자열 구성할 수 있습니다.

참고 항목

Azure Storage는 연결 문자열 HTTP 및 HTTPS를 지원합니다. 그러나 HTTPS를 사용하는 것이 좋습니다.

Azure Storage 에뮬레이터에 커넥트

Azure Storage 에뮬레이터는 개발 목적으로 Azure Blob, 큐 및 테이블 서비스를 에뮬레이트하는 로컬 환경을 제공합니다.

다음 연결 문자열 사용하여 Azure Storage 에뮬레이터에 연결해야 합니다.

UseDevelopmentStorage=true

Azure Storage 에뮬레이터에 대한 자세한 내용은 개발 및 테스트에 Azure Storage 에뮬레이터 사용을 참조하세요.

공유 키를 사용하여 Azure Storage에 커넥트

다음 연결 문자열 형식을 사용하여 공유 키를 사용하여 Azure Storage에 연결해야 합니다.

DefaultEndpointsProtocol=[http|https];AccountName=myAccountName;AccountKey=myAccountKey

myAccountName 는 스토리지 계정의 이름으로 바꿔야 하며 myAccountKey 두 계정 액세스 키 중 하나로 바꿔야 합니다.

참고 항목

공유 키 인증을 사용하는 경우 계정 이름과 계정 키가 애플리케이션을 사용하는 각 사용자에게 배포되어 스토리지 계정에 대한 전체 읽기/쓰기 액세스 권한을 제공합니다. 따라서 테스트 목적으로만 공유 키 인증을 사용하고 다른 사용자에게 키를 배포하지 않습니다.

공유 액세스 서명을 사용하여 Azure Storage에 커넥트

SAS를 사용하여 Azure Storage에 연결하는 데 다음 연결 문자열 형식을 사용해야 합니다.

BlobEndpoint=myBlobEndpoint;SharedAccessSignature=mySharedAccessSignature

myBlobEndpoint 는 Blob 엔드포인트의 URL로 바꿔야 하며 mySharedAccessSignature SAS로 바꿔야 합니다. SAS는 리소스에 액세스하기 위한 프로토콜, 서비스 엔드포인트 및 자격 증명을 제공합니다.

참고 항목

프로덕션 애플리케이션에는 SAS 인증을 사용하는 것이 좋습니다. 그러나 프로덕션 애플리케이션에서 SAS는 애플리케이션과 번들로 제공되는 것이 아니라 요청 시 백 엔드 서비스에서 검색해야 합니다.

공유 액세스 서명에 대한 자세한 내용은 SAS(공유 액세스 서명) 사용을 참조하세요.

컨테이너 만들기

GetContainer 메서드는 명명된 컨테이너에 대한 참조를 검색하는 데 사용되며, 이 참조를 사용하여 컨테이너에서 Blob을 검색하거나 컨테이너에 Blob을 추가할 수 있습니다. 다음 코드 예제는 GetContainer 메서드를 보여줍니다.

static CloudBlobContainer GetContainer(ContainerType containerType)
{
  var account = CloudStorageAccount.Parse(Constants.StorageConnection);
  var client = account.CreateCloudBlobClient();
  return client.GetContainerReference(containerType.ToString().ToLower());
}

이 메서드는 CloudStorageAccount.Parse 연결 문자열 구문 분석하고 스토리지 계정을 나타내는 인스턴스를 반환 CloudStorageAccount 합니다. CloudBlobClient 컨테이너 및 Blob을 검색하는 데 사용되는 인스턴스는 메서드에 CreateCloudBlobClient 의해 만들어집니다. 메서드는 GetContainerReference 호출 메서드로 반환되기 전에 지정된 컨테이너를 인스턴스로 CloudBlobContainer 검색합니다. 이 예제에서 컨테이너 이름은 소문자 문자열로 변환된 열거형 값입니다 ContainerType .

참고 항목

컨테이너 이름은 소문자여야 하며 문자 또는 숫자로 시작해야 합니다. 또한 문자, 숫자 및 대시 문자만 포함할 수 있으며 길이는 3자에서 63자 사이여야 합니다.

메서드는 GetContainer 다음과 같이 호출됩니다.

var container = GetContainer(containerType);

CloudBlobContainer 그런 다음, 인스턴스가 아직 없는 경우 컨테이너를 만드는 데 사용할 수 있습니다.

await container.CreateIfNotExistsAsync();

기본적으로 새로 만든 컨테이너는 프라이빗입니다. 즉, 컨테이너에서 Blob을 검색하려면 스토리지 액세스 키를 지정해야 합니다. 컨테이너 내에서 Blob을 공용으로 만드는 방법에 대한 자세한 내용은 컨테이너 만들기를 참조하세요.

컨테이너에 데이터 업로드

UploadFileAsync 메서드는 Blob Storage에 바이트 데이터 스트림을 업로드하는 데 사용되며 다음 코드 예제에 나와 있습니다.

public static async Task<string> UploadFileAsync(ContainerType containerType, Stream stream)
{
  var container = GetContainer(containerType);
  await container.CreateIfNotExistsAsync();

  var name = Guid.NewGuid().ToString();
  var fileBlob = container.GetBlockBlobReference(name);
  await fileBlob.UploadFromStreamAsync(stream);

  return name;
}

컨테이너 참조를 검색한 후 메서드는 컨테이너가 아직 없는 경우 컨테이너를 만듭니다. 그런 다음 고유한 Blob 이름으로 작동하도록 새 Guid Blob이 만들어지고 Blob 블록 참조가 인스턴스로 CloudBlockBlob 검색됩니다. 그런 다음, 데이터 스트림은 메서드를 사용하여 UploadFromStreamAsync Blob에 업로드됩니다. 이 메서드는 Blob이 아직 없는 경우 Blob을 만들거나 Blob이 있는 경우 덮어씁니다.

이 메서드를 사용하여 Blob Storage에 파일을 업로드하려면 먼저 바이트 스트림으로 변환해야 합니다. 다음 코드 예제에서 설명합니다.

var byteData = Encoding.UTF8.GetBytes(text);
uploadedFilename = await AzureStorage.UploadFileAsync(ContainerType.Text, new MemoryStream(byteData));

text 데이터는 바이트 배열로 변환된 다음 메서드에 전달되는 스트림으로 래핑됩니다UploadFileAsync.

컨테이너에서 데이터 다운로드

GetFileAsync 메서드는 Azure Storage에서 Blob 데이터를 다운로드하는 데 사용되며 다음 코드 예제에 나와 있습니다.

public static async Task<byte[]> GetFileAsync(ContainerType containerType, string name)
{
  var container = GetContainer(containerType);

  var blob = container.GetBlobReference(name);
  if (await blob.ExistsAsync())
  {
    await blob.FetchAttributesAsync();
    byte[] blobBytes = new byte[blob.Properties.Length];

    await blob.DownloadToByteArrayAsync(blobBytes, 0);
    return blobBytes;
  }
  return null;
}

컨테이너 참조를 검색한 후 메서드는 저장된 데이터에 대한 Blob 참조를 검색합니다. Blob이 있는 경우 해당 속성은 메서드에 FetchAttributesAsync 의해 검색됩니다. 올바른 크기의 바이트 배열이 만들어지고 Blob이 호출 메서드로 반환되는 바이트 배열로 다운로드됩니다.

Blob 바이트 데이터를 다운로드한 후 원래 표현으로 변환해야 합니다. 다음 코드 예제에서 설명합니다.

var byteData = await AzureStorage.GetFileAsync(ContainerType.Text, uploadedFilename);
string text = Encoding.UTF8.GetString(byteData);

바이트 배열은 메서드에 의해 GetFileAsync Azure Storage에서 검색된 후 UTF8로 인코딩된 문자열로 다시 변환됩니다.

컨테이너에 데이터 나열

GetFilesListAsync 메서드는 컨테이너에 저장된 Blob 목록을 검색하는 데 사용되며 다음 코드 예제에 나와 있습니다.

public static async Task<IList<string>> GetFilesListAsync(ContainerType containerType)
{
  var container = GetContainer(containerType);

  var allBlobsList = new List<string>();
  BlobContinuationToken token = null;

  do
  {
    var result = await container.ListBlobsSegmentedAsync(token);
    if (result.Results.Count() > 0)
    {
      var blobs = result.Results.Cast<CloudBlockBlob>().Select(b => b.Name);
      allBlobsList.AddRange(blobs);
    }
    token = result.ContinuationToken;
  } while (token != null);

  return allBlobsList;
}

컨테이너 참조를 검색한 후 메서드는 컨테이너의 ListBlobsSegmentedAsync 메서드를 사용하여 컨테이너 내의 Blob에 대한 참조를 검색합니다. 메서드에서 반환된 결과는 인스턴스가 ListBlobsSegmentedAsync 아닌 null동안 BlobContinuationToken 열거됩니다. 각 Blob은 컬렉션에 값이 추가되기 CloudBlockBlob 전에 Blob의 속성에 액세스 Name 하기 위해 반환 IListBlobItem 된 Blob에서 a로 allBlobsList 캐스팅됩니다. 인스턴스가 BlobContinuationTokennull되면 마지막 Blob 이름이 반환되고 실행이 루프를 종료합니다.

컨테이너에서 데이터 삭제

DeleteFileAsync 메서드는 컨테이너에서 Blob을 삭제하는 데 사용되며 다음 코드 예제에 나와 있습니다.

public static async Task<bool> DeleteFileAsync(ContainerType containerType, string name)
{
  var container = GetContainer(containerType);
  var blob = container.GetBlobReference(name);
  return await blob.DeleteIfExistsAsync();
}

컨테이너 참조를 검색한 후 메서드는 지정된 Blob에 대한 Blob 참조를 검색합니다. 그런 다음, 메서드를 사용하여 Blob이 DeleteIfExistsAsync 삭제됩니다.