블로그 이미지
내게 능력 주시는 자 안에서 내가 모든것을 할수 있느니라 - 빌립보서 4 : 13 - happydong

카테고리

Happydong (1363)
프로그래밍 (156)
MUSIC (16)
인물 (3)
Utility (10)
세미나 소식&내용 (22)
IT뉴스 (18)
운동 (830)
CAFE (10)
Life (282)
Total
Today
Yesterday




이 내용은 월간 Web에 2010년 03월호에 기고했던 내용 입니다!!

[바로가기]
실전활용!! - WCF RIA Services 알아보자 (1)
실전활용!! - WCF RIA Services 알아보자 (2)
실전활용!! - WCF RIA Services 알아보자 (3)



Silverlight(실버라이트) 프로젝트를 하면서 늘 고민 되었던 부분이 바로 데이터처리 관련이 었을 것이다. 어떻게 데이터를 주고, 받고 할 것인지에 대한 고민은 개발자들에게 늘 있는 문제일 것이다. 물론, 필자 또한 이런 고민을 피할수 없었다.

 

실버라이트는 다양한 방법으로 데이터를 주고 받을수 있도록 구성 되어있다. 다들 알고 있겠지만, Web Service를 통해서 데이터를 주고 받을수 있으며, WCF Service, AJAX 등등 여러가지 방법으로 데이터를 주고 받을수 있음을 아마 여러 프로젝트를 통해서 경험했거나, , 온라인 강좌 등에서 익혔을 것이라 생각이 든다. 이번 연재 내용에서 소개할 WCF RIA Service는 기존의 데이터 통신 방법들 보다 개발 생산성이 좋으며, 여러가지 장점이 있어 소개해 보고자 한다. 그렇다고해서 꼭 실버라이트 애플리케이션을 만들 때 WCF RIA Service로만 작업하는라거는 절대 아니다. 상황에 따라 프로젝트의 성향에 따라 적절히 통신방법을 간구해서 개발하면 좋을 것이다.

 

 

WCF RIA Services 이해

 

 WCF RIA Service를 이야기 하기 앞서 기존의 데이터 통신 방법에 대해서 잠깐 이야기해보려 한다. 기존에는 실버라이트와 데이터를 통신하기 위해서 보통 Web Service WCF Service는 이용해서들 작업하셨으리라 생각이 든다. 물론 필자 또한 WCF Service를 이용해서 주로 개발을 했다. 보통은 이렇게 Web Service 또는 WCF Service를 노출시켜두고 해당 서비스에서 CRUD(Create, Read, Update, Delete) 메소드를 직접 구현해 놓고, 이 서비스를 실버라이트 애플리케이션에서 서비스 참조추가를 통해 연결시켜 데이터를 주고 받았을 것이다. 여기서 끝이나면 문제가 없는데, 상황에 따라 서비스를 변경하거나, 서비스를 다시 퍼블리시(Publish)할 경우가 생기면 여러가지 귀찮은 작업을 해야한다. 먼저, 서비스를 새로 퍼블리시해서 IIS에 올리고 잘 작동하는지 확인후 실버라이트 애플리케이션에서 참조되어 있는 서비스를 다시 업데이트를 해야하고, 이를 다시 재 배포를 해야한다. 이런 작업이 한번만에 끝나면 좋으련만 프로젝트를 진행하다보면 그렇지 않은 경우가 정말 많다.

 

 WCF RIA Service는 위와 같은 문제를 간단하게 해결해주고 있다 . WCF RIA Service는 기본적으로 층(Tier)화해서 개발하도록 하고 있다. 이는 .NET 개발자들에게 익숙한 내용일 것이라 생각이 든다. 클라이언트 층(View Layer)와 데이터 로직을 담당하는 서버층(Business Layer)를 나눠어 개발을 해서 관리하기가 편하고, 따로 서비스 참조를 걸어 주는 것이 없어서 수정시 위와 같은 복잡한 절차를 걷히지 않고, 실버라이트 애플이케이션만 배포하면 되기 때문에 유지보수도 편한면이 있다.

 

[그림1] WCF RIA Services 구조

 

위 그림은 WCF RIA Service의 통신 방법을 보여 주고 있는 모습인데,Web Service와 통신도 가능하지만,  비즈니스(Business)로직과 바로 통신도 가능하다. 이는 도메인서비스클래스(Domain Service Class)를 이용해야 한다. 이 내용은 아래 예제를 통해서 알아 보도록 하겠다.

 

 

WCF RIA Services 사용

 

