블로그 이미지
평범하게 살고 싶은 월급쟁이 기술적인 토론 환영합니다.같이 이야기 하고 싶으시면 부담 말고 연락주세요:이메일-bwcho75골뱅이지메일 닷컴. 조대협


Archive»


 
 
요즘 모바일 디자인 & 개발 이라는 책을 읽고 있습니다.
얼마전에 서점에 가보니 깔린 책들이 몽땅 아이폰이나 안드로이드 개발이야기 더군요. 그만큼 요즘 모바일이 많이 관심 받고 있다는 이야기인데. 블로그에도 포스팅 했지만 WP7도 테스트 해보고 안드로이드도 테스트해봤습니다. 아이폰은 사실 개발 환경 설정의 귀차니즘으로 코드만 본정도? 입니다.

제 직업이 아키텍트이기 때문에 주로 전체적인 시스템 설계를 담당합니다. 아키텍쳐링에서 가장 중요한것은 기술의 특성을 이해하고 비지니스 요구 사항을 이해해서 중간의 GAP을 없애고 시너지를 낼 수 있게 하는 것이 가장 중요합니다.

사실 모바일 개발이야, 플랫폼적인 특성과 언어적인 특성을 빼면 개발 자체에 대한 내용은 크게 차이가 없습니다. (물론 개발 테크닉, 개발환경, Learning Curve등의 차이는 존재합니다.) 중요한 것은 모바일 생태계와 비지니스 시나리오를 이해하고 접근 방식을 결정하는 것입니다.
그리고 모바일의 특성상 통신사나 통신망 기술과 밀접하게 연관이 되기 때문에 이에 대한 이해와 모바일이라는 다른 사용자 시나리오 (공간과 시간의 제약에서 벗어나는)를 위해서 UI 그리고 여러 센서들을 어떻게 사용할지와 같은 다른 방식의 접근이 필요합니다. 이야기가 길었습니다만, 모바일 프로그래밍이 아니라, 모바일 자체를 이해하는게 더 중요하다는 것입니다.
그런면에서 이 책은 상당히 이런 기반 지식을 쌓을 수 있게 잘 쓰여져 있는 것 같습니다.
모바일 플랫폼의 소개에서 부터 시작해서 핵심 기술에 대한 소개,디자인,테스트등등 모바일쪽에 관련이 되는 사람(개발자가 아니더라도) 한번 꼭 추천하고 싶은 책입니다.


어제 10시30분에 Windows Phone 7 키노트 행사가 있었습니다.
행사 내용이나 WP7 Feature들은 이미 인터넷에서 떠돌고 있는 동영상들을 다 보고, WP7 개발환경으로 테스트를 해봤기 때문에 색다르지는 않았습니다.

단 AT&T의 전략이나, 어제 공개된 9가지의 폰등은 참으로 흥미로웠습니다. 트위터에서의 반응도 재미있었구요. 정리를 해보겠습니다.

1. AT&T의 서비스 발표
AT&T는 삼성,HTC,LG 3개의 폰으로 서비스를 발표했습니다.
재미있는 것은 AT&T가 WP7과 아울러서 AT&T의 IP TV서비스인 U-verse와 연동 서비스를 제공한다는 겁니다. TV 플랫폼 시장은 이미 애플이나 구글 TV등의 이슈로 떠들석합니다. 그런데 MS는 조용했을까요? 아닙니다. 사실 IP TV 플랫폼의 전세계 실제 마켓쉐어 1위가 Microsoft입니다. MediaRoom이라는 이름의 IP TV솔루션을 제공하고 있고, 현재 Media Room 2.0을 발표해서 몇몇 업체가 적용에 들어갔습니다. 이 MR2.0은 3스크린 전략을 지원합니다. TV,X-BOX,PC,핸드폰을 모두 지원합니다. 집에 STB가 한대만 있다면 STB에 영화를 녹화해놨다가 X-BOX나 핸드폰에서도 플레이해서 볼 수 도 있고, 제가 영화를 보다가 와이프가 드라마를 볼려고 하면, 핸드폰을 조용히 들고 방으로 들어가서 아까 보던 부분부터 다시 볼 수 있습니다.

AT&T는 이 MR 솔루션의 가장 큰 고객입니다. WP7만을 발표한것이 아니라 TV,X-BOX,PC,핸드폰 을 통합한 멀티 스크린 서비스를 제공한다는 메세지가 나름 시장에 임팩트가 있을겁니다.

2. 9종의 핸드셋 발표

