login register Sysop! about ME  
qrcode
    최초 작성일 :    2012년 06월 12일
  최종 수정일 :    2012년 06월 12일
  작성자 :    hanhead
  편집자 :    hanhead (정 재훈)
  읽음수 :    33,527

강좌 목록으로 돌아가기

필자의 잡담~

이번 Azure 컬럼은 "블랍(Blob) 저장소 서비스 사용하기" 컬럼이며, 정재훈(hanhead)님이 번역해주셨습니다.
How to 시리즈의 첫 번째 컬럼이며, 원문의 주소는 다음과 같습니다.

http://www.windowsazure.com/en-us/develop/net/how-to-guides/blob-storage

번역해주신 정재훈님께 감사의 말씀 드립니다

이 글은 Windows Azure 공식 컬럼인 http://www.windowsazure.com/en-us/develop/net/how-to-guides/blob-storage의 글을 편역한 내용입니다. 마이크로소프트의 공식 번역 문서가 아니며 태오 사이트 MS 컬럼 번역팀에서 번역한 내용입니다. 그렇기에, 일부 오역이나 오타가 존재할 수 있는 점 미리 양해를 구합니다. 원문에 대한 모든 저작권은 마이크로소프트에 있으며, 컬럼 내용과 관련한 질의 문답 역시 원문 사이트에 문의하시는 것을 추천드립니다.

블랍(Blob) 저장소 서비스 사용하기

우선 내용에 들어가기 전에 블랍(BLOB)이라는 단어가 생소한 분들을 위해서 간단하게 일반적인 의미를 살펴보면 영문으로는 BLOB 혹은 BLOb으로 표기하고 binary large object나 basic large object의 줄임말이라고 볼 수 있습니다.

대개의 경우, 데이터베이스 시스템에서 많이 사용되는 용어로 이미지, 영상, 음악, 실행 파일 등의 같은 바이너리 데이터 형식을 블랍(BLOB) 데이터 형식이라고 합니다. 간단하게 라면, 단일 파일과 같은 바이너리 데이터를 블랍이라고 생각하셔도 큰 무리는 없을 것입니다.

이번 강좌는 바로 이러한 블랍(BLOB) 데이터를 저장할 수 있는 Windows Azure의 블랍(BLOB) 저장소 서비스를 이용하는 것에 관해서 살펴 보도록 하겠습니다. 일반적인 파일 올리기, 목록보기, 내려 받기, 삭제가 포함된 시나리오의 작업을 어떻게 수행할 지를 예제로 진행해보려 합니다.

이 예제는 C#과 Azure .NET API를 이용하여 작성되었습니다. 보다 더 많은 내용을 원하시는 분은 "다음으로 볼 내용들"을 참고해주십시오.

목차

블랍(BLOB) 저장소란

Windows Azure 블랍(BLOB) 저장소는 많은 구조화 되어지지 않은 데이터를 저장하고 어디에서나 http나 https를 통해서 접근할 수 있는 서비스입니다. 한번에 수백 기가 크기의 파일을 이용할 수 있으며 하나의 계정에 100TB 달하는 블랍(BLOB)을 저장할 수 있습니다. 일반적으로 아래와 같은 용도로 사용됩니다.

  • 이미지나 문서를 브라우저로 바로 서비스하기
  • 분산 환경의 접근을 위한 파일들의 저장
  • 영상과 음성 파일의 스트리밍
  • 안전한 백업과 재해 복구
  • 온프레미스 기반의 프로그램이나 Windows Azure에서 개발한 서비스로 분석 데이터 저장

블랍(BLOB) 저장소는 회사 내부 시스템의 저장소로나 데이터를 외부로 공개하기 위한 용도로 사용할 수 있습니다.

개념

블랍(BLOB) 서비스는 아래와 같이 구성되어 있습니다.