먼저, WCF RIA Service를 사용하기 위해서는 Silverlight.net 사이트에서 WCF RIA Services Beta를 받아야 할것이다. 물론, 실버라이트4를 위한 WCF RIA Services Preview도 있다. 현재 개발환경에 맞는 것으로 다운로드 받아 설치해서 사용하면 될 것이다. 필자는 실버라이트 3 환경이기때문에 Beta버전을 받아 사용하고 있다. 

[그림2] 다운로드 사이트

 

WCF RIA Services를 설치하면 특별하게 템플릿이 추가되는게 아니여서 제대로 설치가 된 것인지 잘 모를것이다. 정상적으로 설치가 되었는지 확인하는 방법은 비주얼 스트디오(Visual Studio)에서 실버라이트 프로젝트를 생성하면 아래와 같은 창이 나타날 것이다.

 

[그림3] 프로젝트 생성관련 창

 

 위 창에서 Enable .NET RIA Services라고 체크 항목이 나타나면 정상적으로 설치 된것이다. .NET RIA Services WCF RIA Services의 이전 이름이다. 이름에 혼돈이 없으시길 바라며, 위 창에서 모르고 체크하는 것을 깜박하고 프로젝트를 생성해 버렸다면, 실버라이트 프로젝트 속성(Properties)에서 .NET RIA Services 를 해당 웹프로젝트로 설정해주면 된다.

[그림4] 실버라이트 프로젝트 속성(Properties)


Posted by happydong
, |






 제이쿼리(JQuery)에서는 간단하게 HTML객체의 스타일(Style)속성을 추가, 삭제가 손쉽게 가능해 정말 편한 것 같다. 이는 제이쿼리에서 제공하는 addClass함수와 removeClass함수를 이용하면 되는데, 이를 간단하게 아래예제를 통해서 알아 보도록 하자!

먼저, 실행되는 결과 모습을 보자면, 아래 그림과 같다.

사용자 삽입 이미지

 [그림1-1 스타일 추가]


사용자 삽입 이미지

[그림1-2 스타일 삭제]
(예제 소스 참고: jQuery 1.3 (위키북스) 책 참고)

 위 그림과 같이 기본 스타일에 스타일 적용 버튼 클릭(또는 페이지로드) 이벤트시 주요 내용에 하이라이트(highlight) 영역으로 변경되도록 한것이다. 이는 CSS 스타일을 변경한 것인데... CSS는 아래와 같다.

alice.css

body

{

    font: 62.5% Arial, Verdana, sans-serif;

} 

 ... 중간 생략 ...

/* 하이라이트 스타일 */

.highlight

{

    font-style: italic;

    border: 1px solid #888;

    padding: 0.5em;

    margin: 0.5em 0;

    background-color: #ffc;

}


 위 코드는 하이라이트 스타일을 정의한 부분이다. 차후에 버튼을 클릭하거나, 페이지로드 이벤트시 바로 이 스타일을 적용할것이다. (기본은 적용이 안되있음.)


alice.js

/* 페이지 로드시...*/

$(document).ready(function() {

    AddStyle();

});

 

/* 스타일 삭제*/

function RemoveStyle() {

    $('.poem-stanza').removeClass('highlight');

}

 

/* 스타일 추가*/

function AddStyle() {

    $('.poem-stanza').addClass('highlight');

}


 위 코드는 스크립트를 정의한 내용이다. 주석을 통해서 간단하게 설명을 달아 놨으니, 이해하는데 도움이 될것이라 생각이 든다. ".poem-stanza"는 스타일을 지정한 class명이다. 즉, ".poem-stanza"을 찾아서 addClass함수, 또는 removeClass함수를 통해 해당 "highlight"스타일로  추가/삭제하는 내용인것이다. 아래 HTML 페이지를 참고하면 이해가 쉽지 않을까 생각이 든다.


HTML

<div>

 중간 생략

 

<div class="poem">

            <h3 class="poem-title">

                JABBERWOCKY</h3>

            <div class="poem-stanza">

                <div>

                    'Twas brillig, and the slithy toves</div>

                <div>

                    Did gyre and gimble in the wabe;</div>

                <div>

                    All mimsy were the borogoves,</div>

                <div>

                    And the mome raths outgrabe.</div>

            </div>

        </div>

    </div>

    <div style="margin:10px 0 0 0;">

    <input type="button" value="스타일 적용" onclick="AddStyle();" />

    <input type="button" value="스타일 삭제" onclick="RemoveStyle();" />