어제 9종의 핸드셋이 발표되었습니다. HTC가 상당히 많은 모델을 가지고 나왔더군요.
LG의 경우 음성 기반의 명령 인터페이스나, PC나 다른 디바인스와 연계할 수 있는 DLNA등의 피쳐가 흥미로웠습니다. DELL 은 윗쪽으로 슬라이딩이 열리는 QWERTY 키보드를 탑재한 모델입니다. 그에 비해 삼성은 수퍼 아몰레드 이외에 특별한 피쳐는 없었던것 같습니다 .아니면 제가 놓쳤던가요. 기대를 모았단 HTC의 슈베르트는 예전 Leaked된 디자인에 비해서 한층 떨어저 보입니다. 사실.. 아직 ASUS등의 모델이 공식 발표되지 않았으니 더 많은 모델이 나오기를 기대해 봅니다.
사실 아이폰 4에 비해서 디자인은 기대에 부흥하지 못했던것 같습니다.

3. 대박 키보드 입력


키보드 입력 시연하는데.. 대박이더군요.. WP7 리뷰 나올때 마다 키보드가 놀랍다고 하던데.. 어제 보고 알았습니다. 왜 그렇게들 이야기 하는지. 아마 자동 완성 기능 때문인것 같던데.. 키보드 입력 속도가 PC에서 키보드 치는 수준으로 나옵니다.
이건 스마트 폰에서 새로운 사용자 시나리오를 만들어낼 수 있음을 암시하는데, 스마트폰 사용자분들은 아시겠지만, 장문의 글을 쓰기 어렵습니다. 그래서 트위터 같은 단문 메세지가 유행인것이고, 장문의 이메일을 쓰거나 블로그 포스팅은 스마트폰에 맞지 않는 시나리오 였습니다만, 이런 입력 환경이면 블로그나 기타 장문글을 이용한 새로운 사용자 경험이 제공되지 않을까 싶습니다.
다른 키보드 입력 영상을 첨부해봅니다. 어제 시연에서는 이것보다 더 빨리 치던데.. 이 영상에서 키보드 치시는 분들은 약간 느리군요. 대한민국 여학생(?)이 데모로 나갔으면 분당 500 타는 보여줬을텐데요.

4. 발표 국가
60개 서비스 사업자가 30개 국가에 걸쳐서 서비스를 제공한답니다. 아직 1차인데, 한국등은 포함되어 있지 않아서 매우매우 아쉽습니다.

5. 일관된 인터페이스
eBay 애플리케이션으로 어제 시연을 했었는데, UI가 일관됩니다 .어느 App이건 Zune 스타일의 UI를 사용하기 때문에 사용하기 매우 편리하고 Learning Curve가 작다는 장점이 있습니다.
어제 시연 영상을 보니, 아이폰이나 안드로이드에 비해서 메뉴 이동 느낌이 쾌적하고, 원하는 메뉴를 찾아가는데 까지 시간이 덜 걸리는 듯한 느낌이 들었습니다.

단, 이 일관된 인터페이스는 양날의 검이 될 수 있는데, "일관"이란 반대로 "다양성"을 제재한다는 이야기가 됩니다. 요즘 처럼 UI가 중요한 시대에 애플리케이션들이 다양한 사용자 인터페이스를 제공해줄 수 있는지 우려되는 부분입니다.

6. Zune 연동 그리고 Netffix 등
Zune은 잘 아시겠지만 MS의 멀티미디어 플레이어입니다. Itune와 비슷하게 영상이나 음악에 대한 Market Place 모델을 제공하고 있고, 어느정도 생태계가 성숙되어 있는 모델입니다. 이 Zune 컨텐츠들이 그대로 WP7에 들어옵니다. 아마 멀티미디어 컨텐츠 수급은 문제가 없겠네요. 어제 키노트에는 언급이 되지 않았지만 Netffix와 같은 서비스도 제공이 되는 것으로 알고 있습니다.

7. 게임 환경

게임 환경역시 아마 WP7의 큰 무기중 하나일겁니다. X-BOX Live와 연동이 되서 하나의 ID로 X-BOX 게임기의 게임과 연동이 되고, 다른 사용자와 플레이도 가능합니다.
무엇보다 XNA라는 게임 개발 플랫폼을 가지고 있는데, 말 그대로 전용 게임 개발 플랫폼입니다. 게임 개발을 위한 3차원 그래픽 엔진, 충돌처리, 스프라이트 처리, 이펙터들이 이미 Pre Built in 되어 있습니다. 다른 스마트폰에서 개발 생산성 차이가 많이 날 것 같습니다.
아울러 XNA 개발환경은 같은 게임을 하나의 소스로 개발하더라도 컴파일 타겟만 바꾸면 같은 게임이 X-BOX 360이나 데스크탑에서도 실행될 수 있습니다.
이는 개발자들에게 하나의 소스로 여러개의 시장을 동시에 노릴 수 있는 기회를 제공해주고 이는 바로 수익으로 연결이 됩니다.