출처 : http://www.windowsazure.com/media/devcenter/shared/blob1.jpg

  • 계정(Account), 저장소 계정:

    Windows Azure의 저장소로의 모든 접근은 저장소 계정을 통하여 이루어지며 블랍(BLOB)들의 최상위 네임스페이스입니다. 저장소 계정에는 컨테이너를 제한 없이 생성할 수 있습니다. 단 저장소 계정당 100 TB(테라바이트)를 초과할 수 없습니다.

  • 컨테이너(Container):

    컨테이너는 여러 개의 블랍(BLOB)을 하나로 묶을 수 있도록 해줍니다. 블랍(BLOB)은 반드시 컨테이너(container)에 포함되어야 합니다. 저장소 계정에서 설명되었듯이 하나에 계정에 무제한으로 컨테이너를 만들 수 있습니다. 그리고, 컨테이너 안에 제한 없이 블랍(BLOB)을 넣을 수 있습니다.

  • 블랍(Blob):

    모든 종류와 크기의 파일을 의미합니다. Windows Azure 저장소에 저장할 수 있는 블랍(BLOB)은 2가지 종류가 있는데, 각각 블록 블랍(Block Blob)과 페이지 블랍(Page Blob)으로 구분됩니다.

    우리가 알고 있는 대부분의 파일은 블록 블랍(BLOB)이라고 보시면 됩니다. 그리고 이 블록 블락(Block Blob)은 하나에 200 GB(200기가)까지 저장될 수 있습니다. 이번 강좌에서는 블록 블랍(Block Blob)을 다루게 됩니다.

    페이지 블랍(Page Block)은 블록 블랍(Block Blob)과는 다른 종류의 블랍(BLOB)으로 하나에 1 TB(1테라)까지 사용할 수 있으며, 특정 영역의 바이트에 대해 잦은 수정을 해야 하는 경우 유용합니다.

    블랍(BLOB)에 관한 좀더 자세한 정보는 블록 블락과 페이지 블랍 이해하기를 참고하십시오.

  • URL형식 :

    블랍(BLOB)들은 다음과 같은 URL형식으로 접근이 가능합니다.

    http://<저장소계정>.blob.core.windows.net/<컨테이너>/<블랍>

    예를 들면, 위 그림의 내용 중에 MOV1.AVI에 해당 하는 URL은 아래와 같습니다.

    http://sally.blob.core.windows.net/movies/MOV1.AVI

Windows Azure 저장소 계정 만들기

블랍(BLOB) 저장소 서비스를 사용하기 위해서는 Windows Azure 저장소 계정이 필요합니다. 아래와 같이 순서대로 따라 하시면 수동으로 저장소 계정을 생성할 수 있습니다(REST API를 이용하여 프로그램을 만들어서 저장소 계정을 생성할 수도 있습니다):

  1. Windows Azure 관리 포탈에 로그인합니다.
  2. 하단 메뉴 바의 좌측에 있는 +NEW 버튼을 클릭합니다.


    출처 : http://www.windowsazure.com/media/devcenter/shared/plus-new.png

  3. Storage를 선택한 다음 Quick Create를 클릭합니다.


    출처 : http://www.windowsazure.com/media/devcenter/shared/quick-storage.png

  4. URL에 저장소 계정의 URI에 하위 도메인으로 사용할 이름을 입력합니다. 3글자 이상 24글자 이하의 소문자나 숫자로 입력 가능합니다. 이 이름은 블랍(BLOB), 큐(Queue) 그리고 테이블 저장소의 URI에 호스트 명으로 사용됩니다.
  5. Choose a region or affinity group은 저장소의 물리적인 위치를 설정하는 것입니다. 일반적으로 Windows Azure로 프로그램을 작성한다면 해당 애플리케이션이 위치해야 할 지역을 선택하면 됩니다.
  6. CREATE STORAGE ACCOUNT를 클릭합니다.
  7. 제법 기다리면 저장소 서비스가 생성됩니다. 관리 포털 좌측 메뉴의 Storage를 선택하면 나타나는 저장소 목록에서 새로 생성된 저장소를 클릭합니다.

  8. 화면 하단 메뉴 바 중앙에 MANAGE KEYS라는 버튼이 생깁니다. 이걸 클릭합니다.

  9. 조금 기다리면 MANAGE ACCESS KEYS라는 팝업이 생깁니다. PRIMARY ACCESS KEY를 복사해둡니다. 이 키는 이후 진행할 가이드에서 사용됩니다.

Windows Azure 저장소 연결 문자열 설정하기

Windows Azure 닷넷 저장소 API는 저장소 연결 문자열을 통해서 저장소 서비스에 접근할 수 있는 위치정보와 권한을 설정할 수 있도록 되어 있습니다. 그리고, 해당 연결문자열을 프로그램 내에 하드 코딩 하는 것보다는 설정파일에 저장소 연결문자열을 넣는 것이 좋습니다. 이 가이드는 Windows Azure 서비스 설정 시스템에 여러분의 연결 문자열을 저장하는 것을 보여드릴 것입니다.

  • Windows Azure 서비스를 사용한다면 Windows Azure 서비스 설정 (*.csdef와 *.cscfg파일들)에 연결문자열을 저장하는 것이 좋습니다.
  • Windows Azure 웹사이트나 가상머신(VM)을 이용한다면 닷넷 설정(web.config파일)에 저장하는 것이 좋습니다.

2가지 경우 모두 CloudConfigurationManager 클래스의 정적 메서드인 GetSetting을 이용하여 연결문자열을 가져올 수 있습니다.

클라우드 서비스에서 연결 문자열 설정하기

이 서비스 설정을 위한 프로젝트는 사용하시는 Windows Azure 솔루션 내에서 유일하여야 하며 이 프로젝트를 통해서 Windows Azure 관리 포털에 다시 응용 프로그램을 배포하지 않고도 동적으로 설정 변경을 할 수 있게 해줍니다.

이제, Windows Azure 설정에 연결 문자열을 설정해보도록 하겠습니다.

  1. 비주얼 스튜디오의 솔루션 탐색기를 엽니다. Windows Azure 배포 프로젝트의 Roles이라는 폴더를 우 클릭하거나, 웹 롤(Web Role) 또는 작업 롤(Worker Role)을 우 클릭하여 속성을 선택합니다.


    출처 : http://www.windowsazure.com/media/devcenter/dotnet/blob5.png

  2. Settings라는 탭을 클릭하고 Add Setting이라는 버튼을 누릅니다.


    출처 : http://www.windowsazure.com/media/devcenter/dotnet/blob6.png

    그럼 새로운 "Setting1"하는 열이 설정에 나타납니다.

  3. 이 새로 만들어진 "Setting1"이라는 열의 Type이라는 선택박스에서 Connection String을 선택합니다.


    출처 : http://www.windowsazure.com/media/devcenter/dotnet/blob7.png

  4. 해당 열 우측 끝에 있는 [...]이라는 버튼을 클릭합니다. 그러면 Storage Account Connection String(저장소 계정 연결 문자열)이라는 대화상자가 열립니다.
  5. 해당 창에서 로컬 컴퓨터에서 동작하는 Windows Azure 저장소 에뮬레이트를 사용하거나 클라우드의 실제 저장소 계정을 선택할 수 있습니다. 실제 클라우드 저장소를 사용하기 위해서는 Enter storage account credentials를 선택하고 이전 내용에서 설정하였던 저장소 계정이름을 Account name에 넣고 저장해 둔 Primary Access Key값을 그 아래의 Account key에 입력하면 됩니다.


    출처 : http://www.windowsazure.com/media/devcenter/dotnet/blob8.png

  6. 해당 열에 Name이라는 칼럼이 "Setting1"이라고 되어 있는데 이걸 보다 직관적인 StorageConnectionString같은 형태로 변경합니다. 해당 이름은 나중에 나오는 예제 소스에서 사용될 것 입니다.


    출처 : http://www.windowsazure.com/media/devcenter/dotnet/blob9.png

웹사이트나 가상 머신에서 연결문자열 설정하기

웹사이트나 가상 머신을 사용하신다면 닷넷 설정(,web.config 등)을 이용하실 것을 추천합니다. <appSettings>에 연결 문자열을 아래와 같은 형식으로 저장할 수 있습니다.

<configuration>
  <appSettings>
    <add key="StorageConnectionString"
        value="DefaultEndpointsProtocol=https;AccountName=[AccountName];AccountKey=[AccountKey]" />
  </appSettings>
</configuration>

좀 더 자세한 정보는 연결문자열 설정하기(http://msdn.microsoft.com/en-us/library/windowsazure/ee758697.aspx)를 참조해주십시오.

자, 이제 How to 가이드를 공부하기 위한 준비가 완료되었습니다~~!

How To: 닷넷을 이용하여 블랍 저장소로 접근하기

Windows Azure 저장소로 접근하기 원하는 C# 파일에 아래와 같은 네임스페이스 선언을 추가합니다.

using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.StorageClient;

Windows Azure 서비스 설정에 있는 저장소 연결 문자열과 저장소 계정 정보를 가지고 아래와 같이 RoleEvironment개체의 GetConfigurationSetting 정적 메서드나 CloudStorageAccount 개체의 GetSetting이라는 정적 메서드를 통해서 Azure 서비스 설정 값을 읽어와서 CloudStorageAccount개체의 Parse라는 정적 메서드를 통해서 CloudStorageAccount개체를 반환 받을 수 있습니다.

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

이렇게 반환 받은 CloudStorageAccount개체의 CreateCloudBlobClient메서드로 컨테이너와 블랍(BLOB)에 접근할 수 있는 CloudBlobClient개체를 아래와 같이 생성할 수 있습니다.

CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

How To: 컨테이너 만들기

블랍(BLOB)은 컨테이너 안에 넣어야만 합니다. 그래서 먼저 컨테이너를 만들어보도록 하겠습니다. 아래 예제와 같이 이전에 살펴보았던 방법대로 반환된 CloudBlobClient를 통해서 컨테이너 참조를 가지고 올 수 있습니다. 그리고, 그 컨테이너 참조를 통해서 컨테이너가 존재하지 않은 경우에는 만들 수 있습니다.

// 설정의 연결문자를 가져와서 클라우드 저장소 계정 개체를 생성합니다.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

// 블랍(BLOB) 클라이언트를 생성합니다.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

// 컨테이너 참조를 반환 받습니다.
CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");

// 해당 컨테이너 참조의 컨테이너 존재하지 않는다면 만들도록 합니다.
container.CreateIfNotExist();

이렇게 생성된 컨테이너는 기본적으로 사설(private) 컨테이너 입니다. 다시 말해서 공용으로 접근할 수 있는 상태가 아닙니다. 그래서, 해당 컨테이너로부터 블랍(BLOB)을 내려 받으려면 이전에 살펴보았던 저장소 계정 키라는 것이 있어야 합니다. 그러면, 이 컨테이너를 모든 사람이 접근할 수 있는 공유 컨테이너로 만들려고 하면 어떻게 해야 할까요? 아래와 같이 공용 접근을 허용하는 권한 설정을 해주면 됩니다.

container.SetPermissions(
    new BlobContainerPermissions {
        PublicAccess = BlobContainerPublicAccessType.Blob
    });

위의 예제는 어떤 사람이라도 인터넷을 통해서 해당 공용 컨테이너 안의 블랍(BLOB)을 볼 수 있도록 하는 것입니다. 하지만 수정, 삭제의 경우는 접근 키를 가지고 있어야 합니다.

How To: 컨테이너로 파일 올리기

파일 올리기를 하려면 이전에 살펴보았던 방법으로 생성된 컨테이너 참조를 통해서 블랍(BLOB) 참조를 만들어서 UploadFromStrea 메서드를 통해서 파일 스트림(File Stream)을 올릴 수 있습니다. 이렇게 파일을 올리게 되면 이미 파일이 있다면 덮어쓰기가 되고 없으면 생성이 됩니다.

자, 아래의 예제는 이전의 과정을 통해서 이미 컨테이너가 이미 만들어져 있다고 가정하고 작성해보도록 하겠습니다.

// 설정의 연결문자를 가져와서 클라우드 저장소 계정 개체를 생성합니다.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

// 블랍(BLOB) 클라이언트를 생성합니다.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

// 컨테이너 참조를 반환 받습니다.
CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");

// "myblob"이라는 블랍(BLOB)의 참조를 반환 받습니다.
CloudBlob blob = container.GetBlobReference("myblob");

// 로컬 파일을 "myblob"이라는 블랍(BLOB) 참조에 올리기 하여 덮어쓰거나 새로 생성합니다.
using (var fileStream = System.IO.File.OpenRead(@"path\myfile"))
{
    blob.UploadFromStream(fileStream);
}

How To: 컨테이너 안의 파일목록 나열하기

컨테이너 안의 파일 목록을 조회하기 위해서는 우선 컨테이너 참조를 생성하고 컨테이너 참조 개체의 ListBlobs라는 메서드를 호출하여 해당 컨테이너 안의 블랍(BLOB)들을 반환할 수 있습니다. 아래의 예제는 컨테이너 안의 블랍(BLOB)들의 Uri를 반환 받아서 출력하는 내용입니다.

// 설정의 연결문자를 가져와서 클라우드 저장소 계정 개체를 생성합니다.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

// 블랍(BLOB) 클라이언트를 생성합니다.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

// 컨테이너 참조를 반환 받습니다.
CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");

// 컨테이너 참조의 ListBlobs 메서드를 통해서 반환되는 블랍(BLOB)들의 Uri 확인합니다.
foreach (var blobItem in container.ListBlobs())
{
    Console.WriteLine(blobItem.Uri);
}

블랍(BLOB) 서비스는 컨테이너 안에 directory 개념의 폴더들과 폴더 구조를 가질 수 있습니다.

예를 들어, "photos"라는 컨테이너에 블랍(BLOB)의 이름을 "rootphoto1", "2010/photo1", "2010/photo2", "2011/photo1"으로 해서 파일을 올리게 되면 가상으로 2010, 2011이라는 디렉터리가 생성이 됩니다.

이렇게 컨테이너는 블랍(BLOB)과 디렉터리를 포함할 수 있기 때문에 ListBlobs라는 메서드를 호출하면 해당 컨테이너의 최 상단에 있는 CloudBlobDirectory(디렉터리에 해당됨)들과 CloudBlob(파일에 해당됨)들을 반환합니다. 위의 예로 보면 2010, 2011이라는 디렉터리와 rootphoto1이라는 파일을 반환하는 겁니다.

BlobRequestOption라는 클래스를 생성하고 UseFlatBlobListing이라는 속성을 true로 설정하여 ListBlobs라는 메서드에 전달하면 결과는 디렉터리 구조를 제외한 채 해당 컨테이너의 모든 블랍(BLOB)이 한번에 반환됩니다. 좀더 자세한 정보는 MSDN의 CloudBlobContainer.ListBlobs를 참고하십시오.

How To: 파일 다운로드

블랍(BLOB)을 내려 받기 위해서는 먼저 블랍(BLOB) 참조를 반환 받은 다음, 아래와 같이 DownloadToStream 메서드를 통해서 블랍(BLOB)의 내용을 스트림 개체로 변환한 후에 로컬 파일로 저장할 수 있습니다. 그 외에도 블랍(BLOB) 참조의 DownloadToFile, DownloadByteArray 그리고 DownloadText 메서드를 이용할 수 있습니다.

// 설정의 연결문자를 가져와서 클라우드 저장소 계정 개체를 생성합니다.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

// 블랍(BLOB) 클라이언트를 생성합니다.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

// 컨테이너 참조를 반환 받습니다.
CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");

// "myblob"이라는 블랍(BLOB)의 참조를 반환 받습니다.
CloudBlob blob = container.GetBlobReference("myblob");

// 블락의 내용을 로컬로 내려받습니다.
using (var fileStream = System.IO.File.OpenWrite(@"path\myfile"))
{
    blob.DownloadToStream(fileStream);
}

How To: 파일 삭제

마지막으로, 블랍(BLOB)을 삭제하기 위해서는 블랍(BLOB) 참조를 가져와서 삭제(Delete) 메서드를 호출하면 됩니다.

// 설정의 연결문자를 가져와서 클라우드 저장소 계정 개체를 생성합니다.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

// 블랍(BLOB) 클라이언트를 생성합니다.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

// 컨테이너 참조를 반환 받습니다.
CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");

// "myblob"이라는 블랍(BLOB)의 참조를 반환 받습니다.
CloudBlob blob = container.GetBlobReference("myblob");

// 블랍(BLOB)을 삭제합니다.
blob.Delete();

다음으로 볼 내용들

여기까지 블랍(BLOB) 저장소의 기본적인 내용을 살펴보았습니다. 아래의 링크를 이용하면 좀더 어려운 저장소에 관한 작업에 관해서 배울 수 있을 것입니다.


authored by


 
 
.NET과 Java 동영상 기반의 교육사이트

로딩 중입니다...

서버 프레임워크 지원 : NeoDEEX
based on ASP.NET 3.5
Creative Commons License
{5}
{2} 읽음   :{3} ({4})