요즈음 클라우드 서비스들을 이용하다보면, Windows 서버 운영체제를 통해서 확장성있는 클라우드를 만들고자 하는 경우가 자주 있습니다. 일반적인 웹 사이트를 구축할 때에도 마찬가지이고, 당연히 KT UCLOUD나 Amazon과 같은 환경에서도 같은 노력이 뒷받침이 되어야 하지요. 그리고 제가 주 전공으로 하고 있는 Windows Azure 역시, 첫 배포 때에는 간과하기 쉬운 점이 바로 로드 밸런싱 환경이라는 점입니다.

이러한 로드밸런싱 환경을 만들때에는, 이전에 구축해본 경험이 없는 관리자가 개발자 입장에서는 상당히 어려운 문제에 봉착하게 될 가능성이 많습니다. 특히 요즈음 웹 환경에서는 당연하게 사용하는 세션이나 쿠키에 관련된 설정들이 로드밸런싱 환경에서 기대했던 것과 다르게 동작해서 좌절하는 경험을 많이들 하실텐데요, 제가 오늘 블로그에 올리는 것은 ASP.NET에 관한, 그리고 IIS 7에 관한 내용입니다. (PHP나 JSP 개발자분들께서도 공감하실 수 있는 부분이 있을 것입니다.)

로드밸런싱 환경을 잘 알고 구축할 수 있다면, 앞으로 나오게될 어떤 종류의 클라우드 서비스이든 관계없이 문제를 정확하게 해결할 수 있을 것입니다. 사실 클라우드 기반의 웹 서비스는 달리 표현하면, 기본 골자는 로드밸런싱에 기반을 두고 있는 것이고, 그 이후의 확장성 전략을 클라우드 솔루션으로 채우는 것과 같다고 말할 수 있습니다. (어떤 뼈대를 사용할 것인지는 전적으로 여러분들의 선택에 달린 것입니다.)

로드 밸런싱 환경이란?

로드 밸런싱 기술 자체는 상당히 오래된 것입니다. 이름에서 알 수 있듯이, 몰려오는 트래픽을 내부적으로 분산하여 특정 서버 컴퓨터로 연결이 몰려 서비스가 사용 불가 상태로 빠지는 것을 "지연"시키거나 "완화"시키는 것에 목적이 있습니다. 로드 밸런싱의 기술적 개념도는 다음과 같습니다. (이미지 출처: http://msdn.microsoft.com/en-us/library/ff650667.aspx)

다양한 상황에서 로드밸런싱이 쓰이겠지만 가장 일반적으로는 웹 환경에서 많이 쓰입니다. 연결을 오래 유지할 필요가 없으면서도, 짧은 시간 내에 빠른 연결 회전을 보이는 웹 프로토콜에서 가장 중요한 것은 바로 신속성인데, 분산 처리를 하지 않는 경우에는 필연적으로 서버 컴퓨터가 받아들일 수 있는 동시 연결 한계치에 금방 치닫게 됩니다. 그러나 로드 밸런싱을 정확히 사용하면 이러한 한계치에 치닫게 되는 속도가 로드 밸런싱에 참가하는 컴퓨터의 댓수만큼 반비례하게 됩니다. 그리고 이 때 하나의 웹 사이트를 위한 로드 밸런싱 서비스에 멤버로 참여하는 서버 컴퓨터들을 묶어서 "웹 팜"이라고 정의를 하는 것이지요. 더 일반적으로는 "서버 팜"이라고도 합니다.

잠시 다른 이야기로 넘어가자면, 요즈음 대두되는 클라우드 컴퓨팅은 관리 측면에서 봤을 때, 충분한 대역폭을 보장하는 연결과 매우 뛰어난 성능을 가진 로드 밸런서를 이용하여 연결을 분산하는 작업을 수행하는 것입니다. 그리고 웹 팜 안에 참여하는 컴퓨터의 유형에 있어서는 이전과 다른 점이 하나 있는데, 마치 구름과 같이 수축과 팽창을 자유자재로 한다는 것입니다. 물론 이런 수축과 팽창이 가능함은 내부적으로 가상화 솔루션을 이용했다거나 여기에 대응할 수 있는 알고리즘을 사용했다는 가정이 깔려있는 것입니다.

정말 완벽하고 정확하게 구축했다면, 적은 전원이나 자원 공급으로도 충분히 웹 팜이 유지가 될 수도 있고, 필요하다면 웹 팜의 크기가 엄청나게 커질 수도 있겠지요. 이걸 여러분이 관리하신다면 프라이빗 클라우드, 신뢰할 수 있는 IT 기업이 관리한다면 퍼블릭 클라우드가 된다고 보실 수 있겠습니다. 그러나, 클라우드 컴퓨팅이 만능약처럼 들릴 수 있는 부분이 있지만 정확히 알아야 할 것은 클라우드 컴퓨팅 역시 이 로드 밸런싱을 기초로 만들어지는 것이고, 여러분이 운영할 수 있는 한계에까지 트래픽이 몰리거나, 이런 일을 하는 IT 업체에게 지불할 수 있는 재정의 한계에까지 트래픽이 몰린다면 이것이 여러분이 생각할 수 있는 클라우드의 한계입니다. 무제한이라고 해서 값이 저렴하거나 무료에 수렴하는게 아님을 명확히 이해하고 있어야 합니다.

웹 로드 밸런싱을 위한 이야기

다시 본론으로 돌아와서, 웹을 로드 밸런싱할 수 있으려면 무엇을 검토해야 할까요? 가장 중요한 것은 웹 서버에 참여하는 각각의 컴퓨터 자체에는 "절대로" 컴퓨터의 고유한 정보를 가지고 있으면 안된다는 점입니다. 매우 단순한 이야기같지만 이러한 원칙을 지키지 않도록 설계되어있는 것이 지금 이 시점까지의 서버 컴퓨팅 기술들의 대다수의 원칙입니다. 간단한 예를 들어볼까요?

여러분이 일상적으로 사용하는, 웹을 통한 파일 업로드 기능을 담당하는 간단한 웹 앱이 있다고 가정해 보겠습니다. 이 웹 앱은 서버가 한 대 일때에는 참 쉽고 빠르게 설치해서 쓸 수 있었습니다. 당연히, 설치를 잘 했다면, 사용자가 웹 페이지를 방문해서 파일을 업로드하면 웹 서버가 그것을 알아보고 파일을 회수해서 하드 디스크 어딘가에 저장하겠지요. 그러나 시간이 지나서 이 웹 앱의 기능을 업그레이드하고 좀 더 많은 사용자들이 파일을 저장하고 다운로드할 수 있도록 만들어보고자 해서 로드 밸런싱 환경을 구축하여 베타 테스트를 시작했습니다. 그런데 어떤 문제들이 생겼을까요?

앞서 이야기한 기술적인 특성때문에, 사용자들은 분명히 조금전까지 파일을 업로드했었는데 페이지를 다시 와서보니 파일이 업로드되지 않은 상태로 페이지가 나와서 혼란스러워합니다. 혹은 파일을 어디로 빼돌린거냐며 분노하는 사람들도 있구요. 그래서 몇 번 F5키를 누르다보면 "어라?"하고 놀라게 됩니다. 조금 전에 업로드했던 파일이 다시 나타나니까요. 그러고나서 그 파일을 다운로드하려고 링크를 클릭하면 이번엔 또 다시 404 오류를 만납니다. 이제 사용자들은 이 서비스에 대해서 대단한 분노와 원성을 쏟아낼 것입니다. 서비스 상태에도 일관성이 없을 뿐 아니라 불안정한것 같다. 믿을 수 없다면서요.

이것이 일선 IT 현장에서 로드 밸런싱이나 클라우드를 처음 접목했을 때 겪는 "가장 흔하고 일반적인 장애"입니다. 더 안타까운 것은, 이것을 신 기술에 의한 책임으로 회피하고 문제시하는 것입니다. 문제의 본질을 정확히 알고 있다면 이렇게 말하는 것이 왜 잘못인지도 금방 알 수 있을 것입니다.

여기서 든 예제처럼, 이 웹 앱의 문제는 단순히 업로드한 파일을 자신의 컴퓨터에 저장하려고 했다는 데에 문제가 있습니다. 로드 밸런싱 멤버로 참여하는 컴퓨터가 자신의 상태를 중요하게 여기면, 다음번에 이어받는 다른 서버 컴퓨터의 입장에서는 이전에 그 컴퓨터가 무엇을 했는지 알 길이 없습니다. 그저, 찾고자 하는 내용이 없음을 이야기하는 수 밖에 없습니다. 이런 상황이 반복되면서 서비스 전체는 들어올때와 나갈때가 전혀 다른, 일관성이 없고 이상한 서비스가 되는 것입니다.

이 문제를 해결하기 위하여 어떻게 수정해야 할까요? 답은 간단합니다. 파일 저장소를 로드 밸런싱 멤버 컴퓨터 내부가 아닌, 여러 멤버 컴퓨터들이 같이 이용할 수 있는 공용 저장소로 바꾸는 것입니다. 가장 간단한 방법은 네트워크 UNC 경로로 이용할 수 있는 스토리지가 있을 수 있습니다.

여기서 궁금한 점이 하나 더 있는데, 그렇다면 로드 밸런싱에 의하여 애써 분산한 서비스가 다시 모이는 것이 아니냐고 반문할 수도 있습니다. 그런데 사실, 생각외로 사용자들이나 웹 크롤러와 같이 인터넷 상에서 발생하는 별 뜻없이 바쁘게 만드는 다양한 유형의 트래픽을 웹 팜 수준에서 한 번은 로드 밸런싱을 해주는 것 만으로도 실제 스토리지에 대한 요구 사항은 획기적으로 감소한다는 점입니다. 거기다, 역할 분담도 정확히 할 수 있으며 스토리지 자체에 대한 요구 사항이 폭증하는 것을 방지하기 위하여 기술적으로는 좀 더 복잡해질 수 있지만 캐싱 기능을 사용할 수도 있습니다. 이렇게 함으로서, 우리가 흔히 잘 아는 클라우드 서비스의 시작을 뗄 수 있게 됩니다.

기술적인 이야기 1 - 세션 처리 방법 바꾸기

그렇다면 IIS와 ASP.NET에서는 이런 이상한 상황을 예방하고 신뢰할 수 있는 서비스를 만들기 위해서 어떤 수정 사항을 반영해야 하는 것일까요? 제가 이제까지 인터넷 상으로 자료 조사를 해왔던 것은 모두 제각기 흩어져있는 정보들이었고 이것을 한 번에 취합할 수 있는 방법을 오늘 블로그 포스팅을 통하여 소개할까 합니다.

기본적으로 ASP.NET은 세션 처리를 IIS 프로세스 안에서 수행하도록 되어있습니다. 가장 동선도 짧고, 신속하게 반응하기 때문입니다. 그러나 로드 밸런싱 환경에서 이는 당연히 "채택하면 안되는" 기법입니다. 이 방법은 web.config 파일 안의 <sessionState> 요소에서 변경할 수 있는 부분으로, <configuration> 요소 아래의 <system.web> 요소 아래에서 없는 경우 새로 지정할 수 있습니다. <sessionState> 요소의 mode 속성의 값을 변경하면 됩니다. 지금 이야기한 부분은 mode 속성이 InProc으로 지정되어있거나, 아무것도 지정되어있지 않을 때 .NET Framework의 글로벌 web.config 설정을 바꾸지 않은 경우 기본으로 지정되는 설정입니다.

IIS 7에서 볼 수 있는 아래 그림과 같은 설정도 이 XML 파일의 수정을 텍스트 에디터 없이 수정하는 것입니다.

로드 밸런싱 환경에서 정상적으로 동작하는 웹 사이트를 만들기 위해서는 mode의 설정 값을 InProc 대신 StateServer나 SQLServer로 바꾸어야 하는데, 양쪽 값 모두 장단점이 있습니다. StateServer의 경우 기본적으로는 꺼져있는 ASP.NET State Service라는 NT 서비스가 제공하는 별도의 서버를 이용하는 방식이고, SQLServer는 이름에서 알 수 있듯이 실제 SQL Server를 사용하여 세션을 구현하는 방식입니다. 데이터베이스 서버의 성능이 세션을 모두 수용할 수 있을만큼 획기적으로 뛰어나거나, 세션 서버가 죽었다가 살아나도 로그아웃 처리가 안되게 한다던가, 혹은 여러 로드 밸런싱 사이트 사이에서 세션 공유를 안전하게 할 방법이 필요하다면 이 모드를 사용할 수 있습니다. 이에 비하여 StateServer는 별도의 SQL 서버 없이도 간편하게 구축할 수 있는 방법을 제공하긴 하지만, 세션 서버가 죽었다 살아날 경우 내용이 없어지는 휘발성 세션입니다.

양쪽 모드 모두 중요한 것은 멤버로 참여하는 웹 서버 컴퓨터 밖에 상태를 보관해야 한다는 것이 키 포인트로, 이것을 지키지 않고 멤버 컴퓨터 안에 이런 설정을 구축하면 전혀 나아지는 것이 없습니다. 그리고 당연한 이야기이지만 멤버 컴퓨터로 참여하는 모든 웹 서버가 같은 설정을 가지고 있어야 합니다.

StateServer와 SQLServer 모드를 구현하는 방법에 대한 자세한 내용은 아래 아티클을 참고하시면 되겠습니다.

http://msdn.microsoft.com/ko-kr/library/ms178586.aspx

기술적인 이야기 2 - ASP.NET 사이트 간에 립싱크 맞추기

세션을 공유하는 것 이외에, ASP.NET은 내부적으로 Machine Key라는 것을 사용합니다. Machine Key의 용도는 ASP.NET 안에서 참 다양한데, 가장 대표적으로는 클라이언트와 서버 사이에 쿠키 정보를 주고 받을 때 암호화하기 위한 수단으로 이용하는 것이 유명한 사례입니다. 쿠키를 이용한 취약점 공격은 웹 세계에서 너무나 당연한 공격 방식 중 하나이기 때문에 ASP.NET은 처음부터 이를 보완하기 위한 전략을 구현하고 있었습니다. 그러나 이것이 지금 와서 로드 밸런싱 환경이 되면서는 또 다른 어려운 문제로 바뀐 것입니다.

이 Machine Key라는 것 역시 서버 컴퓨터마다 고유하게 생성할 뿐 아니라, 매번 연결할 때 마다 다른 값을 생성하여 암호화에 사용합니다. 클라이언트 입장에서야, 서버가 "ABC"라는 쿠키를 주니까 "아 그렇구나. 나중에 돌려주면 서버가 날 알아보겠지?"하며 성실하게 반납합니다. 그런데 로드 밸런싱에 참여하는 A라는 서버 대신 C라는 서버가 이 쿠키를 받아들었을 때는 "이거 내것 아님" 하며 클라이언트에게 퇴짜를 놓습니다. 이것이 문제의 핵심인 것이죠.

이 문제를 해결하기 위해서는 아까전에 이야기한 주제보다 좀 더 많은 노력이 필요합니다. 생각보다, 보안을 완벽하게 유지하기 위하여 ASP.NET이 관리자들에게 요구하는 사항이 까다롭기 때문입니다. 이 Machine Key를 만들기 위해서는 별도의 생성 도구를 사용해야 합니다. 그러나 안타깝게도 이 도구를 구한다거나 만들 수 있으려면 개발자들의 조력이 좀 필요합니다. 그리고 개발자 본인들도 이런 방법을 찾아야 하기때문에 꽤나 귀찮습니다. Codeproject에 가면 이러한 방법을 자세히 설명한 아티클도 있습니다만 간단한 도구도 드리고, 코드 조각도 드리니 프로그램에 넣어 활용하시면 더 편리할 것입니다.

using System;
using System.Text;
using System.Security.Cryptography;

/* 중략 */

        public static string getRandomKey(int bytelength)
        {
            byte[] buff = new byte[bytelength];
            RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
            rng.GetBytes(buff);
            StringBuilder sb = new StringBuilder(bytelength * 2);
            for (int i = 0; i < buff.Length; i++)
                sb.Append(string.Format("{0:X2}", buff[i]));
            return sb.ToString();
        }

        public static string getASPNET20machinekey()
        {
            StringBuilder aspnet20machinekey = new StringBuilder();
            string key64byte = getRandomKey(64);
            string key32byte = getRandomKey(32);
            aspnet20machinekey.Append("<machineKey\n");
            aspnet20machinekey.Append(" validationKey=\"" + key64byte + "\"\n");
            aspnet20machinekey.Append(" decryptionKey=\"" + key32byte + "\"\n");
            aspnet20machinekey.Append(" validation=\"SHA1\" decryption=\"AES\"\n");
            aspnet20machinekey.Append("/>\n");
            return aspnet20machinekey.ToString();
        }

        public static string getASPNET11machinekey()
        {
            StringBuilder aspnet11machinekey = new StringBuilder();
            string key64byte = getRandomKey(64);
            string key24byte = getRandomKey(24);

            aspnet11machinekey.Append("<machineKey");
            aspnet11machinekey.Append(" validationKey=\"" + key64byte + "\"\n");
            aspnet11machinekey.Append(" decryptionKey=\"" + key24byte + "\"\n");
            aspnet11machinekey.Append(" validation=\"SHA1\"\n");
            aspnet11machinekey.Append("/>\n");
            return aspnet11machinekey.ToString();
        }

위의 코드를 사용하여 프로그램을 만들거나 ZIP 파일 안의 프로그램을 이용하여 값을 만들도록 하면 아래와 같은 XML 코드 조각을 얻을 수 있을 것입니다. 이 코드 조각을 각각의 서버에 들어있는 web.config에 지정하거나, 특정한 값만 인용하여 아래의 IIS 7 설정 아이콘에서 볼 수 있는 설정 도구를 통해서 직접 설정할 수도 있습니다.

<machineKey
 validationKey="FACBB6C89C44CB8BB7165FC4639BAA7267B...EF297D815E1BDD40E883E3451628CB95D34309"
 decryptionKey="4E95057676CC8DBA9AB...AACC1121B6B962E5AFA7849B0C82"
 validation="SHA1" decryption="AES"
/>

기술적인 이야기 3 - IIS에서 놓치면 안되는 것

ASP.NET을 가장 먼저 사용할 수 있게 된 웹 서버가 IIS이다보니 발생한 일종의 특성입니다만 여러 포럼에 걸쳐서 잘 언급되지 않는 문제점이 하나 있습니다. 바로 IIS에서 사용하는 사이트 ID 값을 통해서 정해지는 Application Path를 Machine Key와 같이 활용된다는 사실입니다. 웹 사이트 관리를 하다보면 로드 밸런싱에 참여하는 컴퓨터들을 다음과 같이 관리하게 되는 경우가 있습니다.

  • 서버 A에서는 기본 웹 사이트를 먼저 지우고 새 웹 사이트를 만들었다.
  • 서버 B에서는 새 웹 사이트를 먼저 만들고 기본 웹 사이트를 지웠다.

혹은 아래와 같은 경우도 있을 수 있습니다.

  • 서버 C에서는 사이트 A를 만들고 사이트 B를 만들었다.
  • 서버 D에서는 사이트 B를 만들고 사이트 A를 만들었다.

별 차이 없이 생각할 수 있지만, IIS에서는 이 경우 각각의 사이트들에 다른 ID 값을 부과하게 됩니다. 이 경우, 분명히 Machine Key를 동일하게 지정했음에도 불구하고 로드 밸런싱 환경에서 세션 상태가 일관성없게 변하는 문제를 만나게 됩니다. 제가 이번에 고민하게 된 부분도 바로 이 부분이었는데요, 이 문제를 해결하기 위해서는 IIS 7에서 전체 웹 사이트 목록에 나타나는 내용 중 다음의 ID 값이 멤버로 참여하는 웹 서버마다 차이가 있지 않은지 우선 검토해야 합니다.

위에있는 그림에서 빨간색으로 그린 부분이 서버 컴퓨터마다 차이가 있다면 이 값을 수정해주어야 합니다. 이 값을 수정하기 위해서는 수정할 사이트를 클릭하고, 고급 설정 링크를 아래 그림과 같이 클릭합니다.

이제 아래와 같은 팝업 대화 상자가 나타나면 강조 표시한 속성인 ID 값이 멤버로 참여하는 웹 서버 모두 같은 값을 가질 수 있도록 통일시켜줍니다.

확인 버튼을 누른 다음, ID 값이 바뀐 서버 컴퓨터에 한해서 IIS 전체를 재시작해주시거나 사이트 재시작을 시켜주시면 정상적으로 작동하게 될 것입니다.

Windows Azure 환경에서의 고려 사항

오늘 살펴본 내용은 IIS 7과 ASP.NET에 관한 부분이었지만, Windows Azure Platform의 경우에도 비슷한 문제가 있습니다. Windows Azure Platform에 VM Role로 웹 사이트를 게시를 하든, Web Role로 웹 사이트를 게시하든 세션을 사용하게 될 경우 비슷한 문제가 있을 수 있습니다.

다행히, Web Role을 이용한다면 내부적으로 사용하는 IIS에서 여러분이 몇 개의 웹 사이트를 추가적으로 구성하든 관계없이 같은 순서로 같은 ID를 사용하는 웹 사이트를 만들 것이므로 세 번째로 이야기한 ID 값 수정과 같은 작업은 할 필요가 없을 것입니다. 그러나 Machine Key에 대한 설정이나 세션 공유를 위한 설정은 SQL Azure를 이용한다거나, Worker Role에서 ASP.NET State Service 혹은 써드파티의 Session State Server를 이용해야 할 수 있습니다.

물론, 최근에 Windows Azure Platform의 일부로 Windows Azure AppFabric Cache가 새로 출시되기는 하였습니다만 상당히 이용 가격이 비싼 편입니다. (비싼만큼 확실한 성능을 제공합니다.) 로드 밸런싱 환경에서 특별한 문제를 일으키지 않는 일반적인 세션 공유가 필요하시다면 오늘 이야기한 주제를 응용한 Azure Project를 구축해보는 것도 의미가 있을 것입니다.

저작자 표시 비영리 변경 금지
신고

Visual Studio 2010 Service Pack 1에 대한 모든 것

Visual Studio 2010 2011.04.14 17:00 Posted by 남정현 (rkttu.com)

안녕하세요. 오랫만에 블로그에 글을 올립니다. 지난번 Visual Studio Camp에서 옴니버스 형식의 세미나로 Visual Studio 2010 Service Pack 1에 대하여 말씀을 드렸던 세션이 있는데, 발표 자료와 더불어서 Visual Studio 2010 SP1에 대한 간략한 소개를 위하여 글을 씁니다.


Visual Studio의 새 도움말 시스템

Visual Studio 2010 RTM 버전부터는 새로운 형태의 도움말 시스템이 도입되는데, 로컬 웹 서버를 통하여 도움말 컨텐츠가 제공되는 방식으로 이전의 Visual Studio 2005와 Visual Studio 2008에서 제공되던 방식과 다르게 제공됩니다. Visual Studio 2005와 Visual Studio 2008의 경우 자체 URI Scheme을 Windows Registry에 등록하고 이를 Internet Explorer를 통하여 탐색할 수 있도록 확장하는 방식이었습니다. 그러나 새로운 도움말 컬렉션을 추가하거나 삭제하는 과정에서 시스템 성능에 따라 재배열 시간이 상당히 오래 걸리는 문제가 있어 불편한 점도 있었습니다. 이러한 방식 대신 더 단순하지만 더 유연한 방식으로 바꾸게 된 듯 합니다.

그렇지만 이전 버전에서 제공되던 색인, 검색 기능 등이 웹 사이트 형식으로 바뀌면서 이전에 사용했던 기능들이 사라져서 아쉬운 점도 있었는데 이번 Service Pack 1에서는 다시 Help Browser Software가 부활했습니다. 그래서 로컬 웹 서버로 컨텐츠를 보여주는 것은 동일하지만 Visual Studio를 통해서 컨텐츠를 탐색하면 Help Browser가 별도로 나타납니다.

그리고 이번 도움말 시스템에서의 백미는 인터넷을 통한 업데이트가 가능해졌다는 점입니다. 실제로 설치한 적이 없는 제품이라 할지라도, 그리고 DVD를 통해서만 설치할 수 있는 전체 버전의 MSDN 안에서만 제공되던 컨텐츠까지도 인터넷을 통하여 항상 최신 버전을 다운로드받아 로컬 도움말 컬렉션에 추가하거나 필요하지 않으면 삭제할 수 있습니다.



Silverlight 4에 대한 지원 추가

Visual Studio 2010 SP1을 설치하면 별도로 Silverlight 4에 대한 Tools for Visual Studio를 추가 설치할 필요가 없습니다. Silverlight 4부터는 이전의 WPF보다 작지만 웹이 아닌 데스크탑 및 오프라인 환경에서 잘 동작하는 응용프로그램을 제작할 수 있는 기능이 더 완벽하게 제공됩니다. 이러한 기술 전반은 권한 상승이 적용된 실버라이트 응용프로그램에서 가능한 것이며, 여기에는 파일 입출력이나 로컬 COM 컴포넌트와 연계하는 방안이 포함되어있습니다. 아래의 예제는 권한 상승이 적용된 Silverlight 4 기반 응용프로그램 샘플의 소스 코드이며, 사용자 프로필 디렉터리 내의 "내 그림" 폴더에 있는 이미지들을 열거하고 뷰어를 통하여 보여주는 예제입니다.



위 프로그램의 소스 코드 중 파일 입출력에 대한 소스 코드를 실제로 발췌하면 다음과 같습니다.

private void UpdateFileList()
{
    string targetPath = Environment.GetFolderPath(
        Environment.SpecialFolder.MyPictures);
 
    List<object> content = new List<object>();
    foreach (string eachFile in Directory.EnumerateFiles(targetPath))
    {
        switch (System.IO.Path.GetExtension(eachFile).ToLower())
        {
            case ".jpg":
            case ".jpeg":
            case ".png":
                break;
 
            default:
                continue;
        }
 
        content.Add(eachFile);
    }
    this.fileList.ItemsSource = content;
}
Visual Studio 2010 SP1을 설치한 후 Silverlight 프로젝트를 생성하려고 하면 다음과 같이 대화 상자가 나타나는데 이 때 Silverlight 4를 사용하도록 지정하면 사용이 가능합니다.


IIS Express 7.5에 대한 지원 추가

Visual Studio 2005부터는 Cassini Web Server라고 불리던 ASP.NET Development Server를 통하여 전체 버전의 IIS가 없어도 쉽게 ASP.NET 응용프로그램을 테스트할 수 있는 환경이 제공되었습니다. 그러나 Visual Studio 2008의 등장과 더불어 IIS 역시 대폭 업그레이드되어 Windows Server 2008부터는 완전히 새로워진 아키텍처를 기반으로 하는 IIS 7이 등장하게 됩니다. 이에 따라, 어느 정도 호환성을 보장하기는 하지만 이전의 IIS와는 많이 달라졌기 때문에 Cassini Web Server 만으로는 테스트가 어려운 점이 많았습니다. 통합 IDE의 이점도 확보하고, 전체 버전의 IIS를 사용하지 않으면서도 충분히 모든 기능을 점검해볼 수 있는 방향으로 가기 위하여 IIS Express가 등장하게 됩니다.

IIS Express를 사용하는 것은 실제 IIS를 사용하는 것과 비교했을 때 다음과 같은 장점이 있습니다.

  • ASP.NET Development Server와는 달리 FastCGI 모듈을 호스팅할 수 있으므로 PHP와 같은 FastCGI 지원 웹 언어들을 같은 환경에서 동시에 테스트할 수 있습니다.
  • 웹 프로젝트에서 IIS를 사용하도록 지정한 경우, 관리자 권한을 얻을 수 없는 다른 컴퓨터에서는 웹 프로젝트를 열 수 없는 문제점이 있었으나 IIS Express를 사용하도록 하면 이런 제약이 없습니다.
  • IIS Hosted Core를 사용하므로 전체 버전의 IIS가 없어도 상관이 없으며, IIS Express가 설치되어있지 않은 경우 Visual Studio가 자동으로 이를 감지하여 Web Platform Installer를 호출하여 IIS Express가 설치될 수 있도록 해줍니다.
  • 개별 프로세스 형태로 실행되므로 여러 사람이 사용하는 컴퓨터에서도 시스템 설정을 편집하는 일 없이 안전하게 실행할 수 있습니다.

HTML 5와 CSS 3에 대한 문법 검증 지원

Visual Studio 2010 SP1 및 Visual Web Developer 2010 Express SP1을 설치하면 HTML 5, XHTML 5 및 CSS 3에 대한 지원이 기본으로 내장되어있어 정확한 코딩이 가능합니다.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>HTML5 Test</title>
    <link type="text/css" rel="Stylesheet" href="http://ajax.aspnetcdn.com/ajax/jquery.ui/1.8.10/themes/redmond/jquery-ui.css" /> 
    <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.5.1.js"></script>
    <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jquery.ui/1.8.10/jquery-ui.js"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            $('#test').dialog({ show: "drop", hide: "drop", width: "auto", height: "auto", title: "html 5 rocks!" }).show();
        });
    </script>