어제는 SIMS3를 데모하더군요. 얼마전에도 발표되었지만 메이져 게임 개발사들이 이미 따끈한 WP7 게임 60개를 만들어 놓고 대기중입니다.
가끔 WP7 데모를 보면 게임기 같다는 느낌도 듭니다.

8. 엔터프라이즈 지원
다음으로는 엔터프라이즈 지원 환경입니다.
기업용 스마트 폰으로 성공한 플랫폼은 블랙베리가 대표적입니다. 블랙베리의 성공요인은 QWERTY 키보드도 있겠지만, 강력한 푸쉬 기능과 기업의 인프라 스트럭쳐와의 통합 능력에 있습니다. 블랙베리 엔터프라이즈용 플랫폼인 서버를 이용해서 Lotus Notes나 MS Exchange등과 연동이 잘되었던게 큰 성공요인중 하나였습니다.

MS는 기본적으로 MS Exchange와는 당연히 연동이 될 뿐더러 Active Directory와 같은 인프라 스트럭쳐 솔루션과의 연동, MS Office,Share Point, BI등의 MS 기업용 솔루션과 데스크탑 솔루션과의 자연스러운 연계를 통해서 엔터프라이즈 시장에 만만하지 않은 저력을 가지고 등장했습니다.

애플이 공식적인 엔터프라이즈 적용 플랫폼이나 제품이 없고, 구글은 구글 앱스와 GMAIL을 내세우는 반면, MS는 기업내 시스템과 좀더 정교한 연동이 가능한 시나리오를 준비했다는 것이 기업 시장에서의 가능성을 밝게 해주는 부분입니다.

9. 타일 그리고 SNS
타일 기반의 UI나 타일에서 SNS 등의 정보를 실시간으로 타일에 표시해주는 기능은 워낙 많이 언급되어 왔던것이기 때문에 패스

10. 개발 환경
개발환경이 이번에 구체적으로 언급되지는 않았는데, 제가 직접 SDK를 받아서 테스트 해본 결과로는 상당히 만족스럽습니다. 자바 개발 백그라운드를 가지고 있지만 2~3일이면 충분히 개발환경에 적응이 가능합니다. 예전 이클립스 기반의 안드로이드 UI 개발환경과 비교하면 이건 생산성 차이가 엄청 나겠네요.  개발 환경이나 언어에 대해서 자세히 알고 싶으면 아래 링크를 참고해보세요. 간략 리뷰가 있습니다.

http://bcho.tistory.com/category/프로그래밍/Windows%20Phone7

11. 마켓 플레이스
이미 Zune 마켓을 운영하면서의 노하우와 쌓여온 컨텐츠, 그리고 오픈전에 약 2,000여개의 앱들이 준비중이고, 안드로이드 마켓의 실패와 애플마켓의 성공 사례를 레퍼런스해서 나름 잘 해놨을것이라고 기대해봅니다.

12. Copy & Paste
Copy & Paste는 2011년에 지원 예정이랍니다.

개인적인 의견들
윈폰7 자체만으로 보면 상당히 만족 스럽습니다.
그러나 곧 안드로이드 3.0이 탑재된 폰들이 출시될것이고, 내년에 아이폰5가 출시될것이라는 이야기를 봐서, 윈폰7은 현재 아이폰4나 안드로이드 2.X대가 아니라는 겁니다. 시기적으로 좀 많이 늦었져.  곧 업그레이드 버전이 나오기를 기대합니다.
가트너나 IDC에서 윈폰7에 대해서 상당히 부정적인 리포트들을 쏟아놓고 있는데.. 과연 그렇게 부정적일까 의문입니다. 리포트 쓴 사람들에게 한번 물어보고 싶습니다. "아이폰,안드로이드,WP7 개발해봤어? 안해봤으면 말을 하지 말던가..."
C#,실버라이트,XNA등 이미 개발층이 두텁게 있는 MS는 WP7이 WM6.5에서 아무리 바뀌었다 하더라도, 제 사견으로는 더 많은 개발자를 끌어들일 수 있다고 봅니다. 오히려 예전보다 쉬워졌고, 저변이 넓은 기술을 택했기 때문이지요.
그리고 저 UI는 특이하긴한데, 시장에서 얼마나 먹힐련지 상당히 궁금하군요. 아마 출시후 1~2개월내에 결판이 나지 않을까 싶습니다.
그외에 테더링이 지원 안되는 점은 치명적일듯 합니다.
다른 부분은 지켜봐야겠지요.. 그나저나 저는 멋진 디자인의 WP7 이 나왔으면 합니다. 요즘은 디자인 시대지요



