기본 콘텐츠로 건너뛰기

Azure Big Data 시리즈 1 – Web Site with MongoDB

출처 : http://www.windowsazure.com/en-us/develop/net/tutorials/website-with-mongodb-vm/

이 시리즈에서는 Windows Azure 를 사용하는 것과 간단하게 웹 사이트를 구성하고 MongoDB를 활용하는 방법에 대해서 알아보도록 한다.

 

Windows Azure 설정

이미 Windows Azure 에 계정이 존재하고 운영 중이라면 생략해도 상관 없다. 이 부분은 Azure를 처음 사용하는 방법에 대해서 설명하는 부분이다.

  • http://www.windowsazure.com 에 접속하면 아래와 같은 화면을 볼 수 있다. 오른쪽 상단의 “무료 평가판”을 클릭하여 무료 계정을 90일간 사용해 볼 수 있다.
image
  • “무료 평가판”을 사용하기 위해서는 MS 라이브 계정이 존재하여야 한다. 이미 존재하는 계정이 있으면 로그인을 하고 다시 Azure 사이트로 이동하여 “무료 평가판” 을 다시 클릭하면 아래와 같은 Azure 청구 계정에 대한 설정 부분을 볼 수 있다. 개인 인증과 결제(신용카드 또는 핸드폰)에 대한 정보를 입력하며 된다. “무료 평가판”에서는 결제 비용이 0원으로 처리된다.

image

  • 청구 계정에 대한 처리가 완료되면 아래와 같은 화면을 볼 수 있다. 상단의 “미리 보기 기능” 을 클릭한다.

image

  • “미리 보기 기능” 화면은 크게 “모바일 서비스” 와 “VM 및 VM 네트워크” 메뉴를 볼 수 있다. 우선은 아래 쪽의 “MANAGE” 를 클릭하여 다음으로 진행한다.

image

  • 아래의 화면과 같이 왼쪽의 메뉴들 중에서 “WEB SITES”를 선택하고, “CREATE A WEB SITE”를 클릭한다.

image

  • 아래의 화면과 같이 웹 사이트의 URL 과 지역을 입력하고 “CREATE WEB SITE”를 클릭하면 웹 사이트틀 생성하게 된다. 당연히 샘플을 위한 웹 사이트 이므로 임의대로 URL을 입력하면 된다.

image

  • 웹 사이트 생성과정이 완료되면 아래의 화면과 같이 1개의 웹 사이트가 운영 중이라는 것을 확인할 수 있다. 맨 아래 쪽에는 작업을 위한 빠른 기능 버튼 들이 존재한다.

image

Create a virtual machine and Install MongoDB

여기서는 Azure 상에 VM 을 생성하고 MongoDB를 설치하고, 개발 환경을 구성하는 방법을 알아보도록 한다. 이미 환경 설정이 되어 있는 경우는 생략해도 된다.

참고로 MongoDB 는 인기 있는 오픈 소스로 고 가용성의 NoSQL 데이터베이스이다.

MongoDB를 VM에 설치하는 방법은 2 가지가 존재한다. 하나는 Windows Server 2008 R2 가 운영 중인 VM에 설치하는 방법이고, 또 다른 하나는 CentOS Linux 가 돌아가는 VM에 설치하는 방법이다. 여기서는 2 가지 방법 중에서 Windows Server 2008 R2 에 MongoDB를 설치하는 것을 기준으로 한다. CentOS Linux 는 개인적으로 진행해 보도록 하자.

Create Windows 2008 R2 VM
  • http://www.windowsazure.com 으로 이동하여 관리를 위한 로그인을 수행하고 "미리 보기 기능” 을 선택하고 “Virtual Machines & Virtual Networks” 섹션에서 “MANAGE” 를 클릭하도록 한다.
  • 아래의 화면과 같이 “VIRTUAL MACHINES”를 왼쪽 메뉴에서 선택하고, “CREATE A VIRTUAL MACHINE”을 클릭하도록 한다.

image

  • 아래의 화면과 같이 Windows 2008 R2 서버 이미지를 기반으로 VM 을 생성할 수 있으므로 관련된 정보를 설정하고 “CREATE VIRTUAL MACHINE” 을 클릭하도록 한다. 현재는 테스트를 위한 서버이므로 서버 size 는 small 로 설정하면 된다.