위 코드를 보면 버튼이 두개가 있고, 버튼을 클릭했을 때 해당 스크립트를 호출할수 있도록 되어있다. 그리고 하이라이트가 되어저야 할부분에 DIV태그로 감싸져있고, class명으로 "poem-stanza"로 선업되어 있다. 위에서도 설명했듯 버튼을 클릭하는 순간 해당 "poem-stanza"를 찾아 스타일을 추가/삭제하는 것이다.

기존에는 스타일을 적용하려면 여러가지로 귀찮게 스크립트를 짜주어야 했는데, 제이쿼리를 이용하니 간단하게 해결되어 편한것 같다.
Posted by happydong
, |



이 내용은 월간 Web에 2010년 02월호에 기고했던 내용 입니다!!

[바로가기]
실전활용!! - Flickr API를 이용한 포토갤러리 만들기 (1)
실전활용!! - Flickr API를 이용한 포토갤러리 만들기 (2)
실전활용!! - Flickr API를 이용한 포토갤러리 만들기 (3)



ㅁ 플리커(Flickr) 인증된 사진 읽어 오기

 

 위에서 로그인 인증이 끝났다고 가정하고 내 사진을 읽어 오는 내용을 확인 해보도록 하자.

 

public class FlickrAPIHelper

{

// Flickr API 기본 URL

private readonly string BASEURL = "http://api.flickr.com/services";

 

    // Flickr API Key

private readonly string APIKEY = "942f52t78731e43193733e57a9f3c281";

 

    // Flickr API Password

private readonly string SECRET = "7deb809rd20t748c";

 

// 내 포토 반환 URI를 반환합니다.

public string GetMyPhoto(string token, string nsID, int currentPage, int count)

    {

            string temp = string.Format("{0}api_key{1}auth_token{2}extrasowner_name,date_upload,tagsmethodflickr.photos.searchpage{3}per_page{4}user_id{5}", this.SECRET, this.APIKEY, token, currentPage.ToString(), count.ToString(), nsID);

            string apiSig = GetMd5String(temp);

            string uri = string.Format("{0}/rest/?method=flickr.photos.search&api_key={1}&page={2}&per_page={3}&extras=owner_name,date_upload,tags&auth_token={4}&user_id={5}&api_sig={6}", this.BASEURL, this.APIKEY, currentPage.ToString(), count.ToString(), token, nsID, apiSig);

            return uri;

    }

private string GetMd5String(string value)

{

            return MD5.GetMd5String(value);

}

}

[코드 5] FlickrAPIHelper 클래스

 

 필자는 FlickrAPIHelper 클래스를 만들어서 사용하였다. GetMyPhoto 메소드는 플리커 API를 호출하기 위한 URL를 만들어 주는 부분이다. GetMyPhoto 메소드의 파라미터는 token(로그인 인증 토큰), nsID(로그인 인증), currentPage(읽어 올 페이지), count(읽어 올 데이터 수)로 구성이 되어 있다. [코드 5] 메소드를 통해서 반환 받은 URL를 호출해 보면 아래와 같은 XML 데이터를 받아 오게  되는데 이를 LINQ to XML로 파싱해서 데이터 클래스에 채워서 뷰에 바인딩 걸어 주면 된다.

 

<?xml version="1.0" encoding="utf-8" ?>

<rsp stat="ok">

  <photos page="1" pages="1" perpage="20" total="12">

    <photo id="3923974847" owner="36183292@N03" secret="29d7979bc9" server="3424" farm="4" title="안기승선생님" ispublic="1" isfriend="0" isfamily="0" ownername="kdw8751" dateupload="1253061170" tags="" />

    <photo id="3924760930" owner="36183292@N03" secret="ff6932aae5" server="2576" farm="3" title="펄마스터 커스텀" ispublic="1" isfriend="0" isfamily="0" ownername="kdw8751" dateupload="1253061167" tags="" />

    <photo id="3924760854" owner="36183292@N03" secret="bbef6bfa81" server="2560" farm="3" title="연주" ispublic="1" isfriend="0" isfamily="0" ownername="kdw8751" dateupload="1253061165" tags="wooks" />

  </photos>

</rsp>

[코드 6] 플리커 API flickr.photos.search 반환 XML 데이터

 

private IList<FlickrPhotoModel> GetFlickrPhotoModels(string p)