아바타 데모


XBox Live 개정에 자신의 아바타를 만들어서 맵핑 시키는 형태, 아바타 자체가 점수에 따라서 웃기도 하고, 폰의 상태(흔들기)등에 따라서 반응도 하고, 재미있는 개념인듯.

게임 데모


중간중간 보면 알겠지만, 3D 게임 퀄러티가 상당히 훌륭하다는!!


지금까지 대강 윈폰7의 프로그래밍 개념에 대해서 잡아봤고, 오늘은 약간 더 실제 프로그래밍을 하는데 필요한 부분에 대해서 알아봅니다.
스마트폰 애플리케이션을 개발하는데, 가장 많이 사용되고 필수적인 컨트롤은 ListBox 컨트롤입니다. 전화번호 목록, 이메일 목록, 상품 목록등 각종 목록을 표시하는데 필수적으로 사용됩니다. 이번에는 이 ListBox 컨트롤의 사용방법에 대해서 알아보고, 아울러 상당히 중요한 데이터 바인딩 개념에 대해서 소개합니다.

 
오늘 만들어볼 예제 화면입니다. 위의 두개의 텍스트 박스가 있고, 왼쪽에는 이름을 오른쪽에는 이메일을 넣습니다. 그후에 Add 버튼을 누르면 아래 리스트에 추가되고, 아래 리스트에서 아이템을 선택한후에 Remove 버튼을 누르면 삭제되는 아주 간단한 애플리케이션입니다.
데이터 구조는 상당히 간단합니다. Contact이라는 ValueObject가 Name과 Email이라는 속성을 가지고 있고, 이 Contact이라는 ValueObject를 List형태로 저장한 것이 데이터 모델입니다.
Contact Class를 먼저 살펴보면

형태입니다. 간단합니다.
다음으로 UI를 디자인합니다.
TextBox와 Button등을 배열하고, 가장 중요한 ListBox를 추가합니다.

대충 이런식으 코드가 됩니다.
이제 ContactList를 정의할 클래스를 지정하고, ContactList를 List형태로 생성합니다.

List<Contact> contacts = new List<Contact>();

이런 식으로요. 그런데, 이런식으로 코딩을 하고 나중에 수행을 해보면, 아무리 Add나 Remove 버튼을 눌러도 화면에는 새로운 Contact이 추가되거나 삭제되지 않습니다. 왜냐? ListBox UI콘트롤과 이 contacts 변수가 바인딩되서 ListBox는 이 contacts 내부의 내용을 출력하게 되는데, ListBox 컨트롤은 contacts 변수에 값이 추가되는지 안되는지를 모르기 때문입니다. 그래서 contacts 리스트에 데이터가 추가되거나 삭제 되면 이를 ListBox 컨트롤에 알려줘야 하는데, 이렇게 List 형태에서 데이터가 추가되거나 삭제될 때 연결된 UI 컨트롤에 이벤트를 발생해서 전달해주는 클래스로 “ObservableCollection” 가 있습니다.
그래서 contacts를 생성할때는 다음과 같이 해줘야 합니다.

ObservableCollection <Contact> contacts = new ObservableCollection<Contact>();

그리고, Add 버튼이 눌렸을 때 새로운 Contact을 추가하고, Remove를 눌렀을 때 현재 선택된 List 아이템을 삭제하는 코드를 추가합니다. 추가한 MainPage.xaml.cs 내용은 다음과 같습니다.

Add 버튼 클릭에서는 단순히 contacts에 새로운 Contact 객체를 생성해서 Add해주고, Remove는 ListBox :: SelectedIndex라는 메서드를 이용해서 현재 선택되어 있는 아이템 번호를 읽어오고, 그것을 RemoveAt 메서드를 이용해서 지웁니다. 앞에 if문으로 SelectedItem이 null인지 체크하는 것은 예를 들어 현재 3개의 아이템이 있는데, 3번째것을 삭제하고 나면 선택 포커스가 그대로 3번째를 가르킵니다. 3번째를 삭제했는데도 말이지요. 그래서 만약 사용자가 선택을 1,2번째로 바꾸지 않고 그대로 Remove 버튼을 눌러서 삭제하면 Null Pointer Error가 납니다. (3번째 선택에는 아이템이 없기 때문에 삭제할 수 없기 때문에. 말로 설명이 잘 안되는데, 직접 한번 테스트 해보시기를.)
그리고 가장 중요한 것 ListBox UI 컨트롤에 어디서 데이터를 가지고 올지 알려줍니다.