</head>
<body>
    <div id="test">
        <video src="demo.mp4" width="700" height="500" id="testVideo" autoplay="autoplay">
            <strong>Your web browser does not support video element.</strong>
        </video>
    </div>
</body>
</html>



위의 그림과 같이 검사할 문법을 지정하여 프로그래밍하면 꼭 지정해야 할 프로퍼티를 검사하여 경고를 띄우거나, 프로퍼티에 포함되어야 할 값의 유형을 자동으로 유추해주어 규칙을 몰라서 잘못 코딩할 가능성을 예방해 줍니다.

그 외에 눈여겨 볼만한 것들

Visual Studio 역시 최근에 급격한 변화를 맞이하고 있습니다. 빠르게 변화하는 기술을 수용하기 위해서 Internet Explorer의 런칭 주기가 짧아진 것과 비슷하게, Visual Studio 역시 자주 새로운 형태의 도구와 프레임워크를 업데이트하고 있으며, 이러한 노력의 일환으로 Express Edition의 가치가 더 높아지고 있습니다.

대표적으로 Visual Studio LightSwitch와 Visual Web Developer Express Edition, 그리고 Visual Studio for Windows Phone 7이 그 예시입니다. 전체 버전의 Visual Studio 제품 구성을 바꾸지 않고 안전하게 테스트해볼 수 있는 방법으로서도, 그리고 실무 개발 환경에서도 유용하게 쓰일 수 있습니다.

그러나 서비스 팩 출시와 더불어서 Express Edition의 경우 한 박자 정도 업데이트가 늦어지는 편입니다. 이 때문에, 먼저 설치한 서비스 팩과 나중에 설치한 RTM 버전의 Express Edition 사이의 버전 차로 인한 충돌 문제가 이슈가 되었던적이 있는데, 이번 버전부터는 그러한 상황이 있을 경우 Visual Studio가 시작되기 전에 해당 문제점을 사용자에게 정확히 알려줍니다. 그 외에, 다양한 도구와 런타임에서 기능 및 성능 향상이 있었습니다.
저작자 표시 비영리 동일 조건 변경 허락
신고

Windows Azure Update: Windows Azure CDN의 활용

Cloud 2010.10.01 22:00 Posted by 남정현 (rkttu.com)

공지: 티스토리 편집기 조작 상의 문제로 완성되지 않은 글이 일찍 노출되는 문제가 있었습니다. 다음부터는 이러한 일이 없도록 하겠습니다. 불편을 드려서 대단히 죄송합니다.

안녕하세요. Visual C# MVP 남정현입니다. 지난달 13일부터 15일까지 성황리에 개최된 Korea Games Conference에서 보여주신 Social Game and Windows Azure Platform 세션에서, Windows Azure CDN에 관하여 말씀을 드린 부분이 있었습니다. 이번 아티클에서는 Windows Azure CDN의 구체적인 내용을 설명하고, Windows Azure CDN을 어떤 방법으로 활용할 수 있는지에 대한 내용을 소개합니다. 최근에 Windows Azure CDN도 Amazon Web Service CDN과 마찬가지로 서울을 경유하는 회선을 추가하여 비약적인 속도 발전이 있었기 때문에, 정식 출시가 이루어지지는 않았지만 미리 알아두시면 상당히 유용한 정보가 될 것이라 봅니다. :-)

CDN이란 무엇인가?

CDN은 일정한 크기의 파일들을 지역별로 Mirroring하여 동시에 많은 사용자가 같은 파일을 다운로드하려고 하는 상황에서도 안정적으로 파일 다운로드 서비스를 제공할 수 있도록 도와주는 서비스로, 인터넷 사용자의 비약적인 증가와 더불어서 CDN 서비스에 대한 수요가 증가하였습니다. 일반적으로 CDN 서비스는 대화형 웹 인터페이스 (CGI)를 경유하지 않고 정적인 컨텐츠를 퍼다나르기 위한 방법으로 많이 사용되며, 이미지, 동영상, 다소 크기가 큰 클라이언트용 설치 파일과 같이 "자료"의 성격을 띄는 데이터들을 위한 것이 일반적입니다.

Windows Azure CDN에 대한 소개

이전 방명록 샘플 강좌에서 파일을 업로드하기 위하여 사용한 저장 공간인 Windows Azure Storage에 최근에 CDN 서비스가 추가되었습니다. Windows Azure Storage에서 CDN을 사용하는 것은 별도의 과금이 이루어지는 서비스이며, 기본적으로 제공되는 Storage Service 주소와는 별개로 CDN 서비스만을 위한 전용 도메인이 구분되어있습니다. 물론 Storage 서비스와 마찬가지로 CDN 서비스도 Custom Domain 구성이 가능합니다.

Windows Azure CDN의 동작 원리

Windows Azure CDN은 Windows Azure Storage의 컨텐츠를 기준으로 만들어지는 서비스로, 여러분이 수집하거나 배포하기 위하여 Storage에 올려놓은 자료들 중에서도 "Public Access" 퍼미션이 지정된 컨테이너내의 Block BLOB들을 자동으로 검색하여 CDN 배포 에이전트가 일정 주기로 미러링을 수행합니다. 이렇게 미러링된 파일은 지역별로 제일 빠른 서버에 의하여 클라이언트로 다운로드될 수 있도록 자동 구성됩니다.

참고로, 특별히 Block BLOB이라고 언급한 까닭은, Windows Azure Storage에서 취급할 수 있는 BLOB이 두 종류가 있기 때문인데, 크기가 매우 크기 때문에 한번에 취급할 수 없어서 마치 Win32의 메모리 맵 처럼 부분별로 나누어서 데이터를 저장하거나 관리해야하는 거대한 파일을 위한 Paged BLOB은 미러링 대상으로 적합하지 않기 때문입니다.

Windows Azure CDN의 과금 정책