image

  • O/S 이미지를 이용해서 설치를 하므로 상당히 많은 시간의 소비가 발생한다. 생성과정이 완료되면 아래의 화면과 같이 VM 상태를 확인할 수 있다.

image

  • 이제 생성된 VM 에서 사용할 디스크를 연결하여야 한다. 생성된 VM을 선택하고 맨 아래 쪽의 기능 버튼 중에서 “ATTACH”를 선택하고 “Attach Empty Disk”를 선택한다.

image

  • 아래의 화면과 같이 기본적인 VM 정보 아래에 DISK 의 크기를 지정하는 부분에 테스트용이므로 5G 정보를 지정하도록 한다.

image

  • 서버를 갱신(Update) 하는 과정이 진행된다. 진행이 완료되면 VM 정보에서 VM 이름을 클릭하면 현재 구동 중인 VM 정보와 연결된 OS 디스크와 DATA 디스크 연결 상태를 확인할 수 있다.

image

지금까지로 해서 VM 에 Windows 2008 R2 서버의 설치가 완료 되었다. 서버의 설정은  “원격 데스크탑 연결” 을 이용해서 처리하게 된다.

Connect VM using Remote Desktop and Setting
  • Azure Management 화면에서 맨 아래쪽의 “Connect” 를 클릭하면 원격 접속을 위한 RDP 파일을 다운로드 할 수 있다.

image

  • 다운로드된 RDP 파일을 더블클릭하거나 “%WINDIR%\system32\mstsc.exe” 를 실행하여 연결하고, 설정했던 Administrator 사용자로 로그인을 한다.
  • “Server Manager > Storage > Disk Management” 를 선택하면 5G 로 추가했던 디스크가 초기화가 필요하다는 메시지를 볼 수 있다. “OK”를 클릭하고 “Simple Volume” 으로 생성하도록 한다. 파티션과 포맷 등은 기본 설정 또는 원하는 데로 처리하도록 한다.

image

image

Install and run MongoDB on VM

위에서 설정한 VM 상에 MongoDB를 설치하도록 한다. 설치할 때 주의할 점은 MongoDB 의 보안 기능에 인증과 IP 주소 바인딩 부분은 기본적으로 활성화되어 있지 않으므로 MongoDB를 적용할 때는 활성화 시켜 주어야 한다. (이 부분은 여기를 참고하도록 한다)

  • 원격 데스크 톱에서 브라우저를 실행하고 “Tools > Internet Options”를 선택하고 열린 화면에서 “Security” 탭에서 “Trustred Sites” 에 “http://*.mongodb.org” 를 추가하도록 한다.

image

  • 여기를 통해서 MongoDB 를 다운로드 한다. 다운로드 대상은 “Windows 64-bit” 로 설정된 항목들 중에서 “Production Release 2.2.2” 버전의 링크가 “*2008R2+” 로 표시된 것을 받으면 된다. 설치형식이 아닌 압축 형식이므로 특정 폴더에 압축을 해제하면 된다.
  • MongoDB 데이터와 로그 파일을 생성하여야 하므로 데이터 디스크로 추가한 F 드라이브에 “F:\MongoData”, “F:\MongoLogs” 라는 폴더를 생성한다. (경로와 폴더 명은 맘대로 생성해도 된다)
  • 이제 MongoDB를 실행한다. 실행은 압축을 해제한 폴더로 가서 “bin” 폴더 밑에서 다음과 같은 명령을 실행하며 된다.

image

mongod.exe 로 서버가 기동되며 모든 로그 정보는 “–logpath” 로 지정된 파일로 출력이 되고, 저널 파일들을 할당하고, 연결에 대한 수신처리를 하므로 몇 분 정도의 시간이 소비된다. 위의 실행 명령은 다음과 같다. (MongoDB 가 실행되면 최초에 구성되는 데이터가 존재하므로 디스크 사이즈가 최소한 5G 정도는 되어야 한다)