contactListBox.ItemsSource = contacts;

이 말은 ListBox에 데이터를 contacts라는 List형 변수에서 가지고 오라는 이야기입니다. 이것이 데이터 바인딩인데, 이건 조금 있다 설명하기로 하고
자아 끝났습니다. 실행을 하면? 예상과 다른 결과가 나타납니다.


우리가 원하는 것은 contacts 안에 있는 Contact 객체들의 내용 즉 이름과 이메일을 보고 싶은데 생뚱 맞게, ListBoxSample.Contact 들이 목록으로 쭈욱 나옵니다. 그도 그럴것이 ListBox 컨트롤은 Contacts 형태의 리스트만을 가지고 있는 contacts라는 변수만 바인딩을 했을뿐, 실제 Contacts 안의 데이터를 어떻게 나타내야 할지를 모릅니다.
이제 ListBox에게 실제Contacts 객체를 얻어왔을 때 어떻게 데이터를 출력할지를 알려줍니다.MainPage.xml을 다음과 같이 수정합니다.

• 먼저 ListBox에 각각의 아이템을 어떻게 출력하는지를 정의하기 위해서 Template을 정의합니다. ListBox.ItemTemplate이 각각의 아이템을 어떤 형태로 출력할지를 정의하는 겁니다.
• 우리는 데이터를 contacts라는 객체에서 가지고 올것이기 때문에 DataTemplate을 정의하고, 각 하위 엘리먼트에서 contacts의 Item인 Contact 객체의 Attribute (Name,Email)을 각각의 TextBox에 추가하도록 한다.
• ListBox에서 ItemSource를 contacts를 정의했기 때문에, TextBox에서 “{Binding Name}”은 이런식으로 해석된다 DataTemplate에 의해서 contacts의 각각의 아이템이 선택되고 (Contact) 객체, 거기에 {Binding Name}에 의해서 Contact.Name 값이 뽑아지게 된다.
다시 이 개념을 정리해 보면

사실 이 포스트에서의 핵심은 ListBox와 List<> 클래스를 어떻게 바인딩하느냐가 핵심이다. 물론 ListBox 컨트롤 사용법을 알리는것도 목적이 있지만, 이 부분이 상당히 헷갈릴 수 있씁니다., (필자는 여기서 좀 헤맸습니다...) 그래서 다음 포스팅에서는 데이터 바인딩의 개념에 대해서 조금 더 자세하게 설명해보도록 하겠습니다.

참고 : 소스 코드


윈도우즈폰7 은 마이크로소프트가 스마트폰 경쟁에서 살아남기 위해서 야심차게 준비한 플랫폼이다. 2002년도만 해도, 전세계 스마트폰 플랫폼의 15%이상을 점유하면서 스마트폰 OS 시장의 1위를 차지하던 마이크로소프트가 심비안,애플의 아이폰과 구글의 안드로이드플랫폼에 밀려,  그 시장 점유율은 계속해서 하락하고 있다.
이런 상황에서 모바일 시장을 재 장악하기 위해서 기존 Windows Mobile 이라는 이름을 버리고 Windows Phone 7이라는 이름으로 새로운 OS를 준비하고 있다. 단순히 이름만 바뀌는 것이 아니라, 기존 Windows Mobile과의 호환성을 모두 포기하고, 새로운 인터페이스로 무장한 완전히 새로운 플랫폼을 내놓는 것이다.
시장 상황으로 보면 이미 안드로이드와 아이폰이 시장을 나눠 가지고 있는 상황에서 늦은감이 있다. (사실 이게 제일 아쉽다. 1년만 더 빨리 출시하지… ) 그러나, MS의 Windows Phone 7이 이 게임 판을 뒤집을 수 있는 몇가지 무기를 가지고 있는데, 이에 대해서 살펴보고자 한다.