{

    XDocument xDoc = XDocument.Parse(p);

 

    var val = from item in xDoc.Descendants("photo")

              select new

              {

                 PhotoId = item.Attribute("id"),

                 OwnerId = item.Attribute("owner"),

                 Secret = item.Attribute("secret"),

                 Server = item.Attribute("server"),

                 Farm = item.Attribute("farm"),

                 Title = item.Attribute("title"),

                 Ownername = item.Attribute("ownername"),

                 Dateupload = item.Attribute("dateupload"),

                 Tags = item.Attribute("tags")

              };

 

     List<FlickrPhotoModel> result = new List<FlickrPhotoModel>();

 

     foreach (var item in val)

     {

       FlickrPhotoModel photoModel = new FlickrPhotoModel()

       {

             PhotoID = item.PhotoId.Value,

             Dateupload = item.Dateupload.Value,

             Farm = item.Farm.Value,

             OwnerID = item.OwnerId.Value,

             Ownername = item.Ownername.Value,

             Secret = item.Secret.Value,

             Server = item.Server.Value,

             Tags = item.Tags.Value,

             Title = item.Title.Value

        };

            result.Add(photoModel);

     }

 

   return result;

}

[코드 7] LINQ to XMLXML 데이터 파싱

 

위 코드 내용은 [코드 6] XML 데이터를 받아서 [코드 7]에서 FlickrPhotoModel 클래스(데이터 클래스)에 값을 채워주는 내용이다. LINQ to XML DB 쿼리를 만져 보신 분들이라면 쉽게 이해하고 사용 할 수 있을 것이라 생각이 든다. [코드 7]은 반환 값이 IList<FlickrPhotoModel>로 뷰모델에서 호출해서, 반환 데이터를 받아 ListBox 컨트롤에 바인딩이 되도록 짜놓았다.

(아래 MainViewModel 클래스 참고)

 

namespace Flickr.MyPhotoGallery

{

    public class MainViewModel : ViewModelBase

    {

 중간 생략

 

private IList<FlickrPhotoModel> _photoSource;

        public IList<FlickrPhotoModel> PhotoSource

        {

            get { return _photoSource; }

            set

            {

                _photoSource = value;

                OnPropertyChanged("PhotoSource");

            }

  }

public InstantCommand<object> SelectionChangedCommand { get; private set; }

 

        public MainViewModel()

        {

}

중간 생략

}

}

[코드 8] MainViewModel 클래스(Class)

 

PhotoSource 는 뷰에 ListBox 컨트롤(Control)이랑 바인딩이 걸려 있는 상태여서 뷰모델의 데이터(모델)가 변경이 되면 ListBox의 데이터도 변경이 된다.

 

[그림 5] 포토 리스트 화면

 

 위 그림처럼까지 나오게 했다면 이제 상세정보 보여주는 거는 정말 쉬울 것이다.

 

[코드 8]에서 보면 SelectionChangedCommand를 만들어 준 것을 보았을 것이다. 이는 위에서 LoginCommand와 같은 방법으로 ListBox 컨트롤에 붙어 넣어두고 EventNameSelectionChanged로 설정해주자. 그렇게 되면 리스트박스에서 Selection이 일어 날 때 마다 해당 커맨드(SelectionChangedCommand)가 발생해서 뷰모델에서 선택된 데이터가 들어 올것인데, 이를 받아서 포토(사진)을 크게 보여주면 되기 때문에 상세 뷰도 쉽게 만들수 있을 것이다. 커맨드 파라미터 설정은 위에서 따로 설명하지 않았었데, 간단하다. Command 설정 밑에 CommandParameter를 설정할수 있도록 되어 있다.

[그림 6] CommandParameter 설정

 

 Element Property를 선택 해당 리스트박스(ListBox)컨트롤을 선택후 파라미터를 SelectedItem으로 선택해주면 해당 커맨드가 일어났을 때 파라미터로 SelectedItem을 받을수 있게 되는 것이다.이렇게 받은 데이터를 상세 뷰에 바인딩 시켜주면 간단하게 상세 뷰페이지도 끝나는 것이다.

지금까지 내용이 처음 실버라이트를 접하신 분들에게는 약간은 힘들고, 무슨소리 하는 것 인지 어렵게 느껴졌을 수도 있을 것 같다. 하지만, 하나하나 직접 손으로 만들어 봐야지 실버라이트을 배우는데 수월할 것이다. 물론, 사람마다 배움의 방법은 다르겠지만 일반적으로 직접 만들어보고 익힌 것이 나중에 잊어버리지 않고 내 것이 된다는 것은 공감 할 것이다. 또한, MVVM , Command 패턴은 현재 실무에서도 많이 사용하고 있기 때문에 어떤 회사에 들어가건, 어떤 프로젝트를 맡건 간에 정말 유용하게 사용될 것이라고 필자는 확신한다.

Flickr.MyPhotoGallery.zip

※ 예제 파일을 첨부해 놓습니다!!

Posted by happydong
, |