C:\mongodb\bin>mongod --dbpath F:\MongoData --logpath F:\MongoLogs\mongolog.log




  • MongoDB 에 대한 관리자 명령을 실행하기 위해서는 또 다른 명령 창을 열고 다음과 같은 명령을 실행하여 insert 문장에 따라서 데이터베이스가 생성된 것을 확인해 보도록 한다.
C:\mongodb\bin> mongo
> db
test
> db.foo.insert({a:1})
> db.foo.find()
{ “_id” : ObjectId(“5100fcbc3dd01cbfd1e5bdde”), “a” : 1 }
> show dbs
...
> show collections
...
show > help



image



  • 옵션이지만, mongod.exe 는 윈도우 서비스로 설치되고, 실행되는 것을 지원하고 있다. 이 작업을 처리하는 명령은 다음과 같다.
C:\mongodb\bin> mongod.exe --logpath "C:\mongodb\logs\logfile.log" --logappend --dbpath "C:\data" --install



위의 명령이 수행되면 서비스 이름이 “Mongo DB” 인 서비스가 생성이 된다. 서비스로 구동되는 경우는 출력이 화면으로 처리되지 않으므로 반드시 logpath를 특정 파일로 지정하도록 하고 서비스가 재 시작되는 시점에 로그가 추가되어 운영될 수 있도록 logppend 옵션을 지정하도록 한다. 윈도우 서비스 설정에 대한 좀 더 자세한 옵션 정보들은 여기를 참고하도록 한다.



  • MongoDB 가 설치과정이 완료되었으면 외부에서 접속이 될 수 있도록 방화벽을 열어 주어야 한다. “시작 > 관리도구 > 윈도우 방화벽” 을 실행하고 “Inbound Rule” 을 새로 생성하고 Port 는 27017 로 지정하도록 한다.

Windows Firewall


Windows Firewall


Windows Firewall


Windows Firewall


Windows Firewall


Windows Firewall



  • 이제 원격에서 접속 요청을 받아들일 EndPoint 를 설정해 주어야 한다. Azure 의 관리 포탈에서 “Virtual Machines” 메뉴를 클릭하고 오른쪽 화면의 상단 메뉴 중에서 “ENDPOINTS”를 클릭한 후에 아래쪽의 빠른 메뉴에서 “ADD ENDPOIINT”를 클릭한다. 위에서 방화벽을 설정했던 포트를 지정해 주면 된다.

image


image


image


여기까지로 해서 Azure 설정과 MongoDB 의 설치와 환경 설정 부분까지를 작업하였다. MongoDB 에 대한 좀 더 자세한 사항은 여기를 참고하면 된다.


Set up the development environment

개발 환경은 VS 2010 이나 VS 2012 를 사용하도록 한다. 그리고 Web Platform Installer 를 이용하여 ASP.NET MVC 3 Tools Update 를 설치하도록 한다. .NET 개발 환경은 기본적으로 설정할 수 있다고 가정하고 따로 설명하지 않는다.


Create and run the My Task List ASP.NET MVC Application on your development computer
























ASP.NET MVC 어플리케이션을 이용하여 Azure 상의 VM 에서 구동되고 있는 MongoDB 에 연결하여 Task 정보를 보여주는 부분을 작성하도록 한다.


Create the application

Visual Studio 2012 를 실행하고 아래의 화면과 같이 ASP.NET MVC 3 웹 어플리케이션을 생성하고, 프로젝트 명은 “MyTaskListApp”라고 지정한다.


image


ASP.NET MVC 3 프로젝트 템플릿에서는 “인터넷 응용 프로그램” 을 선택하고, 뷰 엔진은 “Razor” 를 선택하고, “HTML5 의미 체계 태그 사용”을 선택하도록 한다.


image


Install the MongoDB C# driver

생성된 프로젝트에서 MongoDB 를 연결하여 사용하기 위해서는 NuGet 에서 제공하고 driver를 설치하여야 한다.



  • 솔루션 탐색기에서 “참조”를 선택하고 컨텍스트 메뉴에서 “NuGet 패키지 관리…” 를 선택한다.

image



  • NuGet 패키지 관리 화면에서 아래와 같이 “mongocsharpdriver” 를 검색하고 설치하도록 한다.