윈도우폰 7의 태생적인 강점은 MS라는 기업과 늦은 시작이라는데 있다.
MS는 대형 IT 업체 중에서 벤더와 서비스 성격을 모두 가지고 있는 업체이다. 오라클이나 IBM과 같이 기업 중심의 엔터프라이즈 제품 (MS-SQL,TP Monitor,CRM과 같은 백엔드에서 Exchange,WinServer,Active Directory같은 인프라 스트럭쳐 솔루션)에서부터 애플과 같이 윈도우,X-BOX에 이르는 End Client 시장, 그리고 MSN,Windows Live와 같이 구글과 같은 서비스  솔루션을 가지고 있는 IT에 대해 Full Coverage를 제공하는 IT 업체이다.
시장 진입이 늦었다는 것은, 이미 애플과 구글이 스마트폰 시장에서 했던 실수를 하지 않을 수 있다는 이야기다. (Windows Phone 7 스펙을 보더라도 알 수 있다. 차차 설명하겠지만)
그럼 이 두 가지 장점이 구체적으로 어떻게 Windows Phone7의  포텐셜로 연결되는지 설명한다.

 

디바이스의 표준화
아이폰의 성공 요인과, 안드로이드의 문제점은 무엇일까? 표준화된 디바이스에 있다. 아이폰은 단 하나의 화면 해상도와 동일한 CPU 성능, 동일한 인터페이스를 제공한다. 그래서 개발된 애플리케이션은 하나의 환경에서 테스트 되고, 빨리 시장에 진입할 수 가 있다. 반면에 안드로이드는? 안드로이드는 공개 플랫폼이기 때문에, 디바이스의 스펙은 물론 OS 자체까지 뜯어 고칠 수 있다. 그래서 디바이스의 CPU 나 화면 해상도, 프로그래밍 인터페이스들이 제각각이다. 그래서, 제작된 애플리케이션의 디바이스간 상호 호환성 문제들이 나타난다.
이는 개발자 입장에서는 진출할 수 있는 시장이 줄어드는 것을 의미하고, 개발의 난이도와 테스트에 소요되는 시간과 비용을 늘리게 된다.
Windows Phone 7은 이런 문제를 피하기 위해서, Windows Phone 7에 필요한 하드웨어 사양을 아예 기준화 시켜 버렸다. 특정 화면크기, CPU 성능, 버튼 배열까지. 아직 출시되지는 않아서 확언할 수 는 없지만, 적어도 안드로이드 플랫폼에서 일어나는 호환성 문제는 없을것이다. 물론 OS도 제조사가 마음대로 뜯어 고칠 수 없다.!!

멀티 스크린 전략
근래 들어서 MS의 전략은 3 스크린이라는 IT 전략을 사용하고 있다. PC-TV-MOBILE을 통합하여 서비스를 제공하겠다는 개념인데, 앞전 강의에서 언급했던, XNA기반의 게임이 PC-X BOX-WP7에서 모두 구동되는 것도, 이 3 스크린 전략의 일환이다.
 


이미 MS는 콘솔 게임 시장에서 X-BOX 360으로 소니의 플레이스테이션과 함께, 하이레벨 게임기 시장을 장악하고 있으며, 국내에는 서비스를 하고 있지 않아서 잘 모르는 사람도 많겠지만, 구글이 구글 TV,애플이 애플 TV가지고 떠들석하게 이야기 할 때, 이미 MS는 IP TV쪽에서 500만 가입자를 가지고 있는 IP TV 플랫폼의 전세계 최고 사업자이다. 다들 알고 있는 PC용 윈도우7이야 말할것도 없고, 이런 인프라를 기반으로 멀티 디바이스에 대한 서비스가 가능하다.
 MS의 IP TV솔루션인 Media Room 2.0은 이미 이런 시나리오가 반영이 되어 있는데, 예를 들어 집의 IP TV로 VOD를 서비스를 받는 사용자는 집에서 WIFI를 이용해서 VOD 컨텐츠를 폰에 저장해서 들고 다니면서 플레이를 한다거나, 스포츠 방송을 보고 있는데, 와이프가 드라마를 틀어버리면 핸드폰을 가지고 플레이하면 아까 보고 있던 스포츠 방송(녹화분이건, 생방송이건)을 연결해서 볼 수 있다.
스마트폰 플랫폼이 단순하게 모바일 영역에만 머물러 있는 것이 아니라 TV-게임기-PC-모바일을 넘나들며 크로스 서비스를 한다는 것이고, 이는 애플리케이션 개발자에게 새로운 수익 모델을 제시할 수 있고, 사용자 입장에서는 상당히 다양한 형태의 연결된 서비스 환경을 제공할 수 있다는 것이다.

