실버라이트(SilverLight) 강좌와TIP 게시판입니다. - 시삽보기

제목: 실버라이트 튜토리얼 파트 3: 네트워킹을 이용하여 데이터를 가져와서 데이터그리드에 뿌리기
글쓴이: 오일석
평점: 없음
조회: 9946

아래 글은 마이크로소프트 기술담당 부사장인 스캇 구슬리의 블로그에 게시된 First Look at Silverlight 2의 튜토리얼 중에 세번째인 Using Networking to Retrieve Data and Populate a DataGrid 번역본 입니다.  

번역 : 오일석


실버라이트 튜토리얼 파트 3: 네트워킹을 이용하여 데이터를 가져와서 데이터그리드에 뿌리기

이 글은 실버라이트 2의 베타1을 사용한 Digg 클라이언트를 만드는 방법에 대한 8가지의 튜토리얼의 두 번째 파트입니다. 이 튜토리얼들은 순서대로 읽어야 하며 실버라이트의 핵심 프로그래밍 개념을 설명하고 있습니다.


네트워킹을 사용하여 Digg 스토리 가져오기

실버라이트 2는 실버라이트 클라이언트가 원격의 REST, SOAP/WS*, RSS, JSON, XML HTTP 서비스를 사용 가능하게 하는 빌트인 네트워킹 API를 가지고 있습니다. 또한 실버라이트 2는 HTTP 프로토콜을 이용하지 않고도 (채팅 서버와 같은 시나리오를 위해서) 통신할 수 있는 빌트인 소켓 API를 포함하고 있습니다.

크로스 도메인 네트워크 접근

실버라이트 2 응용프로그램은 네트워크 호출이 필요할 때 항상 "origin" 서버로부터 호출을 받을 수 있습니다. 이 의미는 응용프로그램을 다운로드 받은 같은 도메인의 URL을 호출할 수 있다는 것입니다. 또한 선택적으로 원격의 웹 서버에 클라이언트가 크로스 도메인 호출을 해도 좋다는 XML 정책 파일을 가지고 있을 때 크로스 도메인 호출을 할 수 있습니다. 실버라이트 응용프로그램이 다운로드 된 도메인과 다른 도메인의 URL을 호출할 수 있다는 말입니다.

서버 관리자가 어떤 클라이언트의 접근을 가능하게 할지 미리 관리 할 수 있게 하는 XML 정책 파일 포멧이 있습니다. 또한 플래시 크로스 도메인 정책 파일 포멧도 받아들입니다. 이 의미는 여러분이 플래시 클라이언트를 위해 웹 상에 열어놓은 크로스 도메인 접근이 가능한 원격의 REST, SOAP/WS*, RSS, JSON, XML 엔드포인트를 실버라이트 2에서 호출 가능하다는 얘기 입니다.

Digg.com은 HTTP를 통해서 제공하는 매우 쓸만한 Digg API를 가지고 있습니다. Digg.com은 Flash를 위한 크로스 도메인 정책 파일을 가지고 있기 때문에 Digg 클라이언트 응용프로그램에서 직접 API를 호출할 수 있습니다. Digg.com API에 접근하기 위해서 우리의 웹 서버를 통해서 터널을 만들 필요가 없습니다.

Digg.com의 Topic Feed API

우리는 사용자들이 이 프로그램을 사용하여 검색어를 입력(예를 들어 "Programming")하고 검색 버튼을 눌러 Digg.com으로부터 검색어와 관련된 스토리를 가져올 수 있게 하고 싶습니다.



Digg.com의 List Stories REST API Feed API를 이용해 보겠습니다. API는 URL을 통해서 매개변수를 전달 받은 다음 (예를 들어 GET /stories/topic/programming) 검색어와 관련된 Digg 스토리의 결과를 XML로 받습니다. 여기를 클릭하여 XML이 어떻게 생겼는지 보시기 바랍니다.

System.Net.WebClient를 사용하여 Digg REST Feed를 비동기 호출하기

검색 버튼을 클릭할 때 "Click" 이벤트를 핸들링 합니다. WaterMarkTextBox 컨트롤에서 검색하려는 검색어 문자열을 가져와서 관련된 XML 결과를 받기 위한 Digg 네트워크 호출을 초기화 합니다.