image



  • 설치가 완료되면 프로젝트의 “참조” 항목에 아래의 화면과 같이 MongoDB 연결을 위한 라이브러리가 추가된 것을 확인할 수 있다.

image


Add a Model

솔루션 탐색기에서 “Models” 폴더를 선택하고 컨텍스트 메뉴에서 “추가 > 클래스” 를 클릭하고 클래스 명은 “TaskModel” 이라고 지정한다.


image


생성된 “TaskModel.cs” 파일의 내용을 아래와 같이 구성하도록 한다.


   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Web;
   5:  using MongoDB.Bson.Serialization.Attributes;
   6:  using MongoDB.Bson.Serialization.IdGenerators;
   7:   
   8:  namespace MyTaskListApp.Models
   9:  {
  10:      public class Task
  11:      {
  12:          [BsonId(IdGenerator = typeof(CombGuidGenerator))]
  13:          public Guid Id { get; set; }
  14:   
  15:          [BsonElement("Name")]
  16:          public string Name { get; set; }
  17:   
  18:          [BsonElement("Category")]
  19:          public string Category { get; set; }
  20:   
  21:          [BsonElement("Date")]
  22:          public DateTime Date { get; set; }
  23:   
  24:          [BsonElement("CreatedDate")]
  25:          public DateTime CreatedDate { get; set; }
  26:      }
  27:  }

Add the Data Access Layer

솔루션 탐색기에서 프로젝트를 선택하고 컨텍스트 메뉴에서 새 폴더를 추가하고 “DAL” 이라고 명칭을 설정한 후에 “Dal.cs” 클래스를 추가하도록 한다.


생성된 Dal.cs 클래스의 내용을 아래와 같이 구성한다. (코드는 아직 최적화 및 기능 모듈화가 완전히 처리된 것은 아니다)


   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Web;
   5:  using MongoDB.Driver;
   6:  using MyTaskListApp.Models;
   7:   
   8:  namespace MyTaskListApp.DAL {
   9:      public class Dal : IDisposable {
  10:          #region Fields
  11:          private MongoServer mongoServer = null;
  12:          private bool disposed = false;
  13:   
  14:          // VM 에서 설정한 DNS 명 또는 IP Address 를 설정하도록 한다.
  15:          // 예) mongodb://W8R2.cloudapp.net
  16:          private string connectionString = "mongodb://W8R2.cloudapp.net";
  17:   
  18:          // 데이터베이스 이름은 "Tasks" 이며, Collection 은 "TaskList" 라고 사용한다.
  19:          // 존재하지 않는 경우라면 자동으로 생성된다.
  20:          private string dbName = "Tasks";
  21:          private string collectionName = "TasksList";
  22:          #endregion
  23:   
  24:          #region Constructors & Destructors
  25:          public Dal() {
  26:          }
  27:   
  28:          protected virtual void Dispose(bool disposing) {
  29:              if (!this.disposed) {
  30:                  if (disposing) {
  31:                      if (this.mongoServer != null) this.mongoServer.Disconnect();
  32:                  }
  33:              }
  34:              this.disposed = true;
  35:          }
  36:          #endregion
  37:   
  38:          #region Methods
  39:          private MongoCollection getTasksCollection() {
  40:              MongoServer server = MongoServer.Create(this.connectionString);
  41:              MongoDatabase database = server[this.dbName];
  42:              MongoCollection todoTaskCollection = database.GetCollection(this.collectionName);
  43:              return todoTaskCollection;
  44:          }
  45:   
  46:          private MongoCollection GetTasksCollectionForEdit() {
  47:              MongoServer server = MongoServer.Create(this.connectionString);
  48:              MongoDatabase database = server[this.dbName];
  49:              MongoCollection todoTaskCollection = database.GetCollection(this.collectionName);
  50:              return todoTaskCollection;
  51:          }
  52:   
  53:          // MongoDB 서버로 부터 모든 Task Item 들을 반환한다.
  54:          public List GetAllTasks() {
  55:              try {
  56:                  MongoCollection collection = this.getTasksCollection();
  57:                  return collection.FindAll().ToList();
  58:              } catch (MongoConnectionException) {
  59:                  return new List();
  60:              }
  61:          }
  62:   
  63:          // MongoDB 에 새로운 Task Item을 생성하고 컬랙션에 추가한다.
  64:          public void CreateTask(Task task) {
  65:              MongoCollection collection = GetTasksCollectionForEdit();
  66:              try {
  67:                  collection.Insert(task, SafeMode.True);
  68:              } catch (MongoCommandException ex) {
  69:                  string msg = ex.Message;
  70:              }
  71:          }
  72:          #endregion
  73:   
  74:          #region Implementations of IDisposable
  75:          public void Dispose() {
  76:              this.Dispose(true);
  77:              GC.SuppressFinalize(this);
  78:          }
  79:          #endregion
  80:      }
  81:  }