SNS (Social Networking Service)
앞서도 언급했듯이, MS는 유일하게 서비스와 엔터프라이즈 제품을 동시에 제공하는 업체이다. (벤더 + 서비스 업체). MS는 MSN을 가지고 있고, Bing 검색엔진, 광고 플랫폼, Windows Live 기반의 메신져등,Zune 다양한 SNS 매체를 가지고 있다. (Facebook의 최대 주주이기도 하다) 이는 두가지 관점에서 의미를 가지는데, SNS가 보유한 컨텐츠를 손쉽게 공급할 수 있다는 장점과, 이러한 SNS 서비스와 타이트한 연결을 통해서 서비스를 제공할 수 있다는 것이다.
애플은 이러한 서비스가 없다. ITune 정도가 다인데, 그렇기 때문에 컨텐츠의 수급과 서비스 연동 방식을 전적으로 개발자에게 의존하고 있다. 안드로이드가 아이폰에 비해서 차별화 되는 것은 구글이 가지고 있는 SNS와 컨텐츠를 연동하는데 있다. 구글맵,지메일등이 대표적인데 스마트폰 플랫폼 전쟁이 장기화 됨에 따라서 누구도 서비스가 계속해서 오픈되어 있을것이라고 장담할 수 는 없다. 미워 보이는 경쟁자에게는 폐쇄 정책을 사용할 수 도 있고, (드문일이겠지만..)
이러한 기존의 MS의 서비스 플랫폼들이 자연스럽게 윈폰7에 녹아서 연결이 될 예정이고, 이는 스마트폰의 기술적인 차별성이 아니라 컨텐츠와 사용자 경험에 있어서 다른 스마트폰 플랫폼사와 하나의 차별화 포인트가 될 수 있다.

Learning Kit에 들어가 있는 간단한 게임(갤럭시같은..) 튜토리얼을 따라해보고 리뷰를 올립니다.
먼저 이글을 올리기전에 제 백그라운드에 대해서 소개할 필요가 있는데,
94~97년정도까지 게임 개발을 했습니다. MS-DOS상에서 인라인어셈블리와 C/C++을 이용해서 2D 게임을 만들고, Direct-X 초창기 버전과 Direct 3D등으로 게임을 만들어본 경험이 있습니다.
시절이 10년은 지났으니, 결과적으로 게임 프로그래밍에 대해서 기본 개념은 있지만, 요즘 최신 게임 프로그래밍 기법에 대해서는 정보가 부족한 상황임을 미리 이야기 해둡니다.

사실 윈폰7의 게임 개발 프레임웍쪽에는 아주 기대가 컸습니다. 게임 이라는 컨텐츠가 스마트폰의 킬러앱중의 하나이고, 특히 윈폰7에서 XNA를 기반으로 개발된 게임은 X-BOX에서도 수정없이 포팅되서 돌아갈 수 있기 때문에, 개발자 입장에서는 같은 컨텐츠로 콘솔 게임과 스마트폰 게임 시장 양쪽을 모두 공략할 수 있다는 장점을 가지고 있습니다. 그리고 타 스마트폰 플랫폼과 다르게 전용 게임 플랫폼을 제공한다는 것이 매우 흥미로웠습니다.
일전에 개발자 컨퍼런스에서 윈폰7 XNA를 이용한 3D 게임 개발 데모를 본적이 있었는데, Collision 처리 (충돌처리-두개의 개체가 충돌하였다는 것을 알려주는 처리-예를 들어 총알에 맞았다. 이런거..)가 API하나로 해결되고, 각종 3D 이펙트(먼지가 난다거나, 샤방샤방 별가루가 떨어지는 처리등)이 아주 쉽게 개발되는 것들이 아주 신기했기 때문에, 나름 기대를 하고 튜토리얼에 접했습니다. 사실 제가 게임 개발했을때는 이런건 다 날코딩으로 만들어야 했습니다. 심지어 Direct X 이전에는 애니메이션을 표현하기 위한 스프라이트 처리 엔진 조차 인라인 어셈블리로 다 만들어야 했으니까요.

아래는 예제로 따라서 만든 게임 스냅샷입니다.

따라 해보시면 아시겠지만, 상당히 간단합니다.
2D 게임이라서 그런지, 몬가 대단한것이 있을거라는 기대(?)에 몬가 대단한것은 나오지 않았습니다. (그도 그럴것이 2D 게임에 필요한 프레임웍들이 뻔하니..)

몇가지 특이한것만 집어 보겠습니다.

리소스 로딩
게임에 필요한 음성,캐릭터 이미지,백그라운드 이미지들을 로딩하고 관리해야 합니다. 보통 파일을 열어서 일일이 읽어서 메모리에 적재하고, 필요한 파일들도 배포할때, 묶어서 배포해야 하는데, 이부분이 상당히 편리합니다. 다른 스마트폰 플랫폼에서도 될것 같긴한데... 구닥다리 게임 개발자의 시야에서는 신기하더군요.
필요한 리소스들을 비주얼 스튜디오에서 레퍼런스 부분에 Import만 하면됩니다.
리소스들을 사용할때는

이렇게 Load만 해주면 됩니다.
마치 자바의 리소스 번들과 같은 느낌입니다. 배포할때는 모든 리소스들이 함께 패키징 되니까는 상당히 편리하져.

3 스크린 지원
MS의 전략중에 강력한 전략중 하나가, 3 스크린이라는 전략이 있습니다. TV-PC-모바일을 모두 지원하고, 하나의 플랫폼처럼 지원하겠다는 겁니다. VOD 서비스를 TV-PC-모바일을 통해서 각 장점을 통해서 하겠다 모.. 그런건데..
XNA기반의 게임 역시 이 전략의 연장선산에 있습니다.
위에서도 언급했듯이, XNA기반의 게임은 윈폰뿐만 아니라, X-BOX는 물론이고 PC용 윈도우에서도 작동됩니다.
이를 가능하게 하려면, XNA로 개발한 게임을 해당 타겟 플랫폼에 맞게 빌드하면됩니다.
위에 스크린샷에도 보면 알 수 있듯이 Windows와 X-Box 360용 프로젝트로 만들어서 컴파일이 됩니다.

게임 처리 프레임웍
게임 개발 플랫폼에서 당연한것이겠지만, 게임의 실행 사이클에 맞는 프레임웍을 제공합니다.
게임은 보통 하나의 화면 단위로 진행되고, 하나의 화면은 리소스 로딩후, [ 입력을 받고, 캐릭터의 위치나 충돌 처리등과 같은 계산을 하고, 계산 결과에 따라서 화면과 음성으로 출력] 하는 루프를 반복합니다. 이런 프레임웍들이 내부적으로 다 구현되어 있습니다.
예를 들어 화면 처리 패턴은
class GameplayScreen : GameScreen
이런식으로, 상위 클래스로 지정되어 있구요. :)
스프라이트 처리 패턴을 보면 다음과 같습니다.
SpriteBatch.Draw(tankTexture, player.Position, Color.White);
이런식으로요. 상당히 편리하져.
아직 전체 프레임웍을 다 본게 아니라서 모라 말하기는 어렵지만, 일단 게임 개발의 생산성을 높이고, 게임 개발 패턴을 위한 상당히 성숙된 프레임웍을 갖추고 있습니다.

다음에 시간이 되면 3D 게임쪽을 찾아서 한번 봐야 겠습니다. 3D 게임쪽에서 다른 스마트폰 플랫폼들과 차이가 많이 날것 같네요. 혹시 아이폰이나 안드로이드에서 게임쪽 프로그래밍 하신분 계시면 피드백 환영합니다.


=== 추가 ===

충돌 처리 로직
위에서도 잠깐 언급했었는데, 게임 프로그래밍에서는 충돌 처리 로직이 필요합니다.두개의 객체가 충돌했을때를 감지하는 로직인데, 위의 예제에서는 별도 API를 안쓰고, X,Y 좌표축만으로 해서 몰랐는데, 다른 예제를 보니까는 충돌 처리 API가 있네요.

        void CheckForCollision()
        {
            BoundingBox bb1 = new BoundingBox(new Vector3(spritePosition1.X - (sprite1Width / 2), spritePosition1.Y - (sprite1Height / 2), 0), new Vector3(spritePosition1.X + (sprite1Width / 2), spritePosition1.Y + (sprite1Height / 2), 0));
            BoundingBox bb2 = new BoundingBox(new Vector3(spritePosition2.X - (sprite2Width / 2), spritePosition2.Y - (sprite2Height / 2), 0), new Vector3(spritePosition2.X + (sprite2Width / 2), spritePosition2.Y + (sprite2Height / 2), 0));
            if (bb1.Intersects(bb2))
            {
                soundEffect.Play();
            }
        }

BoundingBox라는 사각형 공간을 정의하고 두 공간간에 충돌을 intersects라는 함수로 비교합니다.
잘 보시면 아시겠지만, BoundingBox를 정의하는것을 두개의 벡터로 정의합니다. 각각의 벡터는 3개의 좌표를 가지고 있습니다. X,Y,Z축 입니다. 즉!! 3D에서 충돌처리를 지원하기 위한 함수라는 것입니다. 위의 예제는 2D의 예제라서 Z축을 0으로 했네요.