Windows Azure CDN의 과금 정책은 2010년 10월 현재 다음과 같이 공시되어있습니다. (출처: http://www.microsoft.com/windowsazure/offers/popup/popup.aspx?lang=en&locale=en-US&offer=MS-AZR-0003P)

  • $0.15 per GB for data transfers from European and North American locations
  • $0.20 per GB for data transfers from other locations
  • $0.01 per 10,000 transactions
  • 그리고 CDN 서비스의 사용을 위하여 전제가 되는 Storage 서비스의 요금은 다음과 같습니다.

  • $0.15 per GB stored per month
  • $0.01 per 10,000 storage transactions
  • 위의 요금들을 기준으로 하였을 때, 동아시아 지역의 데이터 센터를 이용하도록 구매하였을 경우, 매 달 과금되는 요금은 1GB 당 0.15$이고, 아시아 내에서의 트래픽이 많이 발생할 것이므로 전송량 1GB당 0.2$가 과금될 것이며, CDN 서비스를 통하여 매 1만건의 트랜잭션이 발생할 때 마다 0.01$가 과금될 것입니다.

    이러한 기준으로 볼 때, 한달에 30MB 정도의 파일 5개가 각각 기간 내 누적 다운로드 회수가 10000여회 정도 된다고 가정하면, 약 1464GB의 트래픽이 발생한 것으로 볼 수 있고 금액은 약 292.81$, 대미환율이 1200원이라고 가정하였을 때 한달 35만원 정도의 비용이 과금되는 셈입니다. 어떤 CDN 서비스를 사용하는지에 따라서 이 가격에 이점이나 단점이 제각기 있을 수 있지만 확장성이나 사용 편리성 관점에서 보았을 때 그리 나쁘지 않은 가격대일 수 있습니다.

    결론

    Windows Azure CDN은 다른 Windows Azure 서비스와 마찬가지로 프로그래밍 방식으로 제어가 가능한 범위 안에 있는 솔루션입니다. 기존의 CDN으로 충족되지 않는 기능성을 모두 포함하면서도, World-wide class의 서비스를 제공할 수 있으므로 사업 영역을 확장하거나, 초기 투자 비용을 적게 만들 수 있는 방안으로서는 매우 이상적인 서비스입니다. 최근에는 대한민국 서울을 경유하는 회선도 추가되어 서비스 수준이 더욱 높아졌습니다.

    이는 동영상 서비스 제공, 자료실 운영과 같은 일반 사용자를 위한 서비스 제공에도 대응이 가능하면서, 좀 더 복잡한 요구 사항을 만족시킬 수 있는 방법을 제공함을 뜻합니다. 사용한 만큼 돈을 지불하는 과금 모델이므로 호스팅과는 달리 사용량이 적을 때에는 적은 운영 비용을 유지하는 것도 가능합니다.

    CDN 서비스의 특성상 기술적으로 이해하거나 학습해야 할 내용이 많은 것은 아니나 성공적으로 비즈니스를 시작할 수 있도록 도움을 주는데에는 그 가치가 충분하다고 생각되는 바 Windows Azure CDN 서비스의 배경과 특징을 설명하는 내용을 이번 시간에다루었습니다.

    감사합니다. :-)

    저작자 표시 비영리 동일 조건 변경 허락
    신고

    Windows Azure Update: myAzureStorage

    Cloud 2010.09.06 20:30 Posted by 남정현 (rkttu.com)

    지난번 글 (2010/08/23 - [Cloud] - Windows Azure Update: CloudStorageAccount 클래스 사용 시 주의 사항)에 이어서 오늘은 myAzureStorage.com에 대한 내용을 소개합니다.

    사이트 바로 가기: http://www.myazurestorage.com/

    Windows Azure Platform의 핵심 기능들 중에서, Hosting Service (Compute) 영역 만큼 많은 비중을 차지하고 핵심적인 기능을 담당하는 것이 Storage Service (Storage) 영역입니다. 하지만 Storage Service를 단지 http://windows.azure.com/ 에서 제공하는 웹 프론트엔드로만 관리하는데에는 모자르는 점이 많은데요, 이를 효과적으로 보완하고 좀 더 쉽게 관리할 수 있는 웹 사이트를 소개합니다. 바로 myAzureStorage.com (http://www.myazurestorage.com) 이라는 사이트입니다.

    myAzureStorage는 SQL Azure Labs에서 공개한 Codename: Houston과는 별도로 독립적으로 런칭된 웹 서비스로, Windows Azure의 REST Management API를 기반으로 작성된 웹 기반 관리도구이며, 별도의 사용 요금이 없으므로 편리하게 활용할 수 있습니다.

    myAzureStorage.com에 접속하면 아래와 같은 로그인 화면이 나타납니다. Windows Azure Platform이 노출하는 REST Service API와의 연결을 위하여 Windows Azure Storage의 계정 ID와 Primary Access Key를 묻는 것이며 이는 http://windows.azure.com/ 에서 Storage Service 항목에 나와있는 값을 대입하면 됩니다.

    사이트에 로그인하고 나서는 아래 그림과 같이 Table, Queue, BLOB Storage에 대한 접근을 할 수 있게 되어있습니다. Table Storage의 경우 테이블 스키마를 정의하고 웹 상에서 직접 데이터를 검색할 수 있습니다.

    테이블 관리 기능 외에도, 큐에 쌓여있는 메시지를 조회하거나, BLOB 컨테이너 내의 파일을 편집하거나 다운로드하거나, 외부 공개 권한 설정 등을 관리할 수도 있게 되어있습니다. 이 서비스는 Windows Azure REST API를 이용하여 관리하므로 실제 트랜잭션을 일으키는 것 이외에 단순 조회 및 관리는 Windows Azure Platform의 요금 정책에 관계없이 편리하게 이용할 수 있습니다.

    저작자 표시 비영리 동일 조건 변경 허락
    신고

    SQL Azure Update: Dynamic Management View

    Cloud 2010.08.25 19:30 Posted by 남정현 (rkttu.com)

    안녕하세요. Visual C# MVP 남정현입니다. 가을을 재촉하는 비가 여기저기 내리면서 무더웠던 날씨가 한풀 꺾이는듯 합니다. 오늘은 Windows Azure Update와 Side-by-Side로 SQL Azure Update에 대한 이야기를 진행해보고자 합니다. :-)

    SQL Azure의 주요 기능이 우리가 생각하는것과 같이 상당한 수준에 있기 때문이거나, SQL Azure에 대해서 아직까지 많은 내용이 전달되지 않았기 때문일 수 있지만 SQL Azure 만의 고유한 기능을 다루는 섹션도 필요하다고 생각하여 진행하고 있으니 역시 많은 Feedback을 부탁드립니다.

    Dynamic Management View란?

    Dynamic Management View (이하 DMV)는 SQL Azure Team Blog에서 SQL Azure Service Update 1과 함께 제공한 새로운 기능으로, 이 글을 작성하는 현 시점에서는 매우 요긴하게 사용될 수 있고, 데이터베이스에 대한 정확한 사용량 추이를 파악할 수 있는데 도움을 주는 관리 API의 일종입니다. DMV는 시스템 뷰의 일종으로 다음과 같이 제공됩니다.

    • sys.dm_exec_connections: 최근에 접속한 모든 클라이언트들의 정보들을 조회합니다.
    • sys.dm_exec_requests: 최근에 실행된 Query의 상태와 실행 정보들을 조회합니다.
    • sys.dm_exec_sessions: 현재 연결된 클라이언트 및 세션에 대한 정보들을 조회합니다.
    • sys.dm_tran_database_transactions: 데이터베이스 수준의 트랜잭션들에 대한 정보를 조회합니다.
    • sys.dm_tran_active_transactions: 현재 활성화된 트랜잭션들에 대한 정보를 조회합니다.
    • sys.dm_db_partition_stats: 데이터베이스의 파티션 상태 및 각 파티션 별 사용량 정보를 조회합니다.

    DMV의 데이터를 살펴보는 방법

    DMV의 데이터는 관리를 위한 목적으로 활용하기에 알맞습니다. 또한, 데이터베이스 관리자가 별도의 응용프로그램을 사용하지 않고 손쉽게 상태를 파악할 수 있기 위해서는 Codename: Houston과 같은 SQL Azure 전용 데이터베이스 관리 도구를 활용하는 것이 편리합니다. (이 도구를 사용하면 별도의 방화벽 설정을 추가함으로 인해서 발생할 수 있는 노출 영역의 확대를 회피할 수 있기 때문입니다.)

    Codename: Houston에 관한 좀 더 자세한 정보는 2010/07/29 - [Cloud] - Windows Azure Update: Microsoft Project Code-Named "Houston" CTP 1 에서 확인하실 수 있으며, 현재 이 도구는 CTP 단계에 있으므로 실무에 곧바로 적용하여 활용하는 것에는 다소 불편함이 따를 수 있습니다. (관리 목적으로 활용할 때 제일 빈번하게 사용되는 결과 집합의 내보내기 기능이 아직 지원되지 않습니다.)

    DMV 데이터 조회 예시

    그 이외에 Service Update 1에서 개선된 부분들

    Service Update 1 이후부터는 이미 만들어진 데이터베이스의 상품 크기를 동적으로 관리 차원에서 변동을 줄 수 있습니다. 다음의 Query를 관리자 권한으로 SQL Azure Database에 접속한 후 실행하면 원하는 데이터베이스 크기를 설정하고 그 이후부터 변경된 데이터베이스 인스턴스 크기에 따른 요금을 자동으로 과금받을 수 있습니다.

    ALTER DATABASE database_name
    {
        MODIFY (MAXSIZE = {1 | 5 | 10 | 20 | 30 | 40 | 50} GB)
    }

    그리고 SQL Azure에서 세션 타임 아웃은 현재 30분으로 연장된 상태이며, 기본적으로 SQL Server 2008 R2에서 제공하는 장기 실행 트랜잭션 (혹은 교차 잠금 상태의 트랜잭션)을 찾아내서 정리하는 알고리즘이 좀 더 최적화되어있다는 것이 Service Update 1 이후의 변경 사항임을 알아두시면 유용할 것 같습니다.

    감사합니다. :-)

    저작자 표시 비영리 동일 조건 변경 허락
    신고

    안녕하세요. Visual C# MVP 남정현입니다. 지난번 Windows Azure Update (2010/07/29 - [Cloud] - Windows Azure Update: Microsoft Project Code-Named "Houston" CTP 1) 에 이어서 오늘은 Windows Azure Cafe 내에서 발견한 이슈에 대하여 소개하는 글을 올립니다. 이 글은 Windows Azure Tools for Visual Studio 버전 1.2에 적용되며 향후에 개선될 여지가 있는 부분으로 꼭 메모해두시면 좋을만한 부분입니다.

    CloudStorageAccount 클래스에 대하여

    Windows Azure Platform에서 사용하는 서비스의 유형 중에서, BLOB, Table, Queue를 다루기 위해서는 Windows Azure Storage 서비스를 신청하고 여기에 직접 접근하는 API를 호출해야 하는 데, 이 때 최초에 사용자 인증을 완료하기 위하여 제일 먼저 활용하는 클래스가 바로 CloudStorageAccount 클래스입니다. 이 클래스에는 다음과 같은 멤버들을 포함하고 있습니다.

    • [static] FromConfigurationSetting: Windows Azure의 Worker - 또는 - Web Role의 개별 환경 설정 파일에 들어있는 설정 파일로부터 Storage 연결 문자열을 가져와 CloudStorageAccount 객체를 생성하는 Factory Method입니다.
    • [static] Parse: 형식과 규칙에 맞는 연결 문자열이 있을 경우 문자열을 해석하여 CloudStorageAccount 객체를 생성하는 Factory Method입니다. 만약 분석에 실패할 경우 예외를 발생시킵니다.
    • [static] SetConfigurationSettingPublisher: Windows Azure Management API 등을 통해서 동적으로 설정 내역이 바뀌었을 경우 이를 전달하고 시스템 내부에 반영하는 통지 이벤트 처리기를 등록합니다.
    • [static] TryParse: 기본적으로 Parse 메서드와 하는 일이 동일하지만, 예외를 직접 던지지 않고 실패할 경우 반환값으로 false를 반환하도록 설계되어있어 조건문 만으로 예외 상황을 처리할 수 있도록 도와주는 도우미 메서드입니다.

    위의 Static Member들 중에서도 특별히 굵게 강조 표시한 메서드 2개는, 기본적으로 제공되는 프로젝트 템플릿 상에 별도의 언급도 없으며, 이에 대한 구체적인 문서를 쉽게 발견하기 힘들지만, 이 글에서 소개하는 내용을 적용하지 않았을 경우 다음의 문제가 발생할 수 있습니다.

    • FromConfigurationSettings 메서드를 호출할 때 예외가 발생합니다.
    • FromConfigurationSettings 메서드를 사용하지 않기 위하여 Role의 자체적인 Configuration File을 사용하도록 구성한 경우 설정 변경을 위하여 매번 Role을 새로 업데이트해야 하는 비효율적인 상황에 직면할 수 있습니다.

    문제 해결 방법

    이러한 문제를 해결하고, Storage API의 설정이 매 순간 관리 도구에 의하여 편집되고 정확히 반영될 수 있도록 하려면 SetConfigurationSettingPublisher 정적 메서드를 호출하여 이벤트 핸들러를 하나만 지정하면 됩니다. 아래의 코드를 WebRole.cs 파일 - 또는 - WorkerRole.cs 파일의 내용 중 OnStart 메서드에 추가하시면 됩니다.

    CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) =>
                {
                    string connectionString;

                    if (RoleEnvironment.IsAvailable) [각주:1]
                    {
                        connectionString = RoleEnvironment.GetConfigurationSettingValue(configName); [각주:2]
                    }
                    else
                    {
                        connectionString = System.Configuration.ConfigurationManager.AppSettings[configName];
                    }

                    configSetter(connectionString); [각주:3]
                });

    같이 보기: http://social.msdn.microsoft.com/Forums/en-US/windowsazure/thread/6d79ca07-f53a-4110-af46-e4edc7e34e9b 

    아래 그림은 적용 예시입니다.

    감사합니다. :-)

    1. Windows Azure SDK Simulator 위에서 실행 중이거나 실제 Windows Azure Platform 위에서 실행 중일 때 이 Static Property의 반환값은 항상 True이며, 그 외에 단순히 일반 ASP.NET 웹 사이트로 기동 중일 때에는 항상 False가 됩니다. [본문으로]
    2. 관리 도구 등에 의하여 변경된 신규 설정값을 읽습니다. [본문으로]
    3. 실제 설정이 반영되는 구간입니다. [본문으로]
    저작자 표시 비영리 동일 조건 변경 허락
    신고

    Hello Windows Azure / Twitter 스타일 방명록 만들기 #2

    Cloud 2010.08.10 00:00 Posted by 남정현 (rkttu.com)

    지난번 글 (2010/07/27 - [Cloud Development] - Hello Windows Azure / Twitter 스타일 방명록 만들기 #1)에 이어서 오늘 시간에는 ASP.NET MVC 2를 사용하는 Web Role 위에서 jQuery, jTemplate을 이용하여 기본적인 방명록 UI를 꾸며보고, 별 다른 Worker Role의 구현 없이 Windows Azure Table Storage를 경유하여 방명록의 글을 삽입, 삭제, 변경하는 기능을 구현해보기로 하겠습니다.

    시작하기 전에 (2010.08.09 Update)

    지난번 코드에서 누락되거나 교정될 필요가 있는 코드를 포함하여 업데이트를 할 부분이 있어 말씀을 전합니다. TwistDataSource.cs 파일의 내용을 다음과 같이 작성해야 하며, 지난번 코드에서 변경된 부분을 밑줄로 표시해두었습니다.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Microsoft.WindowsAzure;
    using System.Data.Services.Client;
    using Microsoft.WindowsAzure.StorageClient;

    namespace TwistBook.DataModel
    {
        public class TwistDataSource
        {
            private static CloudStorageAccount storageAccount;
            private TwistDataServiceContext serviceContext;

            static TwistDataSource()
            {
                // 중요: 실제로 응용프로그램을 Cloud 환경에 배포할 때에는
                // Cloud Project 내의 다른 환경 설정 문자열을 이용하도록
                // 호출을 변경해야 합니다.
                storageAccount = CloudStorageAccount.DevelopmentStorageAccount;

                CloudTableClient.CreateTablesFromModel(
                    typeof(TwistDataServiceContext),
                    storageAccount.TableEndpoint.AbsoluteUri,
                    storageAccount.Credentials);
            }

            public TwistDataSource()
            {
                this.serviceContext = new TwistDataServiceContext(storageAccount);
                this.serviceContext.RetryPolicy = RetryPolicies.Retry(
                    3, TimeSpan.FromSeconds(1));
            }

            public DataServiceResponse Insert(TwistModel model)
            {
                this.serviceContext.AddObject(
                    TwistDataServiceContext.TwistModelName,
                    model);

                return this.serviceContext.SaveChangesWithRetries();
            }

            public IEnumerable<TwistModel> Select()
            {
                var results = from eachTwist in this.serviceContext.TwistModel
                              select eachTwist;

                var query = new CloudTableQuery<TwistModel>(
                    results as DataServiceQuery<TwistModel>,
                    RetryPolicies.Retry(3, TimeSpan.FromSeconds(1)));

                return query.Execute();
            }

            public DataServiceResponse Delete(TwistModel model)
            {
                // 이 부분의 코드가 삭제되었습니다.
                this.serviceContext.DeleteObject(model);
                return this.serviceContext.SaveChanges();
            }

            public DataServiceResponse Update(TwistModel model)
           
    {
               
    this.serviceContext.UpdateObject(model);
               
    return this.serviceContext.SaveChanges();
            }

        }
    }

    Web Role 완성하기

    1. ASP.NET MVC 2 응용프로그램의 특성을 잘 살리기 위하여 AJAX 기술을 활용하는 방식으로 예제를 설명하고자 합니다. 이를 위하여 필요한 것이 jQuery와 jTemplate 라이브러리인데, jQuery의 경우 ASP.NET MVC 2 프로젝트를 만들면 자동으로 아래의 Scripts 디렉터리에 1.4 버전이 번들링되어있으니 별도로 받으실 필요가 없습니다.

    자바스크립트 라이브러리들의 경우, 근래 들어서는 4GL 개발 도구들의 영향으로 Debug Version과 Release Version 라이브러리를 각기 개별적으로 제공하는 경우가 늘었습니다. jQuery도 이러한 추세를 잘 따르고 있으며, 위의 화면에서 jquery-1.4.1-vsdoc.js 파일은 Debug 목적 + Visual Web Developer용 Intellisense 지원을 위한 버전이고, jquery-1.4.1.js 파일은 원래의 소스 코드가 있는 그대로 (as-is) 제공되는 버전입니다. 그리고 jquery-1.4.1.min.js 파일은 원래의 소스 코드에서 주석과 공백 제거, 변수명 최소화와 같은 Obfuscation Process를 포함한 Minified Process를 거친 전송에 최적화된 버전입니다.

    자바스크립트 전송에 필요한 대역폭을 좀 더 아낄 필요가 있고, 접속하는 브라우저들이 모두 G-ZIP 압축 해제 기능을 지원한다는 점을 확신할 수 있다면, WSFU (Windows Service For Unix)나 Cygwin, GNU for Win32 등을 통해서 액세스할 수 있는 GZIP 압축 유틸리티를 이용하여 Minified Version을 GZIP 파일로 한 번 더 묶어서 이를 다운로드하도록 구성하는 것도 좋은 선택이 될 수 있습니다. WSFU는 http://www.microsoft.com/downloads/details.aspx?FamilyID=896c9688-601b-44f1-81a4-02878ff11778&DisplayLang=en 에서 다운로드 가능합니다.

    2. jTemplate은 jQuery를 기반으로 만들어진 플러그인으로 HTML이나 XML 컨텐츠를 지정된 지시자에 맞추어 반복 생성하거나, 내용을 치환하거나, 수식을 계산하는 등의 복잡한 연산 작업을 가능하게 합니다. 특히 JSON (Java Script Object Notation) 기반의 데이터를 내려보내어줄 것이므로 이러한 기능은 필수적입니다. jTemplate은 http://plugins.jquery.com/project/jTemplates 에서 다운로드받으실 수 있고, 압축 파일을 다운로드받으면 아래와 유사한 형태로 나타납니다.

    3. jquery-jtemplates.js 파일을 선택하여 ASP.NET MVC 2 프로젝트의 Scripts 디렉터리 아래로 복사합니다. jQuery 라이브러리와 같은 위치에 배치하여 불러오기 쉽도록 만들기 위한 선택입니다.

    4. Visual Studio 솔루션 탐색기에서 방금 압축 해제한 jTemplate 라이브러리의 소스 코드를 추가해야 합니다. 솔루션 탐색기에서 Web Role 프로젝트 아래의 Scripts 디렉터리를 아래 그림과 같이 클릭하고 상단 도구 모음의 "모든 파일 표시" 버튼을 클릭하면 아직 등록되지 않은 jTemplate 라이브러리의 파일이 나타납니다.

    5. jquery.jtemplates.js 파일을 오른쪽 버튼으로 클릭하고 "프로젝트에 포함" 메뉴를 클릭하면 솔루션의 일부로 편입됩니다. 이 때, jquery.jtemplates.js 파일을 오른쪽 버튼으로 클릭하고 속성 메뉴를 선택하여 나타나는 속성 창에서 빌드 작업이 "내용"으로 선택되어있는지 반드시 확인하여 주세요. "내용"으로 선택되어있지 않은 파일은 실제 배포 때 제외될 수도 있습니다.

    6. 이제 마스터 페이지에 jQuery와 jTemplate 라이브러리를 추가해야 합니다. 여기서 마스터 페이지란 페이지 전반에 걸쳐서 기본 바탕이 되는 ASP.NET 사이트 수준의 골격 템플릿입니다. PowerPoint의 마스터 슬라이드와 비슷한 개념으로 이해해도 됩니다. 마스터 페이지는 Views 폴더 아래의 Shared 폴더 아래의 Site.Master 파일이며 아래와 같은 위치에 나타납니다.

    7. Site.Master 파일을 열어서 아래와 같이 수정합니다. 원래 내용에서 수정된 부분을 굵게 표시하였으며 자세한 내용은 각주를 참조하여 주십시오.

    <%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title>
        <link href="<%= Url.Content("~/Content/Site.css") %>" rel="stylesheet" type="text/css" /> [각주:1]
        <script type="text/javascript" src="<%= Url.Content("~/Scripts/jquery-1.4.1.min.js") %>"></script> [각주:2]
        <script type="text/javascript" src="<%= Url.Content("~/Scripts/jquery-jtemplates.js") %>"></script> [각주:3]

    </head>

    <body>
        <div class="page">

            <div id="header">
                <div id="title">
                    <h1>내 MVC 응용 프로그램</h1>
                </div>
                 
                <div id="logindisplay">
                    <% Html.RenderPartial("LogOnUserControl"); %>
                </div>
               
                <div id="menucontainer">
               
                    <ul id="menu">             
                        <li><%: Html.ActionLink("홈", "Index", "Home")%></li>
                        <li><%: Html.ActionLink("정보", "About", "Home")%></li>
                    </ul>
               
                </div>
            </div>

            <div id="main">
                <asp:ContentPlaceHolder ID="MainContent" runat="server" />

                <div id="footer">
                </div>
            </div>
        </div>
    </body>
    </html>

    8. 웹 페이지를 위한 기본 준비는 끝났습니다. 이제 Twitter Style의 방명록을 입력받을 수 있고 보여줄 수 있는 서비스를 만들기 위하여 서비스의 중심이 되는 Controller를 구성해보도록 하겠습니다. 편의를 위하여 HomeController를 편집하도록 하겠습니다. 솔루션 탐색기에서 TwistBook.WebRole 프로젝트의 Controllers 폴더 아래의 HomeController.cs 파일을 아래 그림과 같이 선택하여 엽니다.

    9. ASP.NET MVC에서 컨트롤러 내에서 Public 접근자로 노출된 각각의 Method는 이전의 ASP.NET Web Form에 비유하였을 때 개별 처리기 (ASHX 파일)에서 웹 페이지를 결정하여 내보내는 것과 같은 개념으로 최초에 사용자가 페이지에 접근할 때나, 페이지의 FORM 태그로부터 응답이 되돌아온 시점에서 모두 사용이 가능합니다. 이러한 특성을 바탕으로, HomeController는 그 자체로 API의 역할을 수행할 수 있으며 역으로 페이지를 렌더링하기 위한 컨텐츠 단위로서의 역할도 수행이 가능합니다.

    HomeController.cs 파일의 내용을 아래와 같이 수정합니다.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using Microsoft.WindowsAzure;
    using Microsoft.WindowsAzure.StorageClient;
    using TwistBook.DataModel;

    namespace TwistBook.WebRole.Controllers
    {
        [HandleError]
        public class HomeController : Controller
        {
            public HomeController()
                : base()
            {
            }

            public ActionResult Index()
            {
                ViewData["Message"] = "Windows Azure 방명록 예제";
                return View("Index"); [각주:4]
            }

            [HttpPost] [각주:5]
            public ActionResult RetrieveMessages()
            {
                var account = CloudStorageAccount.DevelopmentStorageAccount;
                var dataSource = new TwistDataSource();

                var results = from eachItem in dataSource.Select()
                              orderby eachItem.WrittenDate descending
                              select eachItem;

                return Json(results); [각주:6]
            }

            [HttpPost]
            public ActionResult AddMessage(string name, string message, string imageUrl)
            {
                var account = CloudStorageAccount.DevelopmentStorageAccount;
                var dataSource = new TwistDataSource();
                dataSource.Insert(new TwistModel()
                {
                    WriterName = name,
                    WrittenDate = DateTime.Now,
                    MessageBody = message,
                    ImageUrl = imageUrl
                }); [각주:7]

                return Index(); [각주:8]
            }

            public ActionResult UpdateMessage(string partitionKey, string rowKey) [각주:9]
            {
                var account = CloudStorageAccount.DevelopmentStorageAccount;
                var dataSource = new TwistDataSource();
                var results = from eachItem in dataSource.Select()
                              where eachItem.PartitionKey == partitionKey
                              where eachItem.RowKey == rowKey
                              select eachItem;

                ViewData["PartitionKey"] = partitionKey;
                ViewData["RowKey"] = rowKey; [각주:10]

                if (results.Count() > 0)
                {
                    var result = results.First();
                    ViewData["Name"] = result.WriterName;
                    ViewData["Message"] = result.MessageBody; [각주:11]
                }

                return View();
            }

            [HttpPost]
            public ActionResult UpdateMessage(string partitionKey, string rowKey, string name, string message, string imageUrl) [각주:12]
            {
                var account = CloudStorageAccount.DevelopmentStorageAccount;
                var dataSource = new TwistDataSource();
                var results = from eachItem in dataSource.Select()
                              where eachItem.PartitionKey == partitionKey
                              where eachItem.RowKey == rowKey
                              select eachItem;

                if (results.Count() > 0)
                {
                    var result = results.First();

                    if (result != null)
                    {
                        result.WriterName = name;
                        result.MessageBody = message;
                        result.WrittenDate = DateTime.Now;
                        result.ImageUrl = imageUrl;
                        dataSource.Update(result);
                        return View("PopupUpdateView"); [각주:13]
                    }
                    else
                        return View("PopupUpdateFailView");
                }
                else
                    return View("PopupUpdateFailView"); [각주:14]
            }

            public ActionResult DeleteMessage(string partitionKey, string rowKey)
            {
                var account = CloudStorageAccount.DevelopmentStorageAccount;
                var dataSource = new TwistDataSource();
                var results = from eachItem in dataSource.Select()
                              where eachItem.PartitionKey == partitionKey
                              where eachItem.RowKey == rowKey
                              select eachItem;

                if (results.Count() > 0)
                {
                    dataSource.Delete(results.First());
                    return Index(); [각주:15]
                }
                else
                    return Index();
            }

            public ActionResult About()
            {
                return View();
            }
        }
    }

    10. 방명록의 기본 기능을 만들기 위하여 이제 Views 폴더 아래의 Home 폴더 아래의 Index.aspx 파일을 열어서 편집해야 합니다. 아래 그림과 같은 위치에 존재합니다.

    <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

    <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
        홈 페이지
    </asp:Content>

    <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
        <script type="text/javascript">
            $(document).ready(function () {
                $.ajax({
                    type: 'POST', [각주:16]
                    url: '<%= Url.Action("RetrieveMessages") %>', [각주:17]
                    data: '{}',
                    contentType: 'application/json; charset=utf-8',
                    dataType: 'json', [각주:18]
                    success: function (data) {
                        var targetDiv = $('#guestbookList');  [각주:19]
                        targetDiv.setTemplate($('#templateContent').html()); [각주:20]
                        targetDiv.processTemplate(data); [각주:21]
                    }
                });
            });
        </script>
       
        <script type="text/html" id="templateContent">
        {#foreach $T as record}
        <div style="padding-bottom: 5px;">
            <img src="{$T.record.ImageUrl}" alt="" style="float: left; width: 100px;" />
            <div style="float: left; margin: 5px 5px 5px 5px;">
                <h3>RT @{$T.record.WriterName} {$T.record.MessageBody}</h3>
                <pre>{$T.record.WrittenDate} via cloud</pre>
                <a href="#" onclick="window.open('<%= Url.Content("~/Home/UpdateMessage") %>?partitionKey={$T.record.PartitionKey}&rowKey={$T.record.RowKey}', 'editWindow', 'location=1,status=1,scrollbars=1,width=300,height=200');">편집</a>
                &nbsp;|&nbsp;
                <a href="<%= Url.Content("~/Home/DeleteMessage") %>?partitionKey={$T.record.PartitionKey}&rowKey={$T.record.RowKey}" target="_self">삭제</a>
            </div>
            <div style="clear: both;"></div>
        </div>
        {#/for}
        </script> [각주:22]

        <h2><%= ViewData["Message"] %></h2>
        <div>
            <div>
                <% using (var form = Html.BeginForm("AddMessage", "Home", FormMethod.Post))
                   { %> [각주:23]

                   <%: Html.Label("이름") %>
                   <%: Html.TextBox("name", "What is your name?") %> [각주:24]
                   <br />

                   <%: Html.TextArea("message", "Type your message here.", 3, 100, null) %>
                   <br /> [각주:25]

                   <input type="submit" value="보내기" />&nbsp;<input type="reset" value="초기화" /> [각주:26]
                   <br />
                <% } %>
            </div>
            <br /><br />
            <div id="guestbookList"></div> [각주:27]
        </div>
    </asp:Content>

    11. 방명록 내용을 편집하기 위한 팝업 창을 위한 뷰와, 댓글 편집이 끝난 뒤 취할 동작을 프로그래밍한 자바스크립트 코드를 위한 뷰는 Partial View로 디자인해야 합니다. 이 중에서 우선 방명록 항목 편집을 위한 Partial View를 추가하기 위해, 솔루션 탐색기에서 Views 디렉터리 아래의 Home 디렉터리를 오른쪽 버튼으로 클릭하고, View 추가 메뉴를 아래 그림과 같이 선택합니다.

    12. View의 이름은 UpdateMessage로 지정하고, Partial View에 체크하여 아래 대화 상자와 같이 옵션을 구성한 후 확인 버튼을 클릭합니다.

    13. UpdateMessage.ascx 파일의 내용을 다음과 같이 작성합니다.

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<dynamic>" %>
    <div>
        <% using (var form = Html.BeginForm("UpdateMessage", "Home", FormMethod.Post))
           { %> [각주:28]

           <%: Html.Hidden("partitionKey", ViewData["PartitionKey"]) %>
           <%: Html.Hidden("rowKey", ViewData["RowKey"]) %> [각주:29]

           <%: Html.Label("이름") %> 
           <%: Html.TextBox("name", (string)ViewData["Name"]) %> [각주:30]
           <br />

           <%: Html.TextArea("message", (string)ViewData["Message"], 3, 100, null) %>[각주:31]
           <br />

           <input type="submit" />&nbsp;<input type="reset" /> [각주:32]
           <br />
        <% } %>
    </div>

    14. 이어서 솔루션 탐색기에서 Views 디렉터리 아래의 Home 디렉터리를 오른쪽 버튼으로 클릭하고, View 추가 메뉴를 11단계에서와 같이 선택합니다.

    15. View의 이름은 PopupUpdateView로 지정하고, Partial View에 체크하여 아래 대화 상자와 같이 옵션을 구성한 후 확인 버튼을 클릭합니다.

    16. PopupUpdateView.ascx 파일의 내용을 다음과 같이 작성합니다.

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<dynamic>" %>
    <script type="text/javascript">
        try {
            window.close(); [각주:33]
            if (window.opener && !window.opener.closed) {
                window.opener.location.href = '<%= Url.Content("~/Home/Index") %>'; [각주:34]
            }
        } catch (ex) {
        }
    </script>

    17. 이어서 솔루션 탐색기에서 Views 디렉터리 아래의 Home 디렉터리를 오른쪽 버튼으로 클릭하고, View 추가 메뉴를 11단계에서와 같이 선택합니다.

    18. View의 이름은 PopupUpdateFailView로 지정하고, Partial View에 체크하여 아래 대화 상자와 같이 옵션을 구성한 후 확인 버튼을 클릭합니다.

    19. PopupUpdateFailView.ascx 파일의 내용을 다음과 같이 작성합니다.

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<dynamic>" %>
    <h3>업데이트에 실패하였습니다.</h3>
    <a href="#" onclick="window.close()">창 닫기</a>

    20. 기본적인 방명록 글 남기기와 조회 기능이 올바르게 작동하는지 확인하기 위하여 시뮬레이터를 디버그 모드로 시작해야 합니다. 일반적인 응용프로그램 개발 때와 마찬가지로 F5키를 눌러서 디버그 모드로 시뮬레이터에 패키지를 배포하고 디버거를 연결할 수 있습니다. 이 때, 아래 그림과 같은 오류 메시지가 나타나면 관리자 권한이 아닌 상태에서 Visual Studio를 시작한 것이므로 Visual Studio를 종료한 뒤 "개발 도구 시작하기 및 프로젝트 생성하기" Chapter의 1단계를 참고하여 관리자 모드로 Visual Studio를 다시 시작해야 합니다.

    21. 아래의 그림들에서처럼 기능들이 정상적으로 진행된다면 우선 이번 시간에 진행할 기본 기능들에 대한 소개와 작업이 끝난 것입니다.

    이번 Article을 작성하면서 발견한 Windows Azure SDK 1.2에 대한 문제 한 가지

    좀 더 완성에 가까워질수록 해결될 문제들 중에 한 가지가 될 예정이긴 하겠습니다만 실습하는 도중 불편함이 예상되어 제가 발견한 문제를 블로그 아티클을 통하여 미리 공유하고자 합니다. 간혹 Windows Azure Local Storage의 Table Storage에 아래와 같이 MBCS (Multi-Byte Character Set) 문자가 포함된 데이터를 삽입하려고 할 때 별 다른 까닭없이 HTTP/404 오류가 나타나는 경우가 있습니다.

    사용자 코드에서 System.Data.Services.Client.DataServiceRequestException이(가) 처리되지 않았습니다.
      Message=이 요청을 처리하는 동안 오류가 발생했습니다.
      Source=Microsoft.WindowsAzure.StorageClient
      StackTrace:
           위치: Microsoft.WindowsAzure.StorageClient.Tasks.Task`1.get_Result()
           위치: Microsoft.WindowsAzure.StorageClient.Tasks.Task`1.ExecuteAndWait()
           위치: Microsoft.WindowsAzure.StorageClient.TaskImplHelper.ExecuteImplWithRetry[T](Func`2 impl, RetryPolicy policy)
           위치: Microsoft.WindowsAzure.StorageClient.TableServiceContext.SaveChangesWithRetries(SaveChangesOptions options)
           위치: Microsoft.WindowsAzure.StorageClient.TableServiceContext.SaveChangesWithRetries()
           위치: TwistBook.DataModel.TwistDataSource.Insert(TwistModel model) 파일 d:\users\남정현\documents\visual studio 2010\Projects\TwistBook\TwistBook.DataModel\TwistDataSource.cs:줄 42
           위치: TwistBook.WebRole.Controllers.HomeController.AddMessage(String name, String message, String imageUrl) 파일 d:\users\남정현\documents\visual studio 2010\Projects\TwistBook\TwistBook.WebRole\Controllers\HomeController.cs:줄 44
           위치: lambda_method(Closure , ControllerBase , Object[] )
           위치: System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
           위치: System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
           위치: System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
           위치: System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.<InvokeActionMethodWithFilters>b__a()
           위치: System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
      InnerException: System.Data.Services.Client.DataServiceClientException
           Message=<?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
      <code>InvalidInput</code>
      <message xml:lang="ko-KR">One of the request inputs is not valid.</message>
    </error>
           Source=System.Data.Services.Client
           StatusCode=400
           StackTrace:
                위치: System.Data.Services.Client.DataServiceContext.SaveResult.<HandleBatchResponse>d__1e.MoveNext()
           InnerException:



    실제 Windows Azure 실행 환경에서는 이러한 현상이 나타나지 않는 것으로 보입니다. 추후, 이러한 문제점을 해결할 수 있는 방안이 발견되면 별도의 업데이트 소식을 통하여 정보가 전달될 수 있도록 하겠습니다. 예제를 기반으로 테스트 패브릭 위에서 테스트하시는 동안에는 Table Storage에 한글, 히라가나, 카타카나, 번체, 간체, 한자 등의 데이터가 들어가지 않는 범위에서 테스트가 필요할 것 같습니다.

    다음 시간에는

    다음 시간에는 각 Role이 어떤 방법으로 Windows Azure 환경에서 실행되는지, Web Role과 Worker Role이 Cloud Computing 환경에서 상호 작용하고 통신하는 방법을 본격적으로 소개하고, 오늘 만든 Web Role을 어떤 방식으로 수정하게 될 것이고, Worker Role이 어떤 방식으로 데이터를 교환하게 될 것인지를 보여드릴 예정입니다. 그리고 이번 시간에 언급하지 않은 BLOB Storage에 이미지를 저장하고 가져오는 방법에 대해서도 소개하겠습니다. :-)

    더운 여름 날씨에 건강 유의하시고, 활기찬 여름 보내시기 바랍니다. 감사합니다.

    ps. Windows Azure Cafe (http://cafe.naver.com/wazure) 에서 2010년 8월 14일부터 본격적으로 Offline Study를 진행합니다. Windows Azure Platform의 학습에 관심있으신 개발자 여러분들의 많은 관심과 참여 부탁드리며, 아울러 Visual Studio 2010 공식 팀 블로그에서 Cloud Computing 관련 Article을 집필하실 열정적인 Blogger 여러분도 함께 모시고 있습니다. 이에 관련된 모든 상세한 내용은 Windows Azure Cafe를 통하여 저에게 연락 주시면 상세히 안내해드리겠습니다. 감사합니다. :-)

    1. 기본으로 제공되는 템플릿 코드로부터 수정한 부분으로, 마스터 페이지는 처리 과정 도중에 해석되는 파일이지만 브라우저의 입장에서 서비스를 하는 페이지가 아니기 때문에, 기본으로 제공되는 경로인 ../../Content/Stie.css는 잘못 해석될 가능성이 있습니다.&#10;&#10;이를 예방하기 위하여 Inline Expression을 사용하여 Url.Content 메서드로 정확한 경로를 다시 가져오도록 만든 것입니다. [본문으로]
    2. 기본으로 제공되는 템플릿 코드로부터 수정한 부분으로, 마스터 페이지는 처리 과정 도중에 해석되는 파일이지만 브라우저의 입장에서 서비스를 하는 페이지가 아니기 때문에, 기본으로 제공되는 경로인 ../../Content/jquery-1.4.1.min.js는 잘못 해석될 가능성이 있습니다.&#10;&#10;이를 예방하기 위하여 Inline Expression을 사용하여 Url.Content 메서드로 정확한 경로를 다시 가져오도록 만든 것입니다. [본문으로]
    3. 이번 시간에 JSON 기반의 데이터를 표현하기 위하여 사용할 jTemplate 라이브러리를 여기에서 지정합니다. 앞의 URL들과 마찬가지의 방법을 사용하여 정확하게 경로가 참조될 수 있도록 만들어줍니다. [본문으로]
    4. 기본 Index 메서드에서는 return View(); 로 호출하였지만, 다른 Controller Method에서 이 메서드를 호출하게 되는 경우, Index View가 아닌 Controller 그 자신의 View를 찾도록 기본 설계가 구성되어있기 때문에, 이를 방지하고 재 사용하기 쉬운 형태로 만들기 위해 특별히 "Index"라는 뷰 이름을 찾도록 명시한 것입니다. [본문으로]
    5. POST 요청에 의해서만 메시지가 JSON 형식으로 내려가도록 구성하기 위한 것으로, 필요에 따라이 Attribute를 누락하고, 아래의 Json 메서드 호출에서 AllowGet 인자를 지정하면 GET 요청에 의해서도 조회 결과가 JSON으로 반환될 수 있습니다. [본문으로]
    6. ActionResult 클래스를 상위 클래스로 두는 JSON Serialization Result 객체를 반환합니다. [본문으로]
    7. 데이터 삽입 직후 Commit 연산까지 한번에 처리하도록 설계된 메서드를 부르는 것입니다. [본문으로]
    8. 중요: 이 함수의 결과로 나타나는 View가 AddMessage가 아니라 Index입니다. [본문으로]
    9. 동일한 메서드에 대한 오버로드이지만, GET 방식으로 호출될 수 있고, 인자를 2개를 받도록 구성되어있으므로 이 버전의 메서드에서는 View를 렌더링하는데 사용됩니다. [본문으로]
    10. ViewData 컬렉션에 Update 동작을 구현하기 위해 필요한 정보를 다시 전달합니다. 나중에 View에서 이 정보를 참조하여 페이지를 렌더링하게 됩니다. [본문으로]
    11. 조회된 결과를 페이지 렌더링을 위하여 ViewData 컬렉션에 보관합니다. [본문으로]
    12. 동일한 버전의 UpdateMessage 메서드에 대한 오버로드이지만, POST 요청에만 동작하도록 설계된 버전의 Controller Method입니다. [본문으로]
    13. 편집을 마친 후, 미리 구성된 PopupUpdateView를 찾아 이동합니다. 이 뷰는 팝업창 형태로 열린 편집 창을 닫고, 팝업 창의 부모 (window.opener)를 새로 고침하도록 디자인된 뷰입니다. [본문으로]
    14. 업데이트에 실패할 경우 보여줄 View를 지정합니다. [본문으로]
    15. 데이터 삭제 후 Index 뷰를 다시 로드하도록 만들었습니다. [본문으로]
    16. XmlHttpRequest 객체를 이용하여 전송할 때 POST 방식으로 요청하는 것을 명시하고 있습니다. [본문으로]
    17. RetrieveMessages Controller Method를 정확히 찾을 수 있도록 전체 경로를 반환하는 함수를 사용하여 스크립트 위에 렌더링합니다. [본문으로]
    18. JSON 방식의 결과 집합이 필요함을 명시하고, JSON 방식으로 데이터를 받아들이도록 구성하고 있습니다. [본문으로]
    19. jTemplate 엔진으로 치환된 내용을 렌더링할 대상 div element를 찾습니다. [본문으로]
    20. 기준이 되는 템플릿 컨텐츠를 로드합니다. 이스케이프 문자로 복잡하게 처리하지 않고 편리하게 다룰 수 있도록 만들기 위하여, JavaScript나 VBScript로 해석되지 않도록 처리한 별도의 SCRIPT element로부터 로드하도록 구성하였습니다. [본문으로]
    21. jTemplate 엔진을 이용하여 주어진 데이터를 통해 렌더링을 시작합니다. [본문으로]
    22. 렌더링에 필요한 템플릿 코드가 이곳에 기술됩니다. 이 부분은 스크립트 태그 안에 있지만 스크립트 해석기에 의하여 처리되지는 않으며, 또한 시각적으로 드러나지도 않습니다. (as-is string으로 해석됩니다.) [본문으로]
    23. 메시지를 추가하기 위한 form 데이터를 구성하고 있습니다. [본문으로]
    24. Controller Method의 name 매개 변수와 이름을 같게 지정합니다. [본문으로]
    25. Controller Method의 message 매개 변수와 이름을 같게 지정합니다. [본문으로]
    26. 전송 버튼과 초기화 버튼이 trigger 역할을 하여 데이터를 전송하거나 리셋하는 역할을 합니다. [본문으로]
    27. 방명록 목록은 이 요소 아래에 rendering 될 것입니다. [본문으로]
    28. UpdateMessage의 POST 전송 대상을 찾아 업데이트 작업을 수행하도록 만듭니다. [본문으로]
    29. 링크에 의하여 GET 방식으로 전달된 매개 변수를 다시 렌더링하여 재사용합니다. [본문으로]
    30. ViewData에 저장된 기존 데이터를 꺼내옵니다. [본문으로]
    31. ViewData에 저장된 기존 데이터를 꺼내옵니다. [본문으로]
    32. 전송 버튼과 초기화 버튼이 trigger 역할을 하여 데이터를 전송하거나 리셋하는 역할을 합니다. [본문으로]
    33. 팝업 창을 닫습니다. [본문으로]
    34. 팝업 부모 창이 유효하다면, 정확한 Index View의 URL을 찾아 다시 로드하도록 만듭니다. [본문으로]
    저작자 표시 비영리 동일 조건 변경 허락
    신고

    안녕하세요. Visual C# MVP 남정현입니다. 요즈음 날씨가 매우 덥네요. :-)

    이번 글은 지난번에 올렸던 2010/06/24 - [Visual Studio 2010/Visual Studio 2010] - Just for fun! / DreamSpark는 대학생 여러분을 위한 솔루션입니다. 글을 보충하고 최신 소식을 전달하기 위한 취지로 포스팅하는 글입니다. 소프트웨어 개발을 처음 시작하시는 분들께 역시 도움이 될 수 있도록 정보를 제공하기 위한 취지로 작성되었습니다. :-)

    최근에 VS2010 Live!에서 소개된 Visual Studio LightSwitch라는 신 제품에 대해서 블로그 포스팅을 조촐하게 해봅니다. Visual Studio LightSwitch는 기존의 Visual Studio Express Edition과는 별도로 구분되는 제품으로 매우 신속하고 빠르게 새로운 형태의 소규모 데이터베이스 시스템과 통합하거나, 기존의 WCF RIA Service, SQL Server Database 등과 상호 작용하면서 C/R/U/D (Create/Read/Update/Delete) 및 검색 기능, Office 연동 기능을 지원하는 Rich Application의 생산을 가능하게 해주는 개발 도구입니다. Visual Studio LightSwitch는 2010년 8월 23일 이후부터 베타 버전으로 처음 http://www.microsoft.com/visualstudio/en-us/lightswitch 에서 공개될 예정에 있습니다.

    가장 많은 웹 사이트와 가장 많은 도서에서 보여주는 C/R/U/D 기반의 응용프로그램들의 패턴을 Visual Studio LightSwitch는 최신의 UI 기술을 사용하여 그 어떤 도구들보다도 더 쉽게 프로그램이 제작될 수 있도록 도와줍니다. 단순히 Grid Control에서 데이터를 추가, 편집, 삭제할 수 있는 UI가 아니라, 여러분이 원하는 화면의 디자인을 미리 제공되는 데이터 바인딩과 함께 손쉽게 프로그래밍할 수 있도록 돕습니다.

    위의 그림에서 보시는것과 같이, Visual Studio LightSwitch는 데이터 가공 방법과 범주에 따라 일반적으로 결정되는 화면의 패턴을 템플릿으로 제공하고 있습니다. 대부분의 경우, 이러한 요구 사항과 부합하는 화면들 내에서 선택이 가능하므로 단순한 데이터 조회 및 검색 화면에 들어가는 작업 소요 기간을 획기적으로 단축시킬 수 있습니다. 뿐만 아니라, 데이터 모델링에서는 단순한 시스템 데이터 형식 뿐만 아니라, 유효성 검사를 염두에 둔 모델링과 UI 연동이 가능하여 세세한 검사를 위한 코드 작성은 하지 않아도 되며, 기본으로 제공되는 Grid Control의 경우 필터링, 열의 재 배치, 행 정렬, 검색, 페이징이 Built-in 기능입니다. 그리고, 요즈음 Microsoft Application UI의 핵심적인 Trademark인 Ribbon Interface도 빠지지 않습니다. :-)

    기존에 Windows Forms, Windows Presentation Foundation 기반의 개발 도구를 이용하여 Desktop 및 Office Application을 개발하는 동안 고객으로부터 가장 많이 받게 되는 요구 사항 중 하나인 Excel Export 기능이 Visual Studio LightSwitch를 기반으로 만들어지는 응용프로그램에서는 미리 제공되는 Built-in 기능 중의 하나입니다. 더 이상 Excel 상호운용성 코드나 Primary Interop Assembly를 찾아서 방황하지 않아도 됩니다. :-)

    그리고 Visual Studio LightSwitch는 앞으로도 다양한 확장 패키지를 지원해 나갈 수 있으며, 이러한 확장 패키지를 기반으로하여 가까이는 시각 상의 심미적인 효과를 위한 확장, 하드웨어와의 연동 기능 뿐만 아니라 향후에는 Cloud Computing을 위한 응용프로그램 디자인까지도 염두에 둘 수 있습니다.

    Visual Studio LightSwitch는 System Integration 개발 부문, Business Intelligence 확장 부문 등 기존에 특별한 기술적 이득 없이 기계적인 반복 작업을 바탕으로 하는 대부분의 소프트웨어 개발 작업에서 더 큰 진가를 발휘할 수 있을 것으로 예상됩니다. 향후에는 Chart, Graph, HTML Editing Control, Built-in Web Browser와 같이 일반적인 Desktop 및 Office Application에서 많이 사용되는 기능에 대한 Extension Pack이 추가될 것도 염두에 두어본다면 반복적인 작업으로부터 많은 일손을 덜어내어줄 수 있는 멋진 도구가 될 수 있을 것 같이 미래가 기대됩니다.

    Cloud Computing과의 연계성에 있어서도 Visual Studio LightSwitch의 역할은 매우 클 것으로 보이며, 향후에 Cloud Computing과의 연계 기능에 대해서도 본격적으로 Topic을 다룰 수 있을 때, 상세하게 정보를 전달할 수 있도록 하겠습니다.

    사이트 바로가기 및 키노트 동영상 구경하러 가기: http://www.microsoft.com/visualstudio/en-us/lightswitch

    오늘도 좋은 하루 되세요. 감사합니다. :-)

    저작자 표시 비영리 동일 조건 변경 허락
    신고

    Windows Azure Update: Microsoft Project Code-Named "Houston" CTP 1

    Cloud 2010.07.29 09:00 Posted by 남정현 (rkttu.com)

    바로 가기: https://www.sqlazurelabs.com/houston.aspx

    안녕하세요. Visual C# MVP 남정현입니다. Hello Windows Azure와는 별도로, Windows Azure Platform 및 Windows Azure 관련 커뮤니티 소식, Labs 프로젝트, 신 기술을 집중적으로 조명하는 Article을 비정기적으로 "Windows Azure Update" 시리즈를 통하여 소개할 예정입니다. 많은 관심 부탁드립니다.

    Windows Azure Platform에서 가장 많은 관심과 아쉬움의 대상이었던 SQL Azure에 대한 사용자들의 갈증을 풀어줄 시원한 도구가 하나 등장했습니다. 바로 Codename: Houston이 그 주인공인데요, 간단히 요약하면 Silverlight로 제공되는, 웹 브라우저에서 쉽게 접속하여 사용할 수 있는 SQL Azure Database 관리 도구입니다. 일단 접속 화면부터 살펴보기로 할까요?

    SQL Management Studio Express를 이용하는 것과 유사한 화면을 보실 수 있습니다. 접속할 SQL Azure 서버의 호스트 이름을 찾아서 넣고, 접근할 데이터베이스의 이름을 입력한 후, 관리자 ID와 비밀 번호를 넣고 Connect 버튼을 클릭하면 아래와 같이 접속 중임을 표시하는 화면이 나타납니다.

    잠시 더 기다리면 멋진 초기화면이 나타납니다. 이런 스타일의 화면을 웬지 오랫만에 보는것 같군요. :-)

    접속한 데이터베이스의 상태를 한눈에 파악할 수 있는 Dashboard가 Start Page에 나타납니다. 화면에서 알 수 있듯이, 탭 페이지 방식으로 여러 화면을 구성할 수 있도록 되어있습니다. 그리고 우리가 평소에 사용하던 Microsoft Access의 버전 2007 이후부터 도입된 Ribbon UI를 사용한다는 것 또한 한눈에 들어옵니다. Dashboard에 또 다른 정보들이 어떤 것이 나타나는지 잠시 살펴볼까요?

    사용량 정보가 상세하게 나타납니다. 그리고, 다소 식상하게 비칠지도 모르는 Help Links가 한 면을 차지하고 있군요. 현재 공개된 CTP 버전에서는 이 정도의 기능을 제공하는 것으로 나타나지만 좀 더 많은 사용자들의 의견이 더해짐에 따라서 매우 유용한 기능이 앞으로 이곳에 추가될 것 같습니다. :-)

    네. 그렇습니다. 정말 그리웠던 기능이죠. 시각적으로 테이블의 스키마를 편집할 수 있다는 사실은 정말 중요할 수 있습니다. SQL Management Studio Express를 이용해서 접속했어도 사용할 수 없었던 그 기능이 드디어 SQL Azure와 Codename: Houston의 만남으로 가능하게 된 것입니다. 그리고 이미 만들어진 테이블이라 할지라도 매우 편리하게 테이블의 이름을 아래 그림과 같이 수정할 수 있습니다.

    그리고 Column을 추가하는 것도 무척 쉽습니다. 하단의 "+ Column" 버튼을 클릭하는 것 만으로도 손쉽게 추가가 됩니다. 아래 그림과 같이 새 Column이 추가되었다는 것도 시각적으로 잘 보여집니다.


    그러면 이제 데이터 조회 기능을 살펴보도록 하겠습니다.

    당연한 기능이지만 Codename: Houston에서 이러한 화면을 보고 있으니 더욱 놀랍게 비추어지는것 같습니다. :-) 데이터 집합 말고도, 서버로부터 직접 전달받은 메시지도 Messages 탭을 클릭하면 아래와 같이 잘 보여집니다.

    아래의 두 Screenshot은 View와 Stored Procedure를 생성하는 편집 화면입니다. 참고로 Stored Procedure는 매개 변수를 시각적으로 선택하고 관리할 수 있으므로 Stored Procedure의 본문만을 집중하여 편집하면 됩니다.

    만약 저장되지 않은 상태에서 오른쪽 상단의 Logout 버튼을 클릭할 경우 아래와 같이 경고 메시지도 나타나게 됩니다.

    여기까지, 간단했지만 초고속으로 살펴본 Codename: Houston의 모습이었습니다. 사용해보고 싶으시다구요? https://www.sqlazurelabs.com/houston.aspx 페이지를 방문하시면 Codename: Houston을 무료로 사용해보실 수 있습니다. 별도의 가입 절차나 등록 절차가 없으니 자유롭게 이용해보시기 바랍니다. 참고로, 아직은 Out-of-browser Application Type으로는 이용하실 수 없으니 Google Chrome의 Application Link 생성 기능을 이용하여 URL 자체를 창으로 띄울 수 있도록 구성하시면 더욱 편리하게 이용하실 수 있을 것입니다.

    저작자 표시 비영리 동일 조건 변경 허락
    신고

    Hello Windows Azure / Twitter 스타일 방명록 만들기 #1

    Cloud 2010.07.27 09:00 Posted by 남정현 (rkttu.com)

    꼭 읽어주세요: 이 글이 작성된 현 시점에 가장 최신 버전의 Azure Tools는 버전 1.2입니다. 이 강좌를 시작하시기 전에 Windows Azure Tools for Visual Studio를 1.2 버전으로 업그레이드하여 주십시오. 이전 버전을 설치하신 경우에는 SDK와 Tools를 모두 완전히 제거한 후 1.2 버전으로 새로 설치하여 주십시오. Windows Azure Tools for Visual Studio 1.2 한글판 다운로드는 http://www.microsoft.com/downloads/details.aspx?displaylang=ko&FamilyID=2274a0a8-5d37-4eac-b50a-e197dc340f6f 에서 가능합니다.

    지난번 글 (2010/06/07 - [Cloud Development] - Hello Windows Azure / Understanding Windows Azure Development Process)에 이어서, 오늘부터는 Twitter 스타일 방명록 만들기 첫 번째 시간입니다. 이번 시간에는 Windows Azure 프로젝트를 만들고, 데이터 모델을 작성하고 파악하는 것을 실습 목표로 정의하고자 합니다.

    빠르고 편리한 실습을 위하여, Visual Web Developer 2010 Express를 사용하여 실습하는 것을 기준으로 하겠습니다. Visual Studio 2010이 이미 설치되어있으신 경우 이를 이용하셔도 됩니다. 어떤 개발 도구를 사용하더라도 반드시 Windows Azure Tools for Visual Studio가 설치되어있어야 하며 설치 방법은 2010/06/03 - [Cloud Development] - Hello Windows Azure / Windows Azure 개발 환경의 구축 에서 소개하는 내용에 따라 완료하여 주시기 바랍니다.

    개발 도구 시작하기 및 프로젝트 생성하기

    1. Visual Web Developer 2010 Express (또는 Visual Studio 2010)를 권한 상승 시킨 상태에서 시작하도록 합니다. 아래의 그림을 참고하세요. 사용자 계정 컨트롤을 사용하고 있을 경우 별도의 경고 대화 상자가 나타날 수 있으며 실행하도록 선택하시면 됩니다.

    2. Visual Web Developer 2010 Express가 실행되면 초기 화면에서 새 프로젝트 만들기 링크를 클릭합니다.

    3. 아래에 표시된 대화 상자에서 왼쪽의 개발 범주를 Cloud로 선택하면 사용 가능한 프로젝트 템플릿 중에서 "Windows Azure 클라우드 서비스"가 나타납니다. 이 항목을 클릭하고, 프로젝트 이름을 원하는 이름 (여기서는 TwistBook이라고 하겠습니다.)을 지정한 후, "솔루션용 디렉터리 만들기"에 체크하고 "확인" 버튼을 클릭합니다.

    특별히 솔루션용 디렉터리 만들기에 체크가 되어있는지를 확인하는 이유는, 이 옵션이 Windows Azure Tools로 생성되는 프로젝트의 특성 상 한 솔루션 안에 다수의 프로젝트가 만들어지기 때문에 이를 정확하게 분류하기 위하여 사용하는 옵션으로, 사용하도록 맞추어져있을 때 좀 더 소스 코드 관리가 편리하기 때문입니다.

    4. 배포할 Windows Azure 응용프로그램 내에 배치될 Role의 종류와 유형을 설정하는 추가 프로젝트 마법사가 아래와 같이 나타납니다. (만약 아래 화면 대신 HTML 페이지로 안내 페이지가 나타나는 경우 Azure Tools가 올바르게 설치되지 않은 상태입니다.)

    5. .NET Framework 4 역할 그룹과 클라우드 서비스 솔루션 그룹 사이의 두 개의 버튼을 이용하여 실제로 제작할 프로젝트의 유형을 설정하고 프로젝트의 이름까지 정할 수 있습니다. 우선 ASP.NET MVC 2 웹 역할 프로젝트 한 개와 작업자 역할 프로젝트 한 개를 추가하겠습니다.

    6. 이제 각 프로젝트의 정확한 이름을 설정하기 위하여, 클라우드 서비스 솔루션 그룹 안에 추가된 프로젝트 중 MvcWebRole1 프로젝트 항목을 선택하면 연필 모양의 아이콘이 이름 옆에 나타납니다. 이를 클릭하면 아래와 같이 이름을 바꿀 수 있도록 편집 영역이 나타납니다. 이 예제에서는 다음과 같이 이름을 정하였습니다.

    - MvcWebRole1 => TwistBook.WebRole
    - WorkerRole1 => TwistBook.LinkProcessor

    이름을 편집하고 나면 아래와 같은 화면이 되어있을 것입니다. 확인 버튼을 눌러 프로젝트를 생성합니다.

    7. 프로젝트의 생성을 진행하다보면 Visual Studio 2010 Professional 이상의 버전에서는 다른 ASP.NET MVC 2 프로젝트와 마찬가지로 테스트 프로젝트를 만들것인지를 물어보는 대화 상자가 나타납니다. 빠른 설명과 간결한 진행을 위하여 테스트 프로젝트를 생성하지 않는 방향으로 이 예제에서는 진행하도록 하겠습니다. (필요하신 분들께서는 생성하셔도 됩니다.) Visual Web Developer 2010 Express Edition에서는 이러한 대화 상자가 따로 나타나지 않습니다.

    8. 프로젝트 생성이 끝나면 아래와 같이 솔루션 탐색기에 총 3개의 프로젝트가 열거됩니다.

    TwistBook 프로젝트는 Cloud Application 전체를 총괄하는 프로젝트이며, Cloud 환경에서 하나의 Application으로 분류됩니다. 이 프로젝트 안에 Web Role과 Worker Role이 다수 연결되는 구조로 되어있으며, 나중에 Cloud Service Package 파일 (CSPKG)로 컴파일될 때 이 프로젝트가 기준이 됩니다.

    TwistBook.WebRole 프로젝트는 ASP.NET MVC 2를 사용하도록 프로젝트가 구성되어있으며 여기에 기본적인 트위터 스타일의 방명록 UI를 표시하거나 인증된 사용자로부터 메시지를 입력받아 Worker Role에게 처리를 위임하는 등의 작업을 수행하도록 코드를 구성할 것입니다.

    그리고 TwistBook.LinkProcessor 프로젝트는 Web Role과는 따로 실행되는 개별적인 Role 인스턴스로서, Web Role에서 받아들이는 메시지 중 이미지 파일을 twitpic.com에 게시하여 짧은 URL을 받아온다거나, 본문에 있는 긴 URL을 짧게 만들어 받아오는것과 같이 처리량이 많이 몰렸을 경우 병목 현상을 일으킬 수 있는 기능만을 전담하도록 코드를 구성할 것입니다.

    자료 구조 만들기

    1. 클라우드 환경 내부 및 외부에서 기준이 될 모델 자료 구조를 만들기 위하여, 별도의 클래스 라이브러리를 작성하도록 하겠습니다. 솔루션 탐색기에서 솔루션 항목을 오른쪽 버튼으로 클릭하고 아래 그림처럼 새 프로젝트 추가 메뉴를 클릭합니다.

    2. 일반적인 클래스 라이브러리 프로젝트를 하나 만듭니다. 이름은 TwistBook.DataModel로 지정하고, Cloud 환경 위에서 사용하도록 현재 지정된 .NET Framework 4와 동일한 빌드 타겟이 지정되어있는지 확인한 후 프로젝트를 생성합니다.

    3. TwistBook.DataModel 프로젝트에 Windows Azure Table Storage에서 사용할 Data Context 클래스를 만들도록 하겠습니다. [각주:1]

    Data Context 클래스를 만들기 위해서는 Windows Azure SDK에서 제공하는 클래스 라이브러리 파일들을 TwistBook.DataModel 프로젝트 참조에 포함시켜야 합니다. 아래 그림과 같이 솔루션 탐색기에서 TwistBook.DataModel 프로젝트 아래의 참조 항목을 오른쪽 버튼으로 클릭하고 "참조 추가" 메뉴를 클릭합니다.

    4. 참조 추가 대화 상자가 나타나면, .NET 탭을 클릭합니다. 이 과정에서 비동기적으로 Visual Studio가 관리하는 디렉터리 목록 내에 있는 모든 어셈블리들을 조사하여 실시간으로 리스트 박스에 추가합니다. 이 샘플에서 필요로 하는 SDK의 라이브러리가 목록에 나타나기까지 조금 시간이 걸릴 수 있으며 시스템마다 차이가 있을 수 있지만 약 1분 이내에 나타납니다.

    5. 나타난 항목들 중에서 다음의 항목들을 찾아 키보드의 Ctrl 키를 누른채로 하나씩 클릭하면, 아래 그림과 같이 여러 대상을 선택하고 참조로 추가할 수 있습니다.

    * System.Data.Services.Client
    * Microsoft.WindowsAzure.StorageClient

    6. 아래 그림과 같이 참조 목록이 구성되어있으면 준비가 다 된것입니다. 이제 본격적으로 코드 작성을 시작해 보도록 하겠습니다. :-)

    7. 기본으로 만들어진 클래스가 담겨있는 Class1.cs 파일의 내용을 아래와 같이 작성합니다. 코드에서 핵심이 되는 부분을 굵게 표시하였습니다.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Microsoft.WindowsAzure.StorageClient; [각주:2]

    namespace TwistBook.DataModel
    {
        public class TwistModel : TableServiceEntity [각주:3]
        {
            public TwistModel()
            {
                DateTime current = DateTime.Now;
                PartitionKey = current.ToString("yyyyMMdd");
                RowKey = current.ToString("hhmmss"); [각주:4]

            }

            public string WriterName { get; set; }
            public string MessageBody { get; set; }
            public DateTime WrittenDate { get; set; }
            public string ImageUrl { get; set; } [각주:5]
        }
    }

    8. Class1.cs 파일의 이름을 클래스 이름과 동일하게 설정합니다. Windows 탐색기를 열지 않고, 아래의 그림에서처럼 솔루션 탐색기에서 직접 이름을 바꿀 수 있으며, Class1.cs 파일을 TwistModel.cs 파일로 이름을 변경합니다.

    9. TwistBook.DataModel 프로젝트에 Windows Azure Table Storage에서 사용할 Data Context 클래스를 만들도록 하겠습니다. 새 항목을 프로젝트에 추가하기 위하여 아래 그림과 같이 솔루션 탐색기에서 TwistBook.DataModel 프로젝트 항목을 오른쪽 버튼으로 클릭하면 "추가" - "새 항목 추가" 메뉴가 나타나는데 이를 클릭하시면 됩니다.

    10. 새 항목 추가 대화 상자에서 설치된 템플릿 영역에서 "Visual C# 템플릿"을 선택하고, 우측 목록에서 "클래스"를 선택합니다. 그리고 이름에 새로 추가할 클래스의 이름을 지정한 후 "추가" 버튼을 클릭합니다. 9단계와 10단계를 거쳐서 다음의 파일들을 추가로 생성합니다.

    * TwistDataServiceContext.cs
    * TwistDataSource.cs

    11. 솔루션 탐색기 내의 TwistBook.DataModel 프로젝트 항목 아래에 다음 그림과 같이 구성이 되어있으면 정상적으로 추가가 된 것입니다.

    12. 이제 TwistDataServiceContext.cs 파일을 열어서 다음과 같이 코드를 작성합니다. 코드에서 중요한 부분은 굵은 글씨로 표현하였고 여기에 따른 부가적인 설명을 각주로 붙였습니다.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Microsoft.WindowsAzure;
    using Microsoft.WindowsAzure.StorageClient; [각주:6]

    namespace TwistBook.DataModel
    {
        internal class TwistDataServiceContext : TableServiceContext [각주:7]
        {
            internal TwistDataServiceContext(CloudStorageAccount account)
                : base(account.TableEndpoint.AbsoluteUri, account.Credentials) [각주:8]
            {
            }

            internal const string TwistModelName = "TwistModel";

            public IQueryable<TwistModel> TwistModel [각주:9]
            {
                get { return this.CreateQuery<TwistModel>(TwistModelName); } [각주:10]
            }

        }
    }

    13. 이어서 TwistDataSource.cs 파일을 열어서 다음과 같이 코드를 작성합니다. 코드에서 중요한 부분은 굵은 글씨로 표현하였고 이에 따른 부가적인 설명을 각주로 붙였습니다.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Microsoft.WindowsAzure;
    using System.Data.Services.Client;
    using Microsoft.WindowsAzure.StorageClient; [각주:11]

    namespace TwistBook.DataModel
    {
        public class TwistDataSource
        {
            private static CloudStorageAccount storageAccount;
            private TwistDataServiceContext serviceContext;

            static TwistDataSource()
            {
                // 중요: 실제로 응용프로그램을 Cloud 환경에 배포할 때에는
                // Cloud Project 내의 다른 환경 설정 문자열을 이용하도록
                // 호출을 변경해야 합니다.
               storageAccount = CloudStorageAccount.DevelopmentStorageAccount; [각주:12]

               CloudTableClient.CreateTablesFromModel(
                    typeof(TwistDataServiceContext),
                    storageAccount.TableEndpoint.AbsoluteUri,
                    storageAccount.Credentials); [각주:13]

            }

            public TwistDataSource()
            {
                this.serviceContext = new TwistDataServiceContext(storageAccount); [각주:14]
                this.serviceContext.RetryPolicy = RetryPolicies.Retry(
                    3, TimeSpan.FromSeconds(1)); [각주:15]

            }

            public DataServiceResponse Insert(TwistModel model)
            {
                this.serviceContext.AddObject(
                    TwistDataServiceContext.TwistModelName,
                    model); [각주:16]

                return this.serviceContext.SaveChanges(); [각주:17]
            }

            public IEnumerable<TwistModel> Select()
            {
                var results = from eachTwist in this.serviceContext.TwistTable
                              select eachTwist; [각주:18]

                var query = new CloudTableQuery<TwistModel>(
                    results as DataServiceQuery<TwistModel>,
                    RetryPolicies.Retry(3, TimeSpan.FromSeconds(1))); [각주:19]

                return query.Execute(); [각주:20]
            }

            public DataServiceResponse Delete(TwistModel model)
            {
                this.serviceContext.AttachTo(
                    TwistDataServiceContext.TwistModelName,
                    model, "*"); [각주:21]

                this.serviceContext.DeleteObject(model);
                return this.serviceContext.SaveChanges();
            }
        }
    }

    Preface: ASP.NET MVC 2 Web Role에 대한 이해

    다음 Article의 내용을 올리기 전에, ASP.NET MVC 2에 대한 이해를 돕기 위하여 간단한 단락 하나를 구성하였습니다. ASP.NET MVC 2는 Microsoft의 최신 웹 기술이 적용된 프레임워크로 Windows Azure 개발 환경에서 뿐만 아니라 일반적인 웹 사이트 개발에도 얼마든지 활용될 수 있는 유용한 프레임워크입니다.

    TwistBook.WebRole 프로젝트의 노드를 솔루션 탐색기에서 살펴보면 아래와 같은 구성이 나타납니다. 이 구성은 전형적인 ASP.NET MVC 응용프로그램이며, 고전적인 웹 프로그래밍 모델에서와는 달리 직접 aspx 페이지를 부르지 않고 알기 쉬운 주소를 기반으로하는 것이 특징입니다. ASP.NET MVC 응용프로그램을 처음 접하시는 분들을 위하여 디렉터리 구조에 대한 설명을 잠시 말씀드립니다.

    App_Data: ASP.NET 응용프로그램이 데이터베이스에 연결하기 위하여 필요한 각종 코드 및 데이터베이스 연결 설정 파일들을 보관하는 디렉터리이며, ASP.NET 2.0부터 존재해왔던 디렉터리입니다. 예외적으로 이 디렉터리에는 Microsoft Access 파일 (*.mdb 또는 *.accdb)이나 소규모 웹 사이트를 위한 Embedding 가능한 SQL 데이터베이스 파일 (*.mdf 및 *.ldf)이 배치되기도 합니다.

    Content: ASP.NET MVC 응용프로그램 전반에 걸쳐서 사용되는 공통적인 클라이언트측 구성 요소 (가령 CSS 스타일 시트, XSLT 스타일 시트, 이미지 파일, 오디오 파일 등)가 이 디렉터리에 저장됩니다. 이 디렉터리에 저장된 파일들은 중간 처리기에 의하여 해석되지 않는 고유한 경로를 유지할 수 있습니다.

    [중요] Controllers: ASP.NET MVC 응용프로그램에서 "C"를 대표하는 구성 요소가 저장되는 디렉터리이며 백그라운드에서 웹 페이지를 그리거나, 웹 브라우저로부터 받아온 정보를 해석하거나, 가공하거나, 처리하는 제어 코드를 이곳에 배치합니다.

    [중요] Models: ASP.NET MVC 응용프로그램에서 "M"을 대표하는 구성 요소가 저장되는 디렉터리이며 주로 Controller 간의 통신, 데이터베이스와의 통신, 클라이언트로의 통신 등에서 기본 단위가 되는 데이터나 모델을 표현하는 클래스 코드를 이곳에 배치합니다. 이곳에 배치되는 코드에는 로직이 포함되지 않는 것을 원칙으로하며, 이곳에 배치되는 클래스들의 성격을 일반적으로는 POCO [각주:22] - 또는 - PONO [각주:23] (http://en.wikipedia.org/wiki/Plain_Old_CLR_Object)로 이해하면 쉽습니다.

    Scripts: Content 디렉터리와 유사한 성격의 디렉터리이지만 특별히 JavaScript 라이브러리들을 위하여 할당된 디렉터리로, ASP.NET MVC 2는 오픈 소스 기반의 JavaScript Framework인 jQuery를 기본으로 제공합니다. 만약 jQuery Plugin을 개발하였거나 사용하고자 하는 다른 Plugin이 있을 경우 - 또는 - jQuery 이외의 다른 JavaScript 라이브러리 (예: 네이버 jindo, script.aculo.us, Moo Tools, Google Web Toolkit, extJS, Dojo Toolkit, prototype, Yahoo! UI 등)를 이곳에 추가하면 됩니다.

    [중요] Views: ASP.NET MVC 응용프로그램에서 "V"를 대표하는 구성 요소가 저장되는 디렉터리이며 주로 Controller에 어떤 데이터를 전달할 것인지를 사용자에게 대화형으로 묻거나, Controller에 의하여 발생한 출력 결과를 사용자에게 대화형으로 전달할 때 사용하는 컨텐츠 파일들이 여기에 저장됩니다. ASP.NET MVC 2에서는 Web Forms와 Script Tag Expression을 기반으로 하는 뷰 엔진을 기초로 합니다. [각주:24]

    [중요] Global.asax: ASP.NET MVC에서 매우 중요한 구성 요소로 지금 작업하는 ASP.NET 응용프로그램이 ASP.NET MVC 엔진에 의하여 처리되어야 함을 지정하고 초기 설정을 구성하는 코드가 여기에 포함되어있습니다. 이 파일이 누락되거나 내용이 잘못되어있을 경우 ASP.NET MVC 응용프로그램으로서 동작하지 않음을 유의해야 합니다. 추가적으로 사이트 내에 다른 영역을 구성하거나, 다른 주소 패턴을 확장해야 할 경우에도 이 파일에 내용을 추가해야 설정이 적용됩니다.

    [중요] Web.config: ASP.NET 응용프로그램의 환경 설정 파일로 역시 이 파일의 내용에 문제가 있거나 누락되어있을 경우 ASP.NET MVC 응용프로그램이 올바르게 동작하지 않을 수 있음을 주의해야 합니다.

    [중요] WebRole.cs: ASP.NET 응용프로그램과는 무관하나, Windows Azure 환경에서 Web Role이 초기에 기동될 때 필요한 설정을 포함하고 있으며, 클라우드 컴퓨팅 환경에서의 실질적인 진입점이 됩니다. 이 클래스가 없을 경우 응용프로그램 실행에 문제가 있을 수 있습니다.

    다음 시간에는

    다음 시간에는 ASP.NET MVC 2 기반의 Web Role을 작성하고, 테이블 스토리지에서 실제로 데이터를 조회하거나 추가, 변경, 삭제하는 예시를 들어보도록 하겠습니다. 긴 강좌 읽어주셔서 감사하며, 즐거운 여름 휴가 되십시오. 감사합니다. :-)

    강좌에 대한 고칠 부분, 의견, 제안 등은 남정현의 클라우드 & 닷넷 블로그 (http://www.rkttu.com/), 트위터 (@rkttu), 전자 메일 (rkttu nospam rkttu dot com)을 통하여 항상 받고 있습니다. 언제든 의견 주시면 감사하겠습니다. :-)

    1. 이 샘플에서 Windows Azure Storage를 이용하는 방향으로 설명이 되어있지만, 실제로 여러분이 개발할 Windows Azure 서비스에서는 SQL Azure나 다른 곳에 배치되어있을 고가용성의 관계형 데이터베이스 시스템 (예: SQL Server 2008 R2)을 이용하는 것이 더 좋을 수 있습니다. [본문으로]
    2. Windows Azure SDK와 함께 제공되는 Table Storage를 위한 API가 포함되어있는 네임스페이스입니다. [본문으로]
    3. TableServiceEntity 클래스를 상속받도록 자료 구조를 만들어야 SDK를 이용하여 Table Storage에 데이터를 저장하거나 가져올 수 있습니다. [본문으로]
    4. TableServiceEntity 클래스의 기능을 적용하기 위하여 동일한 시그니처를 가진 생성자를 하나 만듭니다.&#10;&#10;Table Storage의 접근 효율성을 위하여, 테이블은 여러 개의 파티션으로 구분됩니다. 이 샘플에서 파티션의 분리 단위로 "날짜"를 사용하였습니다.&#10;&#10;그리고 파티션 내에서 각각의 Entity가 고유한 의미를 가질 수 있게 하기 위하여 Row Key를 사용하여 구분합니다.&#10;&#10;Partiton Key와 Row Key가 더해져서 테이블 내에서는 이 Entity가 "유일할 수 있다"는 특성을 보장합니다. [본문으로]
    5. WriterName Property는 작성자의 이름, MessageBody Property는 메시지 본문, WrittenDate Property는 작성한 날짜와 시간을, ImageUrl Property는 같이 첨부하는 사진의 URL을 보관하는 목적으로 사용됩니다.&#10;&#10;C# 3.0 이후로 지원되는 단축 Property Getter/Setter 선언으로 별도의 private 멤버 변수를 배치하지 않고 이와 같이 단순한 코드를 만들 수 있습니다. [본문으로]
    6. Windows Azure SDK와 함께 제공되는 Table Storage를 위한 API가 포함되어있는 네임스페이스입니다. [본문으로]
    7. LINQ를 이용하여 손쉽게 데이터를 가져오거나 설정할 수 있도록 LINQ의 설정을 확장해주는 기본 추상 클래스입니다. [본문으로]
    8. CSCFG 파일 상의 정보를 표현하는 객체인 CloudStorageAccount를 생성자에서 인자로 받아 이 객체를 초기화하고, Windows Azure Storage와의 연결을 초기화합니다. [본문으로]
    9. 지연 실행을 목적으로 하는 질의 객체를 생성합니다. 지연 실행이란, 각각의 요소를 다룰 필요가 있을 때 식을 계산하고 평가하는 방식으로, 전체의 내용을 미리 메모리에 읽어들여서 처리하는 것과는 차이가 있습니다.&#10;&#10;이 객체는 앞서 우리가 정의한 TwistModel 클래스를 트랜잭션의 단위로 사용하도록 SDK 내의 프레임워크에서 생성됩니다. [본문으로]
    10. 주의: 엔티티 클래스의 이름, ServiceContext에서 노출하는 프로퍼티의 이름, CreateQuery 메서드에 전달하는 테이블 명의 이름이 모두 같아야 혼선없이 올바르게 동작할 수 있음을 보증할 수 있습니다. [본문으로]
    11. LINQ to Azure Table Storage를 활용하는데에 필요한 클래스 및 원격 데이터 액세스에 필요한 클래스들이 굵게 강조 표시한 3개의 네임스페이스 안에 모두 포함되어있습니다. [본문으로]
    12. 현재는 실제 Windows Azure Storage 계정을 지정하지 않고 Local Development Storage 계정을 대신 지정합니다. [본문으로]
    13. 테이블 모델을 생성할 때 사용할 기준이 될 DataContext 클래스를 선택하고, 생성을 요청합니다. 이 때 접속할 대상 스토리지의 HTTP 주소와 자격 증명 정보도 한꺼번에 지정합니다.&#10;&#10;또한, 이 작업은 TwistDataSource 클래스를 프레임워크에서 로드할 때 한 번만 발생할 수 있도록 유도하기 위하여 정적 생성자에 정의하였습니다. 테이블의 초기 구조를 할당하는 작업은 자주 일어날 필요가 없는 작업이기 때문에 성능 상의 이득을 위하여 이와 같이 작성합니다. [본문으로]
    14. 서비스 객체를 초기화합니다. 앞에서 가져온 계정 정보를 사용하여 복원된 계정 정보 객체를 사용하여 초기화하고 있다는 점을 확인하십시오. [본문으로]
    15. 혹시 있을지 모르는 장애에 대해 좀 더 완벽한 대비를 위하여, 재시도 정책을 설정할 수 있습니다. (이 부분은 매우 중요한 개념입니다.) 첫 번째 인자에는 재시도 횟수, 그리고 두 번째 인자에는 재시도 간격을 TimeSpan 객체를 이용하여 지정할 수 있습니다. 여기서는 처음 실패가 발생한 시점을 기준으로 3회 더 시도하며 각 시도 간격은 1초로 정합니다. [본문으로]
    16. 전형적인 LINQ to Entity 서비스와 마찬가지로 AddObject를 이용하여 객체의 참조를 기반으로 새로운 데이터를 추가할 수 있습니다. [본문으로]
    17. 트랜잭션 개념을 기본적으로 사용하므로 SaveChanges 메서드는 삽입, 변경, 삭제 작업이 있은 직후에는 반드시 병행되어야 합니다. [본문으로]
    18. Windows Azure Table Storage에 전송할 Query를 지연된 실행을 위한 객체로 초기화합니다. 이 문장이 실행되었다고해서 곧바로 데이터가 수집되는 것은 아닙니다. [본문으로]
    19. Windows Azure Table Storage에 실제로 Query를 전송할 클라이언트 객체를 초기화하고, 이 객체의 재시도 정책도 추가로 정의할 수 있습니다. 여기서도 3회 재시도, 매 시도마다 1초 간격을 두기로 설정합니다. [본문으로]
    20. 비로소 이 부분에서야 실제 전송과 데이터 수집이 발생하게 됩니다. [본문으로]
    21. Table Storage에서 객체를 삭제할 때에는 삭제를 위하여 검색할 대상을 지정해야 하며 이 때 사용하는 것이 AttachTo 메서드입니다. 이 메서드를 이용하여 어떤 테이블에서 어떠한 유형의 데이터를 검색할 것인지를 서비스 객체에 지정합니다. [본문으로]
    22. Plain Old CLR Object (Plain Old Java Object; POJO를 응용한 줄임말) [본문으로]
    23. Plain Old .NET Framework Object (Plain Old Java Object; POJO를 응용한 줄임말, POCO와 동일한 의미의 다른말) [본문으로]
    24. 이 글을 작성하는 시점에서 ASP.NET MVC 3에서 기본으로 채택될 예정인 Razor View Engine이 새로 발표되었습니다. Razor View Engine은 Web Form을 대체하는 ASP.NET MVC 전용의 View Engine 시스템을 뜻합니다. [본문으로]
    저작자 표시 비영리 동일 조건 변경 허락
    신고

    안녕하세요. Visual C# MVP 남정현입니다.

    정규 강좌를 올리기 전에, 몇 가지 Windows Azure에 관련된 국내외 소식을 종합하는 업데이트 아티클들을 올려봅니다. 이번 업데이트에 반영된 내용들은 Windows Azure를 개발 플랫폼으로 택하시는 데에 있어서 중요한 정보들을 많이 포함하고 있습니다.

    1. Windows Azure Tools for Visual Studio 1.2, Windows Azure SDK 1.2, Windows Azure Platform Training Kit 2010.06 업데이트 및 Windows Azure Tools 한글화!

    Windows Azure Tools for Visual Studio, Windows Azure SDK, Windows Azure Platform Training Kit의 새 버전이 출시되었습니다. 이번 버전에서 가장 중점적으로 개선된 것은 Visual Studio 2010과의 연동과 .NET Framework 4.0에 대한 지원이며, 특히 최근에 중국어 간체, 중국어 번체, 일본어, 한국어 등 영어 이외의 다수 언어를 위한 Language Pack까지 같이 업데이트된 것이 주목할만한 점입니다. 아직 정식 Windows Azure 서비스가 출시되지는 않았지만 개발 도구에 대한 준비가 좀 더 완벽해진 것은 반길만한 일입니다. 이에 대한 자세한 내용은 http://www.rkttu.com/410 를 참고해주십시오.

    2. Windows Azure AppFabric 2010.07 업데이트 및 SDK 출시

    Windows Azure Tools for Visual Studio 1.2와 Windows Azure SDK 1.2 출시와 더불어서 Windows Azure AppFabric의 새 버전이 업데이트되었습니다. 이번 버전에서는 모바일 및 웹 브라우저 기반의 클라이언트 및 Microsoft Silverlight, Adobe Flash 기반의 RIA 클라이언트에서 직접 Service Bus나 Access Control에 접근할 수 있도록 개선된 것이 가장 큰 주안점입니다. 특히 RIA 클라이언트에서 AppFabric Service Bus나 Access Control에 접근하는데에 있어서 가장 큰 장애 요소였던 Cross Domain Policy에 대한 지원이 추가되었습니다. 더불어서 Windows Azure AppFabric SDK의 이번 버전에서는 .NET Framework 4.0에 대한 지원이 추가되었습니다. 좀 더 자세한 내용은 http://www.rkttu.com/414 를 참고하여 주십시오.

    3. Codename: Dallas @ WWPC2010 업데이트

    Codename: Dallas는 Windows Azure Platform과 더불어서 같이 제공되는 새로운 유형의 데이터 공급자 서비스로 각종 프리미엄 통계 자료, 뉴스, 동향 등의 정보를 ATOM, XML, Open Data Protocol 등의 데이터 형식을 이용하여 손쉽게 가져올 수 있습니다. 현재 확정된 데이터 공급사 (NASA, National Geographic, Associated Press, Zillow.com, Weather Central, NAVTEQ 등)외에도 아래의 그림에서 언급하는 추가 제공사들을 포함하여 올해 4분기에 Codename: Dallas가 정식 서비스로 전환될 예정에 있으며, 8월 중에 새로운 UI를 포함하는 CTP가 런칭될 예정이라고 합니다. 이에 대한 원문 기사는 http://blogs.msdn.com/b/zaneadam/archive/2010/07/12/news-on-microsoft-codename-dallas-at-wwpc-2010.aspx 에서 확인하실 수 있습니다.

    4. Windows Azure Platform Appliance 발표

    그 동안 Windows Azure Platform 자체는 전형적인 Public Cloud Platform으로서 잘 알려져있었고, 이에 대한 Counter Product로 Hyper-V나 System Center 등의 제품군이 Private Cloud Platform으로 소개되는 일이 많았습니다만 Windows Azure Platform의 기술 자체를 Private Cloud Platform화 하는데에 필요한 새로운 제품을 런칭하였습니다. 좀 더 자세한 정보는 http://www.rkttu.com/412 에서 확인하실 수 있습니다.

    다음 강좌부터는 한글화된 Windows Azure Tools for Visual Studio 2010을 기반으로하는 Twitter Style의 Azure Guestbook 만들기 Walkthrough 강좌를 진행할 예정입니다. 많은 관심 부탁드립니다. :-)

    I'd like to thank all those who have believed in and supported me. - a digression about Imagine Cup 2010

    [수정] 누락된 이미지 파일을 추가하였습니다.

    저작자 표시 비영리 동일 조건 변경 허락
    신고

    안녕하세요. Visual C# MVP 남정현입니다. 지난번 글 (2010/06/04 - [Visual Studio 2010/Visual Studio 2010] - Just for fun! / Visual Studio Express Edition)에 이어서, Just for fun! 연재의 마지막인 DreamSpark에 대한 이야기를 오늘 아티클에서 해보고자 합니다. DreamSpark가 개설된지는 꽤 오랜 시일이 지났습니다만 아직 어떻게 접근해야 할지, 어떤 혜택을 받을 수 있는지 잘 모르시는 분들이 많은듯 하여 아티클을 작성해봅니다.

    DreamSpark에 대한 소개 및 제공되는 리소스들

    DreamSpark는 Microsoft의 Spark 프로그램 시리즈 중 하나이며, 웹 비지니스 활성화를 위한 WebSiteSpark 프로그램, 초기 창업 지원 및 기업 활성화를 위한 BizSpark 프로그램이 있습니다. 그리고 DreamSpark는 학생들의 IT 기술력 향상을 위하여, 기존에 제공되어오던 MSDN Academic Alliance (http://msdn.microsoft.com/ko-kr/academic/default.aspx)와는 별도로 전역적으로 일반화하고 확대한 프로그램입니다.

    DreamSpark를 통해서 2010년 6월 현재 제공받을 수 있는 소프트웨어 솔루션 및 혜택들은 다음과 같습니다. 다음은 한글판까지 같이 제공되는 소프트웨어 솔루션들의 목록입니다.

    • Visual Studio 2010 Professional Edition (* 한글판 제공됨)
    • Windows Server 2008 R2 Server Standard Edition (* 한글판 제공됨)
    • Expression Studio 3 (* 한글판 제공됨)
    • Visual Studio 2008 Professional Edition (* 한글판 제공됨)
    • Windows Server 2008 Server Standard Edition (* 한글판 제공됨)
    • SQL Server 2008 Developer Edition (* 한글판 제공됨)
    • SQL Server 2008 Express Edition (* 한글판 제공됨)
    • Visual Basic 2008 Express Edition (* 한글판 제공됨)
    • Visual C# 2008 Express Edition (* 한글판 제공됨)
    • Visual C++ 2008 Express Edition (* 한글판 제공됨)
    • Visual Web Developer 2008 Express Edition (* 한글판 제공됨)
    • Visual Studio 2005 Professional Edition (* 한글판 제공됨)
     
    그 외에 추가적으로 제공되는 소프트웨어들은 다음과 같습니다.

    • Visual Studio 2010 Express Edition
    • Windows Mobile 6.5 SDK
    • Windows Phones Developer Tools CTP
    • XNA Game Studio 3.1
    • Robotics Developer Studio 2008 R3
    • Windows Embedded CE 6.0
    • Virtual PC 2007 
    • Concurrency and Coordination Runtime and Decentralized Software Services Toolkit 2008 R2
    • Windows Server 2003 Standard Edition

    DreamSpark를 통하여 기본적인 운영 체제와 개발 도구를 다운로드받아서, 여러분이 원하는 소프트웨어나 웹 사이트를 손쉽게 개발하고 디자인할 수 있습니다. Microsoft Imagine Cup 대회에 참가하기 위하여 필요한 소프트웨어를 모두 이곳에서 가져오실 수 있으며, 학생 벤처를 시작하고자 하시는 분들께도 충분한 기술적인 리소스들을 모두 이곳에서 가져오실 수 있습니다.

    DreamSpark 등록하는 방법

    DreamSpark에 등록하는 방법은 크게 세 가지가 있습니다. DreamSpark 무료 쿠폰을 받으신 경우 (1), 국제학생증 (International Student Identification Card - ISIC)을 소지하고 계신 경우 (2), DreamSpark에 관리자가 기관을 등록한 경우 (3)로 나눌 수 있습니다. 이 세 가지 중 하나로 해당이 되시는 경우, Windows Live ID를 통하여 로그인을 하신 후, Verification 과정을 거치면 됩니다. 각 다운로드 항목 별로 페이지에 Verify 버튼을 클릭하신 후, 국가를 Korea로 선택하시고, 학생 인증으로 접속하기 위하여 Verify as a Student 라디오 버튼 항목을 클릭합니다.
     
    (1) DreamSpark 무료 쿠폰을 받으신 경우: 아래 그림에서처럼 "I have an Activation Code" 라디오 버튼 항목을 클릭하고, Activation Code 입력란에 쿠폰에 적힌 Activation Code를 입력하고 Verify 버튼을 클릭하면 인증이 완료됩니다. 단, 중복 사용이 제한되거나 유효 기간, 유효 횟수가 있는 쿠폰의 경우 Activation Code를 재 사용할 수 없을 수도 있습니다.


    (2) 국제 학생증을 가지고 계신 경우: 국제 학생증을 취급하는 대학 교육 기관의 경우 이 옵션을 사용할 수 있습니다. 국제 학생증을 취급하지 않더라도 국내외 여러 국제 학생증 발급 기관 (예: 하나은행, 한국씨티은행 등)을 통하여 약간의 수수료를 지불하고 다양한 목적으로 국제 학생증을 발급받아 혜택을 누리실 수도 있습니다.

    참고: ISIC 코드를 입력할 때에, 일부 ISIC 카드의 경우 제일 마지막 자릿수를 제외하고 입력해야 하는 규칙이 따를 수 있습니다. 저의 경우, 인하대학교 학생증과 겸용해서 발급되는 ISIC 카드의 경우 이러한 규칙이 적용됩니다.

    (3) DreamSpark 서비스에 등록된 기관에서 재학중이신 경우: 이 경우 해당 기관 내의 재학생임을 증명할 수 있는 수단을 사용하여 접속할 수 있습니다. 해당 기관 내에서 자체적으로 SSO (Single Sign On) 서비스를 Windows Live ID 기반으로 구현하였을 경우 이를 이용하시면 됩니다. 만약 별도의 SSO 서비스가 없을 경우 해당 기관에서 제공하는 메일 서비스를 경유하여 인증을 완료하실 수 있습니다.

    Continue 버튼을 클릭하여 계속 진행하면 다음과 같은 페이지가 나타납니다.

    위의 화면에서 해당하는 기관을 선택하고, Continue 버튼을 클릭합니다. 아래의 링크를 클릭하시면 2010년 7월 현재 DreamSpark에 등재된 기관들의 목록을 보실 수 있고, Ctrl + F 키를 이용하여 해당 기관명을 검색하실 수 있습니다.

    2010년 7월 현재 DreamSpark 등록 기관

     

    해당 기관 내의 구성원 - 또는 - 학생임을 인증하기 위하여, 해당 기관에서 운영 중인 전자 메일 서비스의 계정과 주소를 이곳에 기재해야 합니다. 예를 들어, 메일 서비스의 도메인이 rkttu.com 일 경우, E-mail Address에 anonymous@rkttu.com 과 같이 기재할 수 있으며, Confirm E-mail Address에 다시 한번 같은 메일 주소를 기재하면 됩니다. 기재가 끝나면 Verify 버튼을 클릭하여 추가 절차를 진행합니다.

    DreamSpark는 대학생 여러분들을 위한 솔루션입니다.

    Verification 과정을 완료하고 다운로드를 할 때에는 Internet Explorer 뿐만 아니라 Firefox, Chrome 등 여러분이 원하는 브라우저를 이용하여, 별도의 Download Manager를 이용하거나, 직접 웹 브라우저를 이용하여 다운로드하거나 자유롭게 이용하실 수 있습니다. 참고로, Internet Explorer를 이용하여 직접 브라우저로 다운로드하게 되는 경우, 단일 파일의 크기가 4GB 이상인 파일을 다운로드받을 수 없다는 점만 유의하시면 되겠습니다.

    소프트웨어 개발이나, IT 기술을 개발하기 위하여 더 이상 불법 다운로드 서비스를 이용하지 마세요. DreamSpark를 통하여 최신 기술을 항상 편리하게 이용하고, 손쉽게 다운로드받으실 수 있습니다. 그리고, DreamSpark와 더불어서 비 정기적으로 진행되는 Windows 및 Office의 대학생 할인 프로모션 프로그램도 자주 있으니 최신 소프트웨어와 IT 기술의 혜택을 편리하게 가져가실 수 있으면 좋겠습니다.

    감사합니다. :-)

    저작자 표시 비영리 동일 조건 변경 허락
    신고

    Hello Windows Azure / Windows Azure Tools for Visual Studio 1.2 출시

    Cloud 2010.06.14 19:00 Posted by 남정현 (rkttu.com)

    안녕하세요. Visual C# MVP 남정현입니다. 본 강좌를 올리기 전에 일종의 공지 사항 겸 소개를 위하여 이 글을 먼저 올리게 되었습니다. 얼마전에 Windows Azure Tools for Visual Studio 1.2 (2010년 6월 업데이트)가 새롭게 출시되었습니다. 메이저 버전도 아니고 마이너 버전인데 이와 같이 별도의 글을 써서 올리는 이유는, 다름이 아니라 Windows Azure Tools for Visual Studio의 기능에 많은 변화가 있었기 때문입니다.

    Windows Azure SDK 1.2에서는 최근 발표된 .NET Framework 4.0 런타임을 내장한 Windows Azure OS 2010년 4월 버전에 대한 요구 사항을 모두 반영하고 있습니다. .NET Framework 4.0 기반의 응용프로그램을 작성 중이신 분들도 이제는 Windows Azure 환경 위에서 직접 응용프로그램을 호스팅할 수 있습니다. 그리고, Visual Studio 2010에서 새로 추가된 향상된 디버깅 기법인 IntelliTrace를 직접 지원하기 때문에 이전보다 더욱 쉬운 디버깅이 가능합니다.

    다음은 Windows Azure Tools for Visual Studio 1.2의 변경 사항들입니다.

    • Visual Studio 2010 RTM 지원: Visual Studio 2010 RTM 버전을 지원합니다.
    • .NET Framework 4.0 지원: 이제는 .NET Framework 3.5와 4.0을 빌드 타겟으로 동시에 지정할 수 있습니다. 단, 4.0을 빌드 타겟으로 지정하게 되는 경우, Windows Azure OS의 이미지 중 2010년 초반의 일부 버전은 사용할 수 없습니다.
    • Cloud storage explorer 추가: 읽기 전용 기능이 지원되는 Windows Azure Table 및 BLOB 컨테이너 보기 프로그램이 서버 탐색기 패널을 통하여 제공됩니다. SQL Azure를 데이터베이스 목록에 추가하고 동시에 관리할 수 있어 편리합니다.
    • 통합 배포 환경: 솔루션 탐색기에서 Windows Azure 프로젝트를 오른쪽 버튼으로 클릭하여 'Publish' 메뉴를 클릭하면 이제는 직접 배포가 가능합니다. 이전 1.0 및 1.1 버전의 경우, CSPKG 파일과 CSCFG 파일이 생성된 디렉터리의 폴더가 Windows 탐색기에서 열리고, Windows Azure Portal Web Site가 웹 브라우저로 열렸기 때문에, 브라우저에서 로그인하고 여러 단계에 걸쳐서 배포할 파일을 찾아가야했기 때문에 Deploy 절차가 복잡했습니다. 통합 배포 환경에 대해서는 본 강좌의 말미에 한 번 다룰 수 있도록 하겠습니다.
    • 서비스 모니터링: 서비스의 상태를 웹 제어판이 아닌 "서버 탐색기"의 compute 노드에서 실시간으로 모니터링할 수 있습니다.
    • IntelliTrace 기능 지원: Visual Studio 2010을 사용하는 경우, IntelliTrace 기능을 Windows Azure 서비스에 배포한 이후에 "직접" 사용할 수 있습니다. 이 기능은 앞에서 설명한 통합 배포 환경의 일부로 동작하며, 배포가 끝난 이후에 자동으로 이 기능이 시작되어 서비스 모니터링과 함께 실시간으로 로그가 모니터링됩니다.

    그간 Windows Azure 기반의 개발이 어려우셨다면 이제는 최신 버전의 SDK와 개발 도구를 이용하여 좀 더 편안하게 Visual Studio 2010을 통해 클라우드 기반 응용프로그램 개발을 시작해보세요. 이러한 기능들은 모두 Windows Azure가 제공하는 Management REST API를 기반으로 작성된 것이며, REST API의 Specification들은 모두 문서화되어있으므로, 누구나 쉽게 응용할 수 있습니다.

    참고로 Visual Studio 2010의 데이터베이스 탐색기는 SQL Azure 데이터베이스에 대한 탐색도 지원하므로 이전처럼 별도의 SSMSE를 필요로 하지 않습니다. 그리고 이번 버전의 SDK 역시 1.0과 1.1과 마찬 가지로 처음 설치하는 경우에는 OS와 개발 도구의 환경에 따라 패치와 핫 픽스들을 적용하셔야 합니다.

    참고로, IntelliTrace 기능은 Visual Studio 2010 Ultimate에서만 사용이 가능합니다. Visual Web Developer 2010 Express에서는 기본적인 Deploy 기능만이 지원됩니다.

    다운로드 바로가기

    저작자 표시 비영리 동일 조건 변경 허락
    신고

    Hello Windows Azure / Understanding Windows Azure Development Process

    Cloud 2010.06.07 09:00 Posted by 남정현 (rkttu.com)

    지난번 글 (http://www.vsts2010.net/313)에 이어서, 오늘은 Windows Azure 기반의 응용프로그램을 작성하는 과정에 대해서 실습하고 기본적인 이해를 더하는 내용을 살펴보도록 하겠습니다. 지난번 글에서 언급한 모든 구성 요소들이 설치되고, 관련된 패치들도 설치가 되어야 Windows Azure 기반의 응용프로그램 개발을 시작할 수 있음을 다시한번 말씀드립니다.

    Windows Azure 개발 과정에서의 각 구성 요소들에 대한 이해

    Windows Azure 위에서 호스팅될 응용프로그램을 개발하는 과정에서, 여러가지 구성 요소들이 필요합니다. 그리고 이러한 구성 요소들은 상당히 유기적으로 작용하게 되는데요, 겉으로 보기에는 복잡하지만 나름대로의 이유와 규칙들이 있습니다. 이번 장에서는 이러한 세부적인 내용들을 조명해보기로 하겠습니다.

    우선, 지난번 글에서 언급한 Windows Azure Tools for Visual Studio의 역할을 살펴보겠습니다. Windows Azure Tools for Visual Studio는 이름에서 알 수 있듯이 Visual Studio와 연동하여 Visual Studio를 이용하여 손쉽게 응용프로그램을 개발하고 테스트할 수 있는 수단을 제공해줍니다. Visual Studio 2008과 Visual Studio 2010에 대한 연동 기능을 제공하고, 프로젝트 템플릿과 Visual Studio 확장 기능을 제공해주는 것이 주된 역할입니다. 그리고, Windows Azure SDK도 같이 설치해줍니다.

    Windows Azure SDK는 실제 클라우드 컴퓨팅 환경과 최대한 비슷하게 기능을 재현하는 Emulation Service와 Windows Azure의 핵심 API, 클라우드 환경에서 응용프로그램 패키지를 쉽게 배포할 수 있도록 해주는 Package Builder를 제공합니다. Windows Azure SDK의 핵심 기능만 잘 이해하고, 활용할 수 있어도 Windows Azure 기반의 응용프로그램 개발은 이미 절반 이상 안 것이나 다름 없습니다.

    실제로 실습을 하다보면 느끼시게 되겠지만 (특히 이전에 Windows Mobile이나 Windows Phone Series 7 기반의 개발 환경을 경험해보신 분들께서는 쉽게 이해할 수 있을 것입니다) Windows Azure의 개발 환경은 모바일 응용프로그램의 개발과 상당히 유사한 Perspective를 보여줍니다. 실제로 응용프로그램을 실행할 장치와 환경은 별도의 위치에 존재하지만, 그 이전까지 충분히 테스트를 해볼 수 있는 에뮬레이터와 모의 API 집합, 그리고 이에 관련된 문서들을 받아서 개발할 수 있다는 점이 비슷합니다. 다른 점이 있다면, 모바일이 아닌 전체 버전의 Windows Server를 기반 OS로 사용하는 응용프로그램을 개발한다는 점이 되겠습니다.

    Windows Azure SDK를 이용하여 개발된 프로그램은 확장자가 CSPKG인 파일과 CSCFG인 파일로 최종 결과물이 나타납니다. CSPKG 파일은 몇 가지 기본적인 메타데이터와 함께 Windows Azure Fabric Controller를 통하여 배포할 수 있는 Binary Image가 담겨있는 (여기서의 Binary Image는 PE 파일 형식이 아닙니다. DLL의 형태도 아니고 EXE의 형태도 아닙니다.) ZIP 형식의 파일이고, CSCFG 파일은 XML의 형태를 띄고 있는 응용프로그램 전체에 대한 설정 파일입니다. 이 두 개의 파일을 Windows Azure Portal을 통하여 배포하게 되면 모든 처리 과정이 Windows Azure에 의해서 이루어지게되고 여러분의 서비스가 사용 가능한 상태로 진입하게 되는 것입니다.

    Visual Web Developer 2010 Express로 Windows Azure 응용프로그램 개발 시작하기

    앞서 설명드렸던 것처럼, Windows Azure 개발 환경을 Visual Studio와 함께 구축하셨을 경우에는 에뮬레이션 환경까지 같이 제공이 됩니다. 여기서 두 가지 선택을 할 수 있습니다.

    에뮬레이션 환경에서 테스트하고 디버깅하는 과정을 거칠 필요가 있는 경우: 대부분의 경우 여기에 해당됩니다. 이 경우, 에뮬레이션 환경이 정상적으로 시스템에 설치되고 기동되기 위하여 Visual Studio 2008이나 Visual Studio 2010을 관리자 권한으로 "권한 상승"시킨 상태에서 시작해야 합니다.

    간단하게 코드를 수정한 후 단순히 CSPKG, CSCFG 파일을 제작하기 위한 경우: 이 경우에는 관리자 권한으로 "권한 상승"한 상태에서 시작하지 않아도 무방합니다.

    관리자 권한으로 권한 상승 시킨 상태에서 Visual Studio를 실행하는 경우, 일반적으로는 문제되지 않습니다. 하지만 다른 응용프로그램과 OLE 방식 (Drag & Drop과 같은 유형의 통신)으로 상호 작용하는 데에 문제가 있을 수 있습니다. 이러한 기능을 자주 사용하시거나, 프로그래밍하는 시간이 오래 걸리신다면 권한 상승을 하지 않고 먼저 완벽하게 프로그래밍을 끝낸 후 다시 관리자 권한으로 권한 상승시킨 후에 시작하여도 좋습니다.

    관리자 권한으로 권한 상승하는 방법은 다음과 같습니다.

    혹은, 관리자 권한 상승을 매번 사용하도록 고정시킬 수 있습니다. Windows Azure 기반 응용프로그램 개발을 집중적으로 활용하실 때에는 이 방법을 적용하시는 것도 좋습니다.

    Note 1: 만약 Windows Azure Tools for Visual Studio를 설치하지 않은 상태에서 Cloud Project를 만들면?

    기본으로 제공되는 개발 환경이 아니기 때문에 간혹 Visual Studio나 Visual Web Developer Express만 설치하고 Cloud Project를 생성하게 될 때가 있는데요, 걱정하지 않으셔도 됩니다. 아직 Tool과의 연동이 되지 않았다면 아래와 같이 Enable Windows Azure Tools 항목이 나타나며, 이를 이용하여 프로젝트를 생성하면 안내 웹 페이지를 포함하는 기본 문구가 나타납니다.

    단순히 아래의 웹 페이지에서 Download Windows Azure Tools 버튼을 클릭하고, 다운로드 페이지에서 필요한 소프트웨어들을 모두 내려받아 설치하면 됩니다. (이 때, Visual Studio나 Visual Web Developer는 종료되어야 합니다.)

    그리고 정상적으로 설치가 되었다면, 각 언어 별 (Visual C#, Visual Basic .NET, Visual F#)로 Cloud Category 아래에 Windows Azure Cloud Service 프로젝트 템플릿 항목이 보일 것입니다.

    Note 2: 설치 시작과 동시에 혹시 아래와 같은 오류 메시지가 보이세요?


    Installation Requirements:

    These versions of Windows Azure SDK and Windows Azure Tools for Microsoft Visual Studio 2008 and Windows Azure Tools for Microsoft Visual Studio 2010 are already installed.  If the Windows Azure Cloud Service project templates are missing from Visual Studio, please uninstall the Windows Azure Tools and run this installer again.

    내용인즉 그렇습니다. Windows Azure Tools는 일반적인 Windows Installer 기반의 응용프로그램이나 Visual Studio Installer 기반의 응용프로그램처럼 In-place Update가 (아마도 아직은) 지원되지 않습니다. 문제가 있어서 재설치하는 경우, 새 버전이 발표되어 재설치하는 경우, Visual Studio와 Visual Web Developer 중 어느 한쪽에 먼저 설치하고 나중에 추가 설치하게 되는 경우 모두 기존에 설치된 Windows Azure Tools를 먼저 제거한 후 다시 설치해야 합니다.

    Windows Azure Tools로 프로젝트 만들어보기

    이제 Windows Azure Tools를 이용하여 프로젝트를 시험삼아 만들어보겠습니다. Windows Azure Cloud Service 프로젝트 항목을 이용하여 프로젝트를 생성하면 아래의 화면과 같이 별도의 프로젝트 생성 마법사가 나타납니다. 여기서 필요한 만큼 Worker Role과 Web Role, 각 Role에서 사용할 언어, Role의 성격을 정의할 수 있습니다. Visual Studio 2008의 경우 사용 가능한 언어가 C#과 VB.NET으로 제한되고, Visual Studio 2010의 경우 C#과 VB.NET 외에 Worker Role에 한하여 F#도 사용할 수 있습니다.

    추가하기를 원하는 프로젝트 템플릿의 종류를 좌측 Roles 목록에서 선택하고, ">" 버튼을 클릭하여 Cloud Service Solution 목록에 추가합니다. 여러 언어를 동시에 추가하고 관리할 수 있으며 필요하지 않을 것 같은 프로젝트는 우측에서 항목을 선택한 후 "<" 버튼을 클릭하여 다시 제거할 수 있습니다. 아래는 선택의 예시입니다. 일반적으로, 대표 Web Role 하나와 여러 개의 Sub Worker Role의 조합을 많이 사용합니다.

    프로젝트의 이름을 지정하기 위하여, 우측 목록에서 이름을 바꾸기 원하는 항목을 선택하고, 마우스가 항목 위에 롤 오버 되었을 때 나타나는 우측의 연필 모양 아이콘을 클릭하면 이름을 바꿀 수 있는 입력란이 나타나게 됩니다. 이 때 원하는 이름을 입력하면 됩니다. 모든 설정이 아래와 같이 끝이 났다고 하였을 때 OK 버튼을 클릭하여 프로젝트를 생성합니다.

    이제 아래와 같이 프로젝트가 생성되는 것을 보실 수 있습니다.

    위의 그림에서 주황색 사각형으로 강조 표시한 파일들이 각각의 Role에서 핵심이 되는 파일들입니다. Worker Role은 백그라운드 작업을 중심으로 구성되는 프로그램이기 때문에 프로그램의 시작을 직접 프로그래밍 코드로 구현하는 것이 주가 되며, Web Role은 처음 보여줄 웹 페이지를 정의하는 일이 주가 되기 때문입니다. 그리고 우측의 솔루션 탐색기에서 파란색 사각형으로 강조 표시한 항목이 우리가 나중에 Windows Azure에 프로그램을 배포할 때 사용하는 핵심 단위 프로젝트입니다. 이 프로젝트를 정상적으로 표현하고 기능을 활용할 수 있기 위한 것이 Windows Azure Tools for Visual Studio의 주된 역할입니다.

    다음 시간에는

    다음 시간부터는 Windows Azure 기반의 응용프로그램에서 가장 고른 기능 사용 분포를 보여주는 트위터 스타일의 방명록 응용프로그램을 단계별로 작성하는 과정을 설명하도록 하겠습니다. Windows Azure Storage의 Queue, BLOB, Table을 사용하도록 구성되어있으며, SQL Azure를 이용하여 사용자 인증을 수행하기까지 하는 과정을 종합적으로 다루게 될 것입니다.

    감사합니다. :-)

    저작자 표시 비영리 동일 조건 변경 허락
    신고

    Just for fun! / Visual Studio Express Edition

    Visual Studio 2010 2010.06.04 09:00 Posted by 남정현 (rkttu.com)

    새로운 버전의 Visual Studio가 출시되었지만, 설치하는데 시간도 오래 걸리고 새로운 기능을 일일이 테스트해보기 어려우신 분들이 많으실 것입니다. 혹은, Imagine Cup과 같은 IT 경진 대회를 준비하시는 학생 여러분들은 적당한 소프트웨어 개발 도구를 찾을 수 없어 고민이 크실 수 있습니다. 오늘 강좌에서는 이러한 고민을 덜어줄 가볍고 편리한 Visual Studio의 새 버전을 소개해드릴까 합니다.

    그 주인공은 바로 Express Edition 입니다. Visual Studio Express Edition은 지난 Visual Studio 2005부터 지속적으로 업데이트되고 있는, 이제는 Microsoft Visual Studio Family의 중요 멤버로 자리잡은 주요 제품군 중 하나가 되었습니다. Express Edition이라는 이름에서 알 수 있듯이, 개발자들에게 가장 핵심적인 Subset을 제공하는 버전입니다. 하지만 그 기능은 "절대 빈약하지 않습니다."

    Visual Studio Express Editon은 Visual Studio .NET 2002/2003 제품군이 발표될 무렵까지 유지되어왔던 개별 언어 제품군들에 대한 새로운 묶음 패키지입니다. Visual Basic .NET, Visual C#, Visual C++, Visual Web Developer를 주축으로 하며, 여기에 부수적으로 SQL Server의 Express Edition까지 항상 같이 제공되어왔었습니다. Visual Studio 2005 시절에는, 지금은 지원이 중단되었지만 Visual J#에 대한 Express Edition도 제공되었던 적이 있었습니다.

    왜 Express Edition인가?

    Visual Studio Express Edition은 단지 공짜로 제공되는 프리웨어이기 때문에 가치가 있는 것은 아닙니다. Microsoft가 발표하는 주요 최신 기술들을 재빨리 시험해볼 수 있는 훌륭한 플랫폼으로 Express Edition의 역할이 점차 옮겨가고 있으며, 대표적인 예가 바로 Visual Studio Express Edition for Windows Phone 7입니다. 그리고 XNA Framework 역시 Express Edition을 기초로 모든 SDK를 제공해왔었습니다.

    저 개인적으로는 Express Edition을 매우 애용합니다. Express Edition은 프로토 타이핑 프로그래밍을 할 수 있도록 여러분의 Mental Model을 바꾸어줍니다. Visual Studio를 이용하여 프로그래밍을 시작하는 것은, 사용하는 시스템의 종류에 따라서는 또 하나의 새로운 운영 체제를 로딩하는것과 같은 기분을 느끼게 하여 부담스러울 수 있습니다. 하지만, 전체 기능을 로드하지 않고서 필요한 프로그래밍 언어에 해당되는 IDE만을 로드하기 때문에 훨씬 로딩 속도도 빠릅니다. 그리고, C#과 VB.NET의 경우, 프로젝트를 임시 디렉터리에 생성하는 것을 기본으로 하기 때문에, 여러분의 프로젝트 디렉터리가 지저분해질 걱정을 하지 않고 작은 코드와 프로그램을 시험해보기 위하여 망설임없이 IDE를 켤 수 있습니다. 만약 프로젝트를 실제로 작성하기를 원치 않는다면, 프로젝트를 닫을 때 나타나는 저장 여부 대화 상자에서 단순히 "버리기" 버튼만 클릭하면 됩니다.

    LINQPad (http://www.linqpad.net/), Small Basic (http://www.microsoft.com/downloads/details.aspx?FamilyID=61481b74-eb45-42b8-a777-8f3644406787&DisplayLang=ko)과 같은 유틸리티와 다른점을 언급해본다면, 역시 이러한 유틸리티들은 IDE가 아닌, 간단한 도구의 수준 안에 있습니다. 하지만 이러한 도구들로는 충족하기 힘든, 그러나 정식으로 프로젝트를 만들고 코드를 Organizing하는데에 노력이 필요하지 않은 정도의 임시 코드를 작성하고 편안하게 테스트할 수 있는 환경을 찾으신다면 그것이 Express Edition의 역할이라 할 수 있겠습니다.

    Express Edition에 관한 몇 가지 중요한 질문과 답변들

    아래의 질문 목록들은 Express Edition을 선택하고 활용하는 데에 몇 가지 중요한 기준들이 될 수 있습니다.

    A. 불법 소프트웨어 단속에 걸리지 않는 완전한 프리웨어인가? 

    예. 다만, 30일 이내에 Windows Live ID를 사용하여 완료할 수 있는 무료 등록 절차를 통하여 Serial Number를 받아 프로그램에 등록해야 합니다. 30일 이후에도 등록되지 않은 상태로 남아있으면 프로그램 시작 시 등록을 하지 않으면 실행되지 않도록 프로그램이 변경됩니다.

    B. Express Edition을 이용하여 상용 소프트웨어를 개발할 수 있는가?

    예. 또한, 오픈 소스 라이선스 (GPL, LGPL, MPL, BSD 등)를 대상으로 하는 소프트웨어 프로젝트에서도 Express Edition을 사용하는데에 아무런 제약이 없습니다.

    C. Crystal Report나 Microsoft Report Designer가 제공되는가?

    아니오. 제공되지 않습니다.

    D. Visual C++ Express Edition의 경우 MFC나 ATL 프로젝트를 생성하고 GUI를 디자인할 수 있는가?

    아니오. MFC나 ATL 프로젝트를 새로 생성하는 기능이 없고, GUI 디자인도 제약이 있습니다. 단, Visual Studio 2010 Professional 이상에서 작성한 Visual C++ Project를 Express Edition에서 기본적인 수준에서 열거나 편집하거나 빌드하는 것에는 환경 설정이 정확하다면 문제가 없습니다.

    E. Express Edition을 이용하여 Silverlight Project나 Windows Azure Application을 만들 수 있는가?

    예. Silverlight Tools와 Windows Azure Tools 모두 Visual Web Developer의 기능 집합을 이용하여 SDK가 설치되므로 Visual Web Developer Express Edition을 설치하면 Silverlight와 Windows Azure 응용프로그램을 개발할 수 있습니다.

    F. Windows Installer 프로젝트를 생성할 수 있는가?

    아니오. 다만 ClickOnce 기능은 Visual Basic .NET Express Edition과 Visual C# Express Edition 모두 지원됩니다.

    G. 여러가지 서로 다른 종류의 프로젝트를 한 솔루션 안에 포함할 수 있는가?

    아니오. 교차 언어 지원은 Express Edition 이상의 버전 (예: Standard / Professional)에서부터 지원됩니다. 다만, 같은 언어끼리 한 솔루션 안에 여러 프로젝트를 생성하고 관리하는 것에는 문제가 없습니다.

    Visual Studio 2010 Express Product Feature Chart

    아래의 차트를 확인하시면 Visual Studio 2010 Express Edition이 실제로 지원하는 기능들에 대하여 좀 더 직관적으로 이해하실 수 있습니다. (출처: http://www.microsoft.com/express/Downloads/#2010-Visual-Web-Developer)

    Visual Studio Express Edition 설치하기

    Visual Studio Express Edition을 설치하려면 http://www.microsoft.com/express 에 방문한 뒤 Download 링크를 클릭하여 원하는 제품을 선택하여 웹 설치 마법사를 다운로드하거나, 전체 버전의 DVD ISO 이미지 파일을 다운로드하여 ISO 마운트 프로그램을 이용하여 설치 프로그램을 오프라인에서 실행하는 방법이 있을 수 있습니다. 이 글을 작성하는 현 시점에서 Express Edition에도 한국어 버전이 추가되어, Visual Studio 2010과 .NET Framework 4.0의 최신 기능을 빠르고 간편하게 테스트해보실 수 있습니다.

    각각의 제품을 설치하신 뒤에는 30일 이내에 제품 등록을 하셔야 합니다. 제품 등록 이전에는 "평가판"이라는 문구가 나타나지만 등록을 한 이후에는 정품으로 변환되기 때문에 걱정하지 않으셔도 됩니다. 등록하는 과정에서 Windows Live ID가 필요합니다.

    Express Edition 화면 미리 보기

    확대

    마지막으로 제안 한 가지

    Internet Explorer 6.0을 사용하지 말자는 제안은 정말 널리 퍼져있고, 이제는 어느정도 Internet Explorer 6.0이 왜 문제가 되는지 충분히 공감대가 형성되어있습니다. 하지만, Visual C++ 컴파일러는 어떤가요? 아직도 6.0을 사용하고 계신가요?

    서비스 팩 6를 설치했다고 할지라도 Visual C++ 6.0은 Internet Explorer 6.0보다 훨씬 더 오래된 제품입니다. http://en.wikipedia.org/wiki/Visual_C%2B%2B 페이지의 설명에 따르면 Visual C++ 6.0은 1998년에 발표된 제품이고, 이 글을 작성하는 현 시점에서 생각해보면 무려 12년이나 된 제품입니다. http://archvista.net/1328 에서 소개하는 것 처럼, 아직도 Visual C++ 6.0을 사용하신다면 여러분은 12년 묵은 우유를 드시는것과 다름이 없습니다.

    이 글을 보시게 될 수도 있을 전산학부 교수님, 조교님, 그리고 학생 여러분들께 부탁드립니다. Visual C++ 6.0에 대한 라이선스를 가지고 있다는 이유만으로, 바꾸기 귀찮다는 이유만으로 과제를 검사하고 테스트하지 말아주십시오. 10년이면 강산도 바뀌는 세월입니다. Visual C++ 컴파일러도 업그레이드가 필요합니다. 전체 버전을 이용하지 않더라도, Visual Studio 2008 또는 2010 Express Edition이 충분한 솔루션이 될 수 있습니다.

    긴 글 읽어주셔서 감사합니다. 즐거운 하루 되세요. :-)

    저작자 표시 비영리 동일 조건 변경 허락
    신고

    Hello Windows Azure / Windows Azure 개발 환경의 구축

    Cloud 2010.06.03 09:00 Posted by 남정현 (rkttu.com)

    지난번 글 (http://vsts2010.net/303)에 이어서 오늘부터는 Windows Azure 기반 응용프로그램을 개발하기 위한 본격적인 실습 위주의 글을 시리즈로 연재하게 되었습니다. Windows Azure 기반의 응용프로그램을 개발하는 방법은 여러 가지가 있을 수 있습니다만 Visual Studio 2010을 활용하여 Windows Azure 기반의 응용프로그램을 개발하는 것에 관한 내용을 중심으로 블로그를 연재할 예정임을 미리 밝혀둡니다.

    Windows Azure 기반 응용프로그램 개발을 위한 필요 사양 요약

    • 필요한 운영 체제: Windows Vista, Windows 7, Windows Server 2008, Windows Server 2008 R2를 지원합니다. Windows 2000, Windows XP에서는 개발하실 수 없습니다.
    • 필요한 구성 요소: IIS 7.x (ASP.NET, WCF HTTP 활성화, 정적 컨텐츠, CGI 기능이 필요합니다.)
    • 필요한 개발 도구: Visual Studio 2008 SP1, Visual Web Developer 2008 Express SP1, Visual Studio 2010, Visual Web Developer 2010 Express 중 하나가 필요합니다. 이 글에서는 Visual Web Developer Express 2010을 택하여 설명을 드리겠습니다.
    • 필요한 데이터베이스: SQL Server 2005 Express 이상의 데이터베이스
    • 주의 사항: Visual Studio, Visual Web Developer의 모든 CTP, RC, Beta 버전 및 .NET Framework의 CTP, RC, Beta 버전을 설치 전에 완전히 제거하여 주십시오.
    • 팁: 배포 후 호환성 문제를 최소화하기 위하여, Windows Azure 기반 응용프로그램을 개발할 때에는 64비트 버전의 Windows Vista, 7, Server 2008, Server 2008 R2를 이용하여 개발하시는 것을 권장합니다. 64비트 버전의 Windows를 가지고 있지 않은 경우 32비트 버전의 개발 환경을 이용하더라도 문제는 없습니다.

    Visual Web Developer Express 2010으로 시작하는 Windows Azure 개발 환경 구축

    Visual Web Developer Express 2010은 학생, 프로그래밍 입문자, 아마추어 개발자 등을 위하여 제공되는 Visual Studio의 무료 버전입니다. 그러나, 상용 목적으로 소프트웨어 개발을 하는 동안에도 자유롭게 제한없이 이용하실 수 있으며, 전체 버전의 Visual Studio 2010을 구입하기 이전에 Visual Studio 2010이나 최신 기술을 빠르게 테스트해보기 위한 목적으로도 이용이 가능합니다. 이번 글에서는 Visual Web Developer Express 2010을 이용하여 개발 환경을 구축하는 과정을 보여드리도록 하겠습니다.

    Windows Vista / 7에서 기본 환경 설정하기

    1. 시작 메뉴를 클릭하고 프로그램 및 파일 검색란에 아래와 같이 appwiz.cpl을 입력한 후 Enter 키를 누릅니다. Windows Vista를 사용 중이시고, 고전 메뉴를 사용 중이신 경우 키보드의 Windows 키와 R 키를 동시에 눌러 나타나는 실행 대화 상자에서 같은 방법으로 실행할 수 있습니다.

    Windows 7에서 실행

    Windows Vista에서 실행

    2. 아래의 화면에서, Windows 기능 사용/사용 안함 항목을 클릭합니다. 사용자 계정 컨트롤 설정에 따라 최소 한 번 이상 관리자 권한이 필요함을 승인해야 하는 대화 상자가 나타날 수 있습니다.

    3. Windows 기능 대화 상자에서, Microsoft .NET Framework 3.5.1 항목 아래의 Windows Communication Foundation HTTP Activation 항목을 체크합니다. 그리고, 아래의 이어지는 그림에서와 같이, 인터넷 정보 서비스 항목 아래의 응용프로그램 개발 기능 아래의 "ASP.NET"과 "CGI", 일반적인 HTTP 기능의 "정적 콘텐츠" 항목을 체크한 후, 확인 버튼을 클릭하여 설정을 적용합니다.

    Windows Server 2008 / 2008 R2에서 기본 환경 설정하기

    1. 시작 메뉴를 클릭하고 프로그램 및 파일 검색란에 아래와 같이 appwiz.cpl을 입력한 후 Enter 키를 누릅니다. Windows Vista를 사용 중이시고, 고전 메뉴를 사용 중이신 경우 키보드의 Windows 키와 R 키를 동시에 눌러 나타나는 실행 대화 상자에서 같은 방법으로 실행할 수 있습니다.

    2. 아래의 화면에서, Windows 기능 사용/사용 안함 항목을 클릭합니다. 이 기능을 이용하여 설정을 변경하기 위해서는 관리자 계정 - 또는 - 대행 계정으로 시스템에 접속한 상태여야 합니다.

    3. 서버 관리자 콘솔이 나타나면, 오른쪽 트리뷰에서 기능 항목을 오른쪽 버튼으로 클릭합니다. 그 후 나타나는 팝업 메뉴에서 "기능 추가" 메뉴를 클릭합니다.

    4. 기능 추가 마법사에서 .NET Framework 3.5.1 기능 항목 아래의 WCF 활성화 항목의 HTTP 활성화를 체크합니다. 이미 설치되어있는 경우, 체크된 상태로 비활성화된 항목이 보입니다. 다음 버튼을 클릭하여 진행하거나, 이미 설치되어있는 경우 취소 버튼을 클릭하여 마법사를 종료할 수 있습니다. 시스템을 다시 시작해야 할 경우, 다시 시작한 다음 5단계로 이동합니다.

    5. 이제 웹 서버로서의 역할을 추가하기 위하여 역할 항목을 오른쪽 버튼으로 클릭하고, 역할 추가 메뉴를 클릭하여 역할 추가 마법사를 시작합니다. 시스템을 다시 시작하도록 권고 받았지만 재시작하지 않았을 경우 재시작을 안내하는 대화 상자가 나타날 수 있습니다.

    6. 이어지는 두 화면에서처럼 웹 서버에 대한 역할이 구성되어있는지 확인 후, 웹 서버 역할 항목이 설치되어있지 않은 경우 체크하여 설치를 진행합니다. 이미 설정되어있는 경우 비활성화된 상태로 나타나므로 이 경우에는 마법사를 그냥 종료하면 됩니다.

    Visual Web Developer 2010 다운로드 및 설치

    Visual Web Developer 2010은 Windows Azure 기반 응용프로그램 개발을 위하여 사용할 수 있는 무료 개발 도구입니다. Visual Web Developer 2008의 경우 Service Pack 1 이상을 포함한 버전을 다운로드하여 사용할 수 있습니다. 더불어서, Silverlight Tools 역시 Visual Web Developer를 기반으로 맞추어진 개발 도구이기 때문에 같이 설치하여 사용하면 Microsoft의 최신 웹 기술의 혜택도 같이 얻을 수 있습니다.

    Visual Web Developer 2010 Express를 다운로드하려면 http://www.microsoft.com/web 에서 다운로드 가능한 Web Platform Installer를 설치해야 합니다. 이 프로그램을 설치하고 난 후에 시작 메뉴에 아래 그림과 같이 바로 가기 메뉴가 생성되며, 언제든 이 메뉴를 이용하여 최신 웹 제품이나 널리 사용되는 웹 어플리케이션을 다운로드할 수 있습니다.

    Web Platform Installer를 시작하면 아래와 같은 화면이 나타납니다. 여기서, 웹 플랫폼 탭을 선택하고, 도구 섹션으로 이동하여 사용자 지정 링크를 클릭합니다.

    아래와 같이 개발자 도구 그룹이 나타나면 여기서 Visual Web Developer 2010 Express 체크 박스를 선택합니다. 필요한 경우, WCF RIA Services Toolkit과 Silverlight Toolkit 등을 같이 설치하여 Windows Azure Web Role 개발 때 같이 적용할 수 있습니다.

    설치 버튼을 누르면 이후의 모든 설치 과정을 Web Platform Installer가 대행하여 처리하고 그 결과를 보여줍니다. 설치 과정 중에는 관리자 권한이 필요하며, 사용자 계정 컨트롤이 설정된 시스템에서는 한 번 이상 관리자 권한 요청에 대한 승인이 필요할 수 있습니다.

    개발자를 위한 설치: Windows Azure Tools for Visual Studio 설치하기

    Windows Azure SDK와 함께 Visual Studio에 연동하기 위한 환경을 구축하려면, Windows Azure Tools for Visual Studio를 선택하여 설치하면 됩니다. 이 설치 패키지 안에 Windows Azure 환경을 Emulation하기 위한 SDK까지 모두 포함되어있으므로 간단히 설치를 완료할 수 있습니다. 이 글을 작성하는 현 시점에서 2010년 2월 버전이 가장 최신의 SDK이며, http://www.microsoft.com/downloads/details.aspx?FamilyID=5664019e-6860-4c33-9843-4eb40b297ab6&displaylang=en 페이지에서 다운로드 가능합니다.

    만약 단순히 만들어진 Windows Azure Package를 Local Machine에서 테스트하기 위하여 환경을 구축하고자 하는 경우에는 아래의 "테스트 환경을 위한 설치: Windows Auzre SDK 설치하기" 절을 참조하여 주십시오. 64비트 버전의 Windows Server 2008 환경에서 Cloud Application을 미리 테스트하는 시나리오에서 유용할 수 있습니다.

    테스트 환경을 위한 설치: Windows Azure SDK 설치하기

    Windows Azure 환경에서는 Windows Server 2008 R2 x64를 기본 운영 체제로 사용합니다. 만약 상호운용성 등의 복잡한 요구 사항을 필요로 하는 클라우드 기반 응용프로그램의 경우, 이 운영 체제와 동일한 환경에서 Windows Azure SDK만을 설치하여 Windows Azure Tools로 제작된 배포용 패키지 파일을 실제로 Windows Azure Cloud Environment에 게시하기 전에 올려보는 것은 문제를 사전에 진단하고, 디버깅을 하는데에 무척 유리한 전략이 될 수 있습니다.

    http://www.microsoft.com/downloads/details.aspx?FamilyID=dba6a576-468d-4ef6-877e-b14e3c865d3a&displaylang=en 페이지에서 이 글을 작성하는 현 시점의 최신 버전인 2010년 2월 버전의 SDK를 설치할 수 있습니다.

    Windows Azure SDK 설치 후 필요한 추가 구성 확인하기

    Windows Azure 환경을 위하여 최적화된 운영 체제와 플랫폼을 이용하기 때문에, RTM 버전으로 출시된 운영 체제와 환경 설정과는 구분되는 점이 몇 가지 있습니다. 아래는 Windows Azure 환경에 특화하기 위하여 변경된 설정을 로컬 / 개발자 컴퓨터에서 재현하기 위한 패치들로 원활한 개발과 테스트를 위해서는 반드시 설치해야 하는 패치들입니다.

    다음 시간에는

    다음 글에서는 본격적으로 Windows Azure Tools for Visual Studio를 이용하여 프로젝트를 만들고, 샘플 응용프로그램을 만들고 테스트하는 과정을 실습해보도록 하겠습니다. 궁금하신 점이나 어려운 점은 rkttu nospam rkttu dot com - 또는 - twitter at rkttu 에서 이야기하실 수 있습니다.

    감사합니다. 즐거운 하루 되십시오. :-)

    저작자 표시 비영리 동일 조건 변경 허락
    신고