위의 코드 16번째 라인을 보면 MongoDB Connection String 설정 부분이 있다. 이 부분은 각자 VM 에서 설정했던 내용으로 변경해서 사용하면 된다. 만일 EndPoint 등에 사용할 포트를 변경하였거나 다른 설정 부분이 존재하는 경우는 여기를 통해서 ConnectionString 을 조정하는 방법에 대해서 검토하도록 한다.


Add a Controller

솔루션 탐색기에서 “Controllers\HomeController.cs” 파일을 선택하고 아래와 같은 코드로 변경하도록 한다.


   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Web;
   5:  using System.Web.Mvc;
   6:  using MyTaskListApp.DAL;
   7:  using MyTaskListApp.Models;
   8:   
   9:  namespace MyTaskListApp.Controllers
  10:  {
  11:      public class HomeController : Controller, IDisposable {
  12:          #region Fields
  13:   
  14:          private Dal dal = new Dal();
  15:          private bool disposed = false;
  16:   
  17:          #endregion
  18:   
  19:          #region Constructors & Destructors
  20:   
  21:          new protected virtual void Dispose(bool disposing) {
  22:              if (!this.disposed) {
  23:                  if (disposing) this.dal.Dispose();
  24:              }
  25:              this.disposed = true;
  26:          }
  27:   
  28:          #endregion
  29:   
  30:          #region Action Methods
  31:   
  32:          // GET: /Task/
  33:          public ActionResult Index() {
  34:              return View(dal.GetAllTasks());
  35:          }
  36:   
  37:          // GET: /Task/Create
  38:          public ActionResult Create() {
  39:              return View();
  40:          }
  41:   
  42:          // POST: /Task/Create
  43:          [HttpPost]
  44:          public ActionResult Create(Task task) {
  45:              try {
  46:                  dal.CreateTask(task);
  47:                  return RedirectToAction("Index");
  48:              } catch {
  49:                  return View();
  50:              }
  51:          }
  52:   
  53:          public ActionResult About() {
  54:              return View();
  55:          }
  56:   
  57:          #endregion
  58:   
  59:          #region IDisposable 멤버
  60:   
  61:          void IDisposable.Dispose() {
  62:              this.Dispose(true);
  63:              GC.SuppressFinalize(this);
  64:          }
  65:   
  66:          #endregion
  67:      }
  68:  }



Set up the site style

솔루션 탐색기에서 “Views\Shared\_Layout.cshtml” 파일을 열고 아래와 같이 타이틀 부분을 변경 하도록 한다.


   1:  
   2:  
   3:  
   4:      "utf-8" />
   5:      @ViewBag.Title
   6:      "@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
   7:      
   8:      
   9:  
  10:  
  11:      
class="page">
  12:          
  13:              
"title">
  14:                  

My Task List Application

  15:              
  16:              
"logindisplay">
  17:                  @Html.Partial("_LogOnPartial")
  18:              
  19:              
  20:                  
    "menu">
  21:                      
  • @Html.ActionLink("홈", "Index", "Home")
  •   22:                      
  • @Html.ActionLink("정보", "About", "Home")
  •   23:                  
      24:              
      25:          
      26:          
    "main">
      27:              @RenderBody()
      28:          
      29:          
      30:          
      31:      
      32:  
      33:  



    메뉴 정보를 변경하기 위해서는 “Views\Home\Index.cshtml” 파일을 열고 아래와 같이 변경하도록 한다.


       1:  @model IEnumerable
       2:   
       3:  @{
       4:      ViewBag.Title = "My Task List";
       5:  }
       6:   
       7:  

    My Task List

       8:   
       9:  "1">
      10:      
      11:          
      12:          
      13:          
      14:      
      15:   
      16:      @foreach (var item in Model) {
      17:          
      18:              
      21:              
      24:              
      27:          
      28:      }
      29:  
    TaskCategoryDate
      19:                  @Html.DisplayFor(modelItem => item.Name)
      20:              
      22:                  @Html.DisplayFor(modelItem => item.Category)
      23:              
      25:                  @Html.DisplayFor(modelItem => item.Date)
      26:              
      30:   
      31:  
      32:      @Html.Partial("Create", new MyTaskListApp.Models.Task())
      33:  



    위의 Razor 코드에서 가장 마지막에 지정한 Partial 처리를 위해서는 솔루션 탐색기에서 “Views\Home\” 폴더를 선택하고 View 를 “Create” 라는 이름을 추가하고 아래와 같이 코드를 구성하도록 한다.


       1:  @model MyTaskListApp.Models.Task
       2:   
       3:  
       4:  
       5:  
       6:   
       7:  @using(Html.BeginForm("Create", "Home")) {
       8:      @Html.ValidationSummary(true)
       9:      
      10:          New Task
      11:          
    class="editor-label">
      12:              @Html.LabelFor(model => model.Name)
      13:          
      14:          
    class="editor-field">
      15:              @Html.EditorFor(model => model.Name)
      16:              @Html.ValidationMessageFor(model => model.Name)
      17:          
      18:          
    class="editor-label">
      19:              @Html.LabelFor(model => model.Category)
      20:          
      21:          
    class="editor-field">
      22:              @Html.EditorFor(model => model.Category)
      23:              @Html.ValidationMessageFor(model => model.Category)
      24:          
      25:          
    class="editor-label">
      26:              @Html.LabelFor(model => model.Date)
      27:          
      28:          
    class="editor-field">
      29:              @Html.EditorFor(model => model.Date)
      30:              @Html.ValidationMessageFor(model => model.Date)
      31:          
      32:          

      33:              "submit" value="Create" />
      34:          

      35:      
      36:  }




    Test the local deployment
    지금까지 작성된 것을 F5 를 눌러서 실행해 보도록 하자. 아래와 같이 실행된 것을 확인할 수 있다. 그리고 새로운 Task 를 추가하여 조회할 수 있다.
    image

    Deploy the ASP.NET Application to a Windows Azure web site

    현재는 개발 장비와 VM 간의 통로가 외부 네트워크로 연결되기 때문에 성능이 별로 좋지 않다. 이제는 이 어플리케이션을 Azure 에 생성해 놓은 웹 사이트에 배포를 해 보도록 한다.

    Create a Windows Azure web site


    • 브라우저를 통해서 Windows Azure 관리 포탈에 접속한다.
    • 가장 아래쪽의 빠른 기능 버튼들 중에서 “NEW” 를 선택하고 웹 사이트를 생성하도록 한다. 위에서 이미 생성한 경우는 생략하고, 새롭게 생성하는 경우는 URL 과 지역 정보를 입력하고 생성하면 된다.

    Deploy the ASP.NET Application to the web site using Git


    • Azure 관리 포탈에서 생성한 웹 사이트의 이름을 클릭하면 DASHBOARD 페이지로 이동하게 된다.
    • 오른쪽 중간에 “quick glance” 메뉴에서 “Set up Git publishing” 를 클릭하도록 한다.

    image



    • Git 와 FTP 는 Live ID 를 사용하지 않는다. 따라서 새로운 사용자 아이디와 비밀번호를 설정해 주어야 한다.

    image



    • Git 저장소가 생성되는 과정이 진행이 되고, 생성된 후에 저장소에 대한 URL 이 나타나게 된다.

    image



    • 생성된 Git 저장소 정보에서 “Push my local files to Windows Arure”를 클릭하도록 한다. 그러면 Git 설정을 위한 처리 순서를 볼 수 있다.

    image



    • Git 가 이미 설치되어 있지 않은 경우는 순서 1 의 “Get it here” 를 클릭하여 Git 를 다운로드 하고 설치하도록 한다. 설치 후에 원활한 사용을 위해서 환경 변수에 설치된 Git 폴더 경로 밑의 bin 을 등록하도록 한다.
    • 설치 과정이 완료되었으면 MyTaskListApp 가 존재하는 경로로 이동하여 배포할 폴더를 선택하고 컨텍스트 메뉴에서 “Git Init” 를 실행하도록 한다. 실행이 되면 해당 폴더의 아래에 “.git” 라는 숨김 폴더가 생긴 것을 확인할 수 있다.
    • 또 다른 방법은 해당 폴더에서 컨텍스트 메뉴의 “Git GUI”를 이용하는 방법이다. 이를 선택하면 다음과 같은 화면을 볼 수 있다.

    image



    • Command 창에서 다음과 같이 처리하여 로컬에 생성한 파일들을 초기 Commit 버전으로 생성하도록 한다.
    > git add .
    > git commit -m "initial commit"




    • 이제 원격에 존재하는 Azure 저장소에 현재 로컬의 파일을 전송하여야 한다. 전송하는 방법은 아래와 같이 명령을 처리한다. 마지막 명령인 “git push azure master” 를 실행하면 접속 패스워드를 물어보게 된다. 정상적으로 입력하면 배포가 진행된다.
    > git remote add azure https://
    > git push azure master




    • 처리가 완료된 후에 Azure 관리 포탈에서 Deployment 를 확인해 보면 처리된 내용을 볼 수 있다.

     image



    • 이제 배포가 완료되었으므로 Azure web site 의 주소를 이용해서 브라우저에서 실행하면 동작하는 화면을 볼 수 있다.

    image











    댓글

    이 블로그의 인기 게시물

    OData 에 대해서 알아보자.

    얼마 전에 어떤 회사에 인터뷰를 하러 간 적이 있었다. 당시 그 회사는 자체 솔루션을 개발할 기술인력을 찾고 있었고 내부적으로 OData를 사용한다고 했다. 좀 창피한 이야기일 수도 있지만 나름 기술적인 부분에서는 많은 정보를 가지고 있다고 했던 것이 무색하게 OData란 단어를 그 회사 사장님에게서 처음 들었다. 작고, 단순한 사이트들만을 계속해서 작업을 하다 보니 어느덧 큰 줄기들을 잃어버린 것을 느끼기 시작했다. 명색이 개발이 좋고, 기술적인 기반을 만들려고 하는 인간이 단어조차도 모른다는 것은 있을 수 없는 것이라서 다시 새로운 단어들과 개념들을 알아보는 시간을 가지려고 한다. OData (Open Data Protocol) 란? 간단히 정리하면 웹 상에서 손쉽게 데이터를 조회하거나 수정할 수 있도록 주고 받는 웹(프로토콜)을 말한다. 서비스 제공자 입장에서는 웹으로 데이터를 제공하는 방식으로 각 포탈 사이트들이 제공하는 OPEN API 포맷을 독자적인 형식이 아니라 오픈된 공통규약으로 제공 가능하며, 개발자는 이 정보를 다양한 언어의 클라이언트 라이브러리로 어플리케이션에서 소비할 수 있도록 사용하면 된다. 공식 사이트는 www.odata.org 이며 많은 언어들을 지원하고 있다. 좀더 상세하게 정의를 해 보면 OData는 Atom Publishing Protocol  (RFC4287) 의 확장 형식이고 REST (REpresentational State Transfer) Protocol 이다. 따라서 웹 브라우저에서 OData 서비스로 노출된 데이터를 볼 수 있다. 그리고 AtomPub 의 확장이라고 했듯이 데이터의 조회만으로 한정되는 것이 아니라 CRUD 작업이 모두 가능하다. Example 웹 브라우저에서 http://services.odata.org/website/odata.svc 를 열어 보도록 하자. This XML file does not appear to have any style in...

    C# 에서 Timer 사용할 때 주의할 점.

    예전에 알고 지내시던 분의 질문을 받았다. Windows Forms 개발을 하는데, 주기적 (대략 1분)으로 데이터 요청을 하는 프로그램을 작성하기 위해서 Timer 를 사용하는데, 어떤 기능을 처리해야 하기 때문에 Sleep 을 같이 사용했다고 한다. 여기서 발생하는 문제는 Sleep 5초를 주었더니, Timer 까지 5초 동안 멈춘다는 것이다. Timer 라는 것은 기본적으로 시간의 흐름을 측정하는 기능이기 때문에 Sleep 을 했다고 해서 Timer 가 멈추는 일은 생겨서는 안된다. 그러나 실제 샘플을 만들어 보면 ... Timer 가 Sleep 만큼 동작이 멈추는 것을 확인할 수 있다. Windows Forms 는 UI Thread 를 사용하는 것으로 최적화 되어 있으며 여기서 Timer 를 쓰면 UI Thread 에 최적화된 System.Windows.Forms.Timer 가 사용된다. 여기서 문제의 발생이 시작되는 것이다. Sleep 을 사용하게 되면 UI Thread 가 Sleep 이 걸리기 때문에 여기에 속한 Timer 까지도 멈추는 것이다. 이런 문제를 해결하기 위해서는 System.Threading.Timer 를 사용해야 한다. 이 Timer 는 별도의 Thread 에서 동작하기 때문에 Sleep 의 영향을 받지 않는다. 언뜻 보면 쉬운 해결 방법인 것 같지만 Thread 가 분리되었기 때문에 Timer 가 돌아가는 Thread 에서 UI Thread 의 메서드나 컨트롤에 접근하기 위해서는 별도의 명령을 사용해야 하는 문제가 존재한다. 자~ 그럼 여기서 Timer 에 대해서 다시 한번 정리해 보도록 하자. .NET 에서 제공하는 Timer 들 .NET 에서는 기본적으로 3가지 Timer를 제공하고 있다. (MSDN) System.Windows.Forms.Timer - 사용자가 지정한 간격마다 이벤트를 발생시키며 Windows Forms 응용 프로그램에서 사용할 수 있도록 최적화 되어 있다. System...

    [Logging] NLog 사용법 정리...

    SCSF 에는 기본적으로 Enterprise Library가 사용된다. 예전에도 그랬지만 기능은 훌륭하고 많은 부분에서 최적화(?)된 것일지도 모르지만, 역시나 사용하기에는 뭔가 모르게 무겁고, 사용하지 않는 기능이 더 많다라는 느낌을 지울수가 없다. 이번 프로젝트도 SCSF를 기반으로 하고 있지만, Enterprise Library를 걷어내고 각 부분에 전문화된 오픈 소스를 사용하기로 하였다. 예전에는 Log4Net을 사용했지만, 대량 사용자 환경에서는 메모리 누수와 기타 문제점이 존재한다는 MS 컨설턴트(?)의 전해진 말을 들은 후로는 사용하지 않는다. 대안으로 사용하는 것이 NLog 이다. 조금 후에는 3.0 버전도 나온다고 홈 페이지에 기재되어 있지만, 그 때가 되면 프로젝트는 끝나기 때문에 현재 2.1.0 버전을 사용하기로 했다. [원본 출처] http://cloverink.net/most-useful-nlog-configurations-closed/ 위의 참조 자료에는 다양한 정보들이 존재하므로 꼭 링크를 통해서 관련된 정보를 확인하고 이해하는 것이 좋을 듯 하다. 여기서는 당장 필요한 부분만을 정리하도록 한다. [ Logger 찾기 ] 기본적으로 Logger가 존재하는 클래스를 기반으로 Logger 정보를 구성한다. Logger logger = LogManager.GetCurrentClassLogger(); 주로 Namespace 기반으로 Logger를 설정하는 경우에 유연하게 사용할 수 있다. 또 다른 방법으로는 지정한 문자열로 특정 Logger를 직접 선택하는 방법도 제공된다. 이를 혼용해서 Namespace와 직접 지정 방식을 같이 사용할 수도 있다. 물론 Logger 환경 설정에서 Wildcard (*)를 지정할 수도 있다. Logger logger = LogManager.GetLogger("Database.Connect"); Logger logger = LogManager.Get...