실버라이트는 System.Net 네임스페이스에 WebClient 헬퍼 클래스를 포함 합니다. (이것은 닷넷 프레임워크에도 포함되어 있습니다.) 우리는 이 클래스를 이용하여 URL로부터 비동기적으로 컨텐츠를 다운로드 받을 수 있습니다. Digg 스토리를 비동기적으로 다운로드 받는 것의 장점은 원격 서버로부터 응답을 기다리는 동안 UI가 응답이 없거나 차단되지 않을 것입니다. 이것은 매우 자연스러운 사용자 경험을 제공할 것입니다.

WebClient 클래스로 비동기 방식 다운로드를 하려면 요청된 컨텐츠가 다운로드 될 때 호출되는 "DownloadStringCompleted" 이벤트 핸들러 메소드를 등록하고 다운로드를 시작하기 위해서 WebClient.DownloadStringAsync(url) 메소드를 호출 하기만 하면 됩니다.



그리고 위의 코드에서 보듯이 사용자가 원하는 주제에 대한 Digg 스토리를 포함한 XML 데이터의 문자열을 비동기 적으로 가져올 수 있습니다.

LINQ to XML을 사용하여 스토리 클래스에 Digg XML 스토리 파싱하기

지금까지 Digg 스토리의 XML 데이터를 얻었습니다. 다음 단계에서는 데이터를 바인딩 시킬 "DiggStory" 오브젝트 속에 그것을 파싱하고 변환할 것입니다.

이를 위해서는 우선 Digg로부터 받은 XML 컨텐츠에 맵핑할 속성들을 가진 "DiggStory" 클래스를 정의해야 합니다. 새로운 C# 기능인 "automatic properties" 이용할 수 있습니다.



실버라이트 2에 들어있는 LINQ와 Digg로 부터 받은 XML 문서를 쉽게 파싱하고 필터링 할 수 있는 LINQ to XML (실버라이트 응용프로그램에 포함될 수 있는 추가 라이브러리)을 이용할 수 있습니다. 그리고 아래 코드를 사용하여 "DiggStory" 오브젝트의 시퀀스로 변환할 수 있습니다.



위에서 보듯이 앞으로 작업할 강력한 형식의 DiggStory 오브젝트 가지게 되었습니다.

데이터그리드 컨트롤에 Digg 스토리를 표시하기

Digg 스토리를 표시하기 위해서 새로운 실버라이트 데이터그리드 컨트롤을 사용하겠습니다. 이를 위해서 실버라이트 데이터 컨트롤 어셈블리를 참조해야 하고 데이터그리드 컨트롤 선언으로 페이지에 남아 있는 "Todo" 텍스트를 바꿔야 합니다.



데이터그리드는 명시적으로 컬럼 선언을 설정하고 타입을 표시할 수 있습니다. 다른 방법으로는 데이터그리드의 "AutoGenerateColumns" 속성을 true로 설정하여 바인딩 할 오브젝트의 스키마를 바탕으로 데이터원본 리플렉션(reflection)을 통하여 디폴트 컬럼을 만들게 하는 방법이 있습니다.

검색 버튼을 클릭했을 때 Digg로부터 받은 결과를 데이터 그리드의 "ItemSource"에 프로그램적으로 바인딩 시키기 위해 코드 비하인드 클래스를 수정해 보겠습니다.



이제 프로그램을 실행시키고 검색을 하면 Digg로부터 가져온 스토리 데이터 리스트를 보게 될 것입니다.



실버라이트 데이터그리드 컨트롤은 읽고 쓰기가 가능한 다이렉트 에디팅, 선택, 스크롤링, 컬럼의 크기변경 등 클라이언트 측에서 사용하는 그리드 컨트롤에서 기대하는 기본 기능을 모두 제공합니다. 데이터그리드를 포함하고 있는 컨테이너가 동적으로 늘어나고 줄어들어도 컨테이너를 채우는 자동 레이아웃 기능을 제공합니다. 또한 데이터그리드는 훌륭한 템플릿 모델을 제공하고 있어서 컬럼 데이터의 표시와 편집 방법을 모두 커스터마이징 할 수 있습니다. 데이터그리드의 사용법에 대해서는 조만간 더 포스팅을 하겠습니다.

다음 단계

이제 우리는 Digg.com에서 Digg 스토리를 가져올 수 있고 프로그램에 스토리 데이터를 표시할 수 있습니다. 다음 단계는 Page.xaml 로 되돌아가서 우리가 지금까지 사용해 온 인라인 스타일 선언을 제거해 보겠습니다.

다음 튜토리얼 Using Style Elements to Better Encapsulate Look and Feel (한글 번역본)로 이동하겠습니다.

Published Friday, February 22, 2008 5:54 AM by ScottGu

작성자 정보

글등록 +12 3072
덧글등록 +3 110
이름: 오일석(onestone )

Level 52
 [EXP.183/250 ]


메일: onestone.oh골뱅이gmail.com

홈페이지: onestone.tistory.com
자기소개
오일석 (OH IL SEOK)
HOONS닷넷(http://www.hoons.kr) Silverlight 시삽
블로그: http://onestone.tistory.com
 
2008-03-04 오후 11:53:13
IP: 125.131.13.188
        
트랙백 주소 : http://www.hoons.kr/11330/BoardTrackback.aspx ()
등록된 트랙백 0

나도한마디
사용자
글등록 +1276  덧글등록 +1593
오드니엘            [2008-03-08]
Level 49
 [EXP.55/100]
데이타..그리드.. 우와.^^ 짱이네요. ㅎ
사용자
글등록 +1276  덧글등록 +1593
오드니엘            [2008-03-09]
Level 49
 [EXP.55/100]

혹시 따라 해보시는 중에

실버라이트 데이터 컨트롤 어셈블리를 참조해야 하고 데이터그리드 컨트롤 선언으로 페이지에 남아 있는 "Todo" 텍스트를 바꿔야 합니다

이부분에서 이렇게 사용하시면 됩니다.

http://silverlight.net/forums/p/10774/34408.aspx <<< 참조하세요

원본 코멘트 에도 나와 있네요. ^^;;
사용자
글등록 +1224  덧글등록 +199
쇼너짱            [2008-12-05]
Level 15
 [EXP.3/40]
고맙습니다^^ㅋ
사용자
글등록 +1276  덧글등록 +1593
오드니엘            [2008-03-09]
Level 49
 [EXP.55/100]
ThumbNail = (string)story.Element("thumbnail").Attribute("src")

ThumbNail 이렇게 해야지 나옵니다.

안나와서 xml 열어 보았습니다. ㅡㅡ;;
사용자
글등록 +1212  덧글등록 +110
떡쟈            [2009-02-17]
Level 3
 [EXP.1/16]
빈공간이 떠서 봤더니 이거때문이였군아
감사합니다. (:
사용자
글등록 +1284  덧글등록 +123
Eun's            [2008-03-11]
Level 6
 [EXP.2/14]
datagrid 오류 아래 추가되는 부분을 어디에 넣어야 하는건지요?
전 계속 오류나네요..ㅡ.ㅡ
사용자
글등록 +1212  덧글등록 +13
자유청            [2008-03-11]
Level 1
 [EXP.10/16]
중간단계가 빠져버린듯한 느낌 T_T
txtSearchTopic 이 변수는 어디에 선언이 되어있나요 예제 따라 하신분 답변좀
그리고 WebClient diggService 선언하니까 WebClient using 되지 않았던데 혹 아시는분
사용자
글등록 +1276  덧글등록 +1593
오드니엘            [2008-03-12]
Level 49
 [EXP.55/100]
제가 볼때 스캇형님께서.. 작업하실때랑 beta 출시할떄랑 조금 다른가 봐요.. 더 보완 된것 같은데요.. 같은 뜻이기는 하지만.. ^^;;
데이타 그리드 는 그냥 네임스페이스니 이런거 다 필요없구요 toolbar에서 드레그하시면 됩니다. my: <<< 요게 namespace 찾는건데 기본으로 되어 있어요.


xmlns:Digg="clr-namespace:DiggSample"> // 스캇형님 선언하신거..
xmlns:my="own프로젝트namespace명"> // 선언되어있음^^;;

뜻만 보면 같은 뜻이네요 ^^;;

결론은..그냥 드레그 입니다.

사용자
글등록 +1276  덧글등록 +1593
오드니엘            [2008-03-12]
Level 49
 [EXP.55/100]
txtSearchTopic 는 xaml 에서 .... 그냥 텍스트 박스 이름인데요... x:Name="txtSearchTopic" ㅎㅎㅎ ^^;; asp.net 그냥 Control id 랑 같다고 생각하시고 사용하심 됩니다. ㅎ
사용자
글등록 +1212  덧글등록 +110
떡쟈            [2009-02-17]
Level 3
 [EXP.1/16]
감사합니다. 덕분에 도움되었어요 (:
사용자
글등록 +1212  덧글등록 +13
자유청            [2008-03-12]
Level 1
 [EXP.10/16]
아 여기서 부터 전혀 모르겠네요 T_T 왜 갑자기 DiggService_DownloadStorieCompleted(.. ..) 이게 나왔는지 부터 diggUrl 에 담는 "http://....." 이것도 짤려 있고 으악 답답 T_T
완성하시분 최종 소스좀 주세요 !!~
사용자
글등록 +12132  덧글등록 +15
혁이            [2008-04-11]
Level 3
 [EXP.10/16]
흠..저도 안되는듯한데 잘 몰라서요.실행하면 흰화면만 나옵니다..
사용자
글등록 +120  덧글등록 +12
ssanai            [2008-10-29]
Level 1
 [EXP.-6/16]
datagrid가 활성화 되지 못하고 그냥 하얗게 보이는 이유는 뭘까요? ^^;;; 에러는 없고 다른 컨트롤 부분은 다 정상으로 보이는데,
datagrid부분만 하얗게 보이네요..
사용자
글등록 +1224  덧글등록 +15
Cooool            [2008-11-12]
Level 2
 [EXP.5/16]
아... 열심히 했건만.. 백지가 뜨는건... OTL
사용자
글등록 +12424  덧글등록 +1316
피요히코~            [2008-11-23]
Level 44
 [EXP.14/100]
계속 뭐가 한개씩 빠진 느낌이다~ 했더니. 제가 한개씩 빼고 했었네요. ㅋ_ㅋ;; 아놔. ㅋㅋ
사용자
글등록 +12292  덧글등록 +1297
아기미르            [2008-12-03]
Level 36
 [EXP.36/80]
으아아악~~~ 따라할려니 힘든게 좀 있네요.
근데 전 왜 XDocument << 이넘이 안올라올까요?? 이것도 버전에 문제가 있는걸까요??
오드니엘님 소스 불러와보니... 버전이 안맞아서 안돌아간다는.. ;;; 물결이 주루룩~~ ㅠㅠ
사용자
글등록 +1260  덧글등록 +131
hieseng            [2008-12-28]
Level 11
 [EXP.11/40]
참조 추가를 하시면 됩니다.
[솔루션 탐색기] - [참조]에서 우클릭 참조추가 클릭
System.Xml.Linq 추가하시고...

using 문도 추가해주세요. System.Xml.Linq...^^

저도 안되서 헤매다가 원문에 달린 댓글보고 해결 했어용.
사용자
글등록 +1212  덧글등록 +110
떡쟈            [2009-02-17]
Level 3
 [EXP.1/16]
찾고 있었는데,감사합니다 (:
사용자
글등록 +1224  덧글등록 +199
쇼너짱            [2008-12-05]
Level 15
 [EXP.3/40]
한글번역..와우...ㅋ덕분에 잘 배우고 있어요^^
사용자
글등록 +120  덧글등록 +11
Jade            [2008-12-31]
Level 1
 [EXP.3/16]
System.Xml.Linq 참조 추가와..xml 구조 때문에 안됐었는데 이젠 잘 됩니다.

번역당시와 xml 구조가 많이 바뀐듯 하네요..

감사합니다.
사용자
글등록 +120  덧글등록 +11
프리크니            [2009-02-11]
Level 1
 [EXP.3/16]
백지뜨는건 아마도

void diggService_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
if (e.Error == null)
{
DisplayStories(e.Result); //요부분 수정안하셨을듯 하네요..
}
}
사용자
글등록 +120  덧글등록 +11
나수크            [2009-02-20]
Level 1
 [EXP.3/16]
xaml파일 부분에 <Data:DataGrid 부분이 활성화가 않되는데 왜 그런것일까요 ?
혹시 아시는분 답변쫌 부탁 드립니다.
사용자
글등록 +1224  덧글등록 +11
마이세렌디            [2009-04-02]
Level 1
 [EXP.9/16]
^^; 지금 이거 보시는분들 참고하세요 스캇횽님 블로그에 가시면 최종소스 다운받으실수 있습니다.
번역본이랑 이미지도 지금은 약간 다른것도 있고 암튼 주소는 http://weblogs.asp.net/scottgu/pages/silverlight-tutorial-part-3-using-networking-to-retrieve-data-and-populate-a-datagrid.aspx 요기로 가시면 좀더 명확하게 아실수 있을겁니다. ㅎㅎ 이제 시작하는데 재밌네요~
사용자
글등록 +1236  덧글등록 +120
달인            [2009-04-07]
Level 3
 [EXP.1/16]
DiggService_DownloadStoriesCompleted <-- 이녀석에서 e.Error 메세지가 -> The remote server returned an error: NotFound 이렇게 나오는데요....

url 입력할 때 "http://services.digg.com/stories/topic/{0}?count=20&appkey=http%3A%2F%2Fscottgu.com" <-- 이게 맞나요?

--------------------------------------....핫....---------------
제가 txtSearchTopic 이 아이디를 엉뚱한데 갖다 붙여놨었네요 ㅎㄷㄷ
사용자
글등록 +1212  덧글등록 +112
닥터제로            [2009-04-21]
Level 3
 [EXP.7/16]
음 일반 쿼리를 이용한 데이터 그리드 방식하고 속도 면에서 빠른가요?
사용자
글등록 +120  덧글등록 +18
행운아G            [2009-05-12]
Level 2
 [EXP.8/16]
잘은 모르지만....... 잘 따라하고 있습니다. ㅎㅎ
사용자
글등록 +120  덧글등록 +15
박정섭            [2009-11-03]
Level 1
 [EXP.15/16]
그리드의 타이틀은 나오는데 데이터가 안나오네요. 뭐가 잘못된건지..
사용자
글등록 +120  덧글등록 +15
박정섭            [2009-11-03]
Level 1
 [EXP.15/16]
Element 와 Attribute 를 잘못써서 안나왔군요 'ㅁ'
태그로 엮인글 리스트
글리스트
  실버라이트 2 베타1 개발환경 설치하기 [3] 평가안됨 오일석
  실버라이트 2의 시작 MIX 08 키노트 잘 보는 방법 평가안됨 오일석
  Silverlight 2 - 첫 프로젝트 만들기 평가안됨 테디
  실버라이트 2.0 개발툴 다운로드 링크 평가안됨 테디
  실버라이트 튜토리얼 파트 4: 보다 나은 캡슐화 된 룩앤필(Look and Feel)을 위한 Style Eleme... [5] 평가안됨 오일석
   ★현재글->  실버라이트 튜토리얼 파트 3: 네트워킹을 이용하여 데이터를 가져와서 데이터그리드에 뿌리기 [23]+5 평가안됨 오일석
  [RE]실버라이트 튜토리얼 파트 3: 네트워킹을 이용하여 데이터를 가져와서 데이터그리드에 뿌리기 [2] 파일첨부 평가안됨 오드니엘
  세계태권도 연맹 web Tv [실버라이트] 평가안됨 오드니엘
  실버라이트 튜토리얼 파트2: 레이아웃 컨트롤 사용하기 [9] 10점 오일석
  실버라이트 튜토리얼 파트 1: VS 2008과 실버라이트 2를 이용한 “Hello World” 만들기 - Scot... [7] 평가안됨 오일석
  실버라이트2와의 첫만남 - ScottGu''s First Look at Silverlight 2 의 번역본 [9] 평가안됨 오일석


사용자 정보

close