Windows Azure 개발: 간단한 방명록 만들기 [Step 1]

Windows Azure Platform의 정식 서비스 시작이 이제 얼마 남지 않았습니다. Windows Azure Platform은 시중에 알려진 대로, 올해 2월 1일부터 서비스 요금을 책정하기 시작하여 본격적으로 운영에 들어가게 될 것으로 보입니다.


 


Windows Azure Platform은 일반적으로 우리가 쉽게 신청하여 사용하는 웹 호스팅 서비스와는 달리, 철저히 서비스 기반의 응용프로그램만을 위한 특별한 플랫폼입니다. 그리고, 이에 따라, 서비스 사용량 측정 방식이나 과금 체계가 웹 호스팅과는 전혀 다르게 이루어지게 됩니다.


 


Platform Training Kit을 비롯하여 많은 자료들이 소개되고 있지만, 국내 웹 사이트에서 Windows Azure Platform을 본격적으로 다루고 소개하는 자료는 아직 많이 없는 듯 합니다. 이러한 배경을 바탕으로, 조금씩, 이해하기 쉽고 접근하기 쉬운 주제를 기초로 정식 서비스 시행 이전까지 Windows Azure Platform 개발에 관련된 내용들을 소개하고자 합니다.


 


Windows Azure 응용프로그램을 개발하기 위해서는, Windows Azure Tools를 다운로드받아서 설치해야 합니다. Windows Azure Tools는 Visual Studio 2008과 Visual Studio 2010을 위한 Add-On으로, Windows Azure 어플리케이션을 로컬 컴퓨터에서 시뮬레이션하고, Windows Azure Platform에 게시할 수 있도록 패키지를 작성하는 도구를 포함합니다.


 


다운로드: http://www.microsoft.com/downloads/details.aspx?FamilyID=6967ff37-813e-47c7-b987-889124b43abd&displaylang=en


 


오늘 강좌에서 다루어볼 예제는 방명록입니다. Windows Azure Platform의 Compute 기능과 Table Storage 기능을 사용하여 만들어 보도록 하겠습니다.


 



 


Windows Azure Tools를 설치한 후, Visual Studio 2008을 열어서 새 프로젝트를 만들면, 위와 같이 Windows Azure 프로젝트 템플릿이 설치되어있는 것을 볼 수 있습니다.


 



 


기존의 프로젝트/솔루션과는 달리 대상 언어와 프로젝트의 세부 종류를 추가적으로 선택할 수 있는 대화 상자가 나타납니다. 화면에서 왼쪽에 나열된 것이 언어 별로 선택할 수 있는 프로젝트 템플릿이고, 오른쪽에 나열된 것이 추가할 프로젝트 템플릿입니다.



  • Web Role: ASP.NET 기반의 응용프로그램입니다.

  • WCF Service Role: WCF 서비스를 독립적으로 실행할 수 있도록 합니다.

  • Worker Role: 백그라운드에서 실행되는 서비스 응용프로그램입니다.

  • CGI Web Role: FastCGI 기반의 응용프로그램을 작성할 수 있게 합니다.


 


프로젝트를 추가한 후, 솔루션 탐색기의 구성 내역을 살펴보면, 위와 같이 나타납니다.


 


위의 그림에서 GuestBook 프로젝트는 Windows Azure Platform에 게시될 응용프로그램에 대한 프로젝트입니다. Roles 폴더 안에, 포함될 실제 응용프로그램에 대한 참조를 관리하게 되며, CSCFG 파일에 게시될 응용프로그램에 대한 설정을 넣게 됩니다.


 


만약, 기존에 개발한 ASP.NET 응용프로그램이 있다면 솔루션에 프로젝트 사본을 추가하고, Roles 폴더 안에 참조를 추가하여 쉽게 패키지로 구성할 수 있습니다.


 


이제, Windows Azure Table Storage에 데이터 모델을 정의해 보도록 하겠습니다. 방명록에 어떤 형태로 데이터가 저장되어야 하는지를 정의하기 위하여 데이터베이스 대신 코드 수준에서 손쉽게 정의할 수 있습니다.


 


이번에는, 단순한 클래스 라이브러리 프로젝트를 아래와 같이 생성합니다. Azure 서비스에 포함되어야 하는 프로젝트 임을 명시하기 위하여 Data 라는 접미사를 프로젝트 이름에 붙였습니다.


 



 


그리고, 프로젝트 참조 추가 대화 상자를 열어, System.Data.Services.Client 어셈블리를 추가합니다.


 



 


그리고, Windows Azure Table Storage에 데이터를 저장하거나 가져올 수 있는 LINQ Data Context를 3개의 클래스로 구성하여 작성합니다.



  • GuestBookEntry 클래스: Table Storage에 데이터를 저장하거나 가져올 수 있는 기본 단위 (Atom)를 구성하는 클래스입니다.

  • GuestBookDataContext 클래스: Table Storage에 어떤 테이블을 저장할 것인지를 모델링하는 클래스로, LINQ를 위한 Data Context 클래스의 역할도 수행합니다.

  • GuestBookEntryDataSource 클래스: Table Storage에 자료 구조를 생성하고, 실제로 데이터를 Create/Read/Update/Delete 하는 것을 관여하는 클래스이며, 상속을 받는 대상이 없는 평이한 클래스입니다.

[code csharp]
using System;
using Microsoft.WindowsAzure.StorageClient;
// 방명록에 대한 엔티티를 정의합니다.
public class GuestBookEntry : TableServiceEntity
{
  public GuestBookEntry()
  {
    // 같은 종류의 데이터를 묶어서 관리하기 위한 키를 지정합니다.
    // 아래와 같이 지정함으로서, 연/월/일 별로 방명록 데이터를 묶게 됩니다.
    PartitionKey = DateTime.ToString(“MMddyyyy”);
    // RDBMS에서 Primary Key를 설정하는것과 마찬가지로, 데이터를 정렬하고, 고유성을 부여하기 위하여
    // RowKey를 지정합니다.
    RowKey = string.Format(“{0:10}
{1}”, DateTime.MaxValue.Ticks – DateTime.Now.Ticks, uid.NewGuid());
  }
  // 모델 정의 시작
  public string Message { get; set; }
  public string GuestName { get; set; }
  public string PhotoUrl { get; set; }
  public string ThumbnailUrl { get; set; }
  // 모델 정의 끝
}
[/code]


 


[code csharp]
using System;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.StorageClient;
// 방명록에 대한 데이터 컨텍스트를 정의합니다.
public class GuestBookDataContext : TableServiceContext
{
  public GuestBookDataContext(string baseAddress, StorageCredentials credentials)
    : base(baseAddress, credentials)
  {
  }
  public IQueryable<GuestBookEntry> GuestBookEntry
 {
    get
    {
      return this.CreateQuery<GuestBookEntry>(“GuestBookEntry”);
    }
  }
}
[/code]


 


[code csharp]
using System;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.StorageClient;

public class GuestBookEntryDataSource
{
  private static CloudStorageAccount storageAccount;
  private GuestBookDataContext context;
  static GuestBookEntryDataSource()
  {
    // 나중에 여기에 Windows Azure Storage 계정에 대한 연결 문자열이 설정되어야 합니다.
    storageAccount = CloudStorageAccount.FromConfigurationSetting(“DataConnectionString”);
    CloudTableClient.CreateTablesFromModel(
        typeof(GuestBookDataContext),
        storageAccount.TableEndpoint.AbsoluteUri,
        storageAccount.Credentials); // Context 클래스를 통하여 자료 구조 생성
  }
  public GuestBookEntryDataSource()
  {
    this.context = new GuestBookDataContext(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials);
    this.context.RetryPolicy = RetryPolicies.Retry(3, TimeSpan.FromSeconds(1));
  }
  public IEnumerable<GuestBookEntry> Select()
  {
    var results = from g in this.context.GuestBookEntry
                  where g.PartitionKey == DateTime.UtcNow.ToString(“MMddyyyy”)
                  select g;
    return results;
  }
  public void AddGuestBookEntry(GuestBookEntry newItem)
  {
    this.context.AddObject(“GuestBookEntry”, newItem);
    this.context.SaveChanges();
  }
  public void UpdateImageThumbnail(string partitionKey, string rowKey, string thumbUrl)
  {
    var results = from g in this.context.GuestBookEntry
                  where g.PartitionKey == partitionKey && g.RowKey == rowKey
                  select g;
    var entry = results.FirstOrDefault<GuestBookEntry>();
    entry.ThumbnailUrl = thumbUrl;
    this.context.UpdateObject(entry);
    this.context.SaveChanges();
  }
}
[/code]


 


이와 같이 코드를 작성하여, Windows Azure Table Storage에 데이터 모델을 정의하는 작업까지 끝났습니다. 다음 강좌에서는, 방명록의 웹 인터페이스를 작성하는 부분과 함께, Windows Azure BLOB Storage의 사용 방법을 살펴보도록 하겠습니다.

댓글 남기기