effectiveui사의 CEO인 Anthony Franco가 발표한 10 Ways To Ensure RIA Failure 요약본이에요. 물론 야매TM 영어로 들은거라 엄청나게 오해한 내용도 있을테니 비디오를 직접 보시길…^^;; videos.visitmix.com/MIX09/c06f

 

시작 할 때 나오는 인상적인 도표.

UX를 말할 때 항상 나오는 "사용자". 하지만 좋은 사용자 경험을 제공하는 애플리케이션을 개발 하는 것은 결코 쉽지 않은 일이죠.

앤써니는 RIA를 개발 할 때 실패하고 싶다면 다음과 같이 하라고 역설하고 있어요. 노파심에서 얘기하지만 다시 말해, 아래에서 굵고 크게 붉은 글씨로 표시한 표제들을 하지 말라는 거에요^^ 물론 그 외의 굵은 글씨는 중요한 것을 의미하고요;

1. 최종 사용자를 고려하지 말 것.
DO NOT UNDERSTAND THE END USER

70%에 가까운 IT 프로젝트가 실패하는 이유는 실제 사용자가 받아들이지 않았기 때문이라는군요. 그러면서 예를 든 유명한 사례는 미국의 최초의 MP3P인 Diamond Rio인데요, Apple의 아이팟에 비해 모든 스펙이 앞서 있었을 뿐만 아니라 2년 동안이나 시장을 장악하고 있었지만 결국 지독하게 나쁜 사용성때문에 아이팟에세 떠밀리고 말았다고 해요.

결론으로 소프트웨어 개발의 새로운 황금률을 제시하는군요.

최종 사용자에게 강하게 집중하라!

  • 다른 모든 규칙은 부차적일 뿐이다
  • 다른 모든 실패는 절대적으로 이 조언을 무시했을 때 돌아오는 결과이다

 

2. 개발자들이 좋은 디자인 결정을 내릴거라고 믿을 것.

TRUST DEVELOPERS TO MAKE GOOD DESIGN DECISIONS

개발자들에게 UI를 맡겼을 때 나오는 결과. 왜 이런 결과가 나오냐에 대해 다음과 같이 정리하네요.

개발자들은 정말 좋지 않은 결정을 조장한다

  • 개발자들의 결과물은 프로젝트 계획이나 기능이나 일정에 기반한다
  • 개발자들은 데드라인에 맞출 수 없게 되면 최종 사용자가 진짜로 바라는 것에 집중하기 보다는 기능 구현에 전력을 다한다

이것은 디자이너와 개발자가 가지는 생각의 차이Mind Gap 때문인데 이런 생각의 차이를 메꾸기 위해 다음과 같이 제안하죠.

디자이너를 믿어라

  • 사용자는 애플리케이션이 Silverlight, AJAX, Flash, .Net… 어떤 것이든지 상관하지 않는다
  • 정치나 사조직이 끼어들도록 하지 말라
  • 기술적인 과제를 놓고 허심탄회하게 디자이너와 얘기하고 알려라, 그러면 디자이너는 싸우는게 아니라 함께 일하게 될 것이다
  • 좋은 디자이너는 최종 사용자와 그들의 요구를 뭔가 쓸만한 것으로 옮기는 데 도움을 줄 것이다
  • 의심이 들면 사용자에게 물어보라

 

3. 기적같은 아이디어의 디자인을 기대하라.

HOPE FOR A SILVER BULLET DESIGN

때로는 엄청난 아이디어가 중요하기도 하고 작은 변화가 큰 결과를 만들기도 하지만 기본적으로는 '효과'가 아닌 '내용'에게 집중하라는거죠. 정리하자면,

사용자를 믿어라

  • 공감이란 단어를 새겨놓고 사용자와 대화하여 행동하라
  • 사용자의 피드백을 바탕으로 자발적으로 아이디어를 내놓아라
  • 포트폴리오에 신경쓰지 말라
    • 만약 사용자가 UI에 신경쓴다면 분명히 실패할 것이다

음… 알아듣기 힘드네요. 어쨌든 그 외에도 사용자의 피드백을 문자 그대로 받지 말고 정확히 어떤 것을 원하는지를 생각하라는군요.

4. 모두를 위한 애플리케이션을 만들어라.

BUILD FOR EVERYONE

"모두를 위해 만든다면 아무에게도 필요없게 된다."

왜 아이폰 사례를 소개하는지 잘 못들었지만(=_=), 제목이 "iPhone의 저주"네요. 여기에서 왜 아이폰을 디자인의 사례로 생각하면 안되는지를 설명하는데요,

  • 애플은 엄청난 비용을 디자인에 쏟아 붓는다
  • 모든 컨트롤들이 과도하게 통합되어 있다
  • 사용하기 어렵다 – 직관적이지 않다
  • 익숙하게 하기 위해 마케팅에 비용을 쏟아 붓는다

그러니까 애플은 디자인과 사용자 경험으로 성공한 사례로 칭송받지만 사실 애플처럼 할 수 있는 기업은 거의 없다는 것을 지적하는 것 같네요. 특히 사용자 경험에 대한 관점이 그런데요, 사실 아이폰의 플립 슬라이드의 동작 방식이 경험이 없다면 어떻게 알 수 있겠어요? 바로 직관적이지 않다는 얘기죠. 그리고 애플은 그런 약점을 커버하기 위해 아이폰의 광고 대부분을 아이폰을 어떻게 사용하는지 애플리케이션을 어떻게 동작하는지에 할애하고 있다는 거죠. 그것도 엄청난 비용을 들여서요.

어쨌든 다음과 같이 결론을 내리는데요,

다음의 사항에 노력을 집중하라

  • 사용자가 공감할 수 있게
  • 하나의 프로젝트에 최대 3개의 페르소나Persona만 정의하고 그들에게 강력하게 집중하라

 

5. 런칭하고 잊어버려라.

LAUNCH & FORGET

뭐어… 런칭하고 나서도 꾸준히 사용자의 행동을 측정하고 분석하고 그런 피드백을 바탕으로 향상시킬 수 있게 하라는거죠.

 

6. 성공을 정의하지 말라.

DO NOT DEFINE SUCCESS

성공을 정의하려면, 기능이 아니라 이득benefit에 대해 토론하라

  • 질적인 이득
    • 고객이 빠른 업무 처리를 인지한다
    • 고객이 이 소프트웨어를 친구에게 추천한다
    • 브랜드 일관적이고 신뢰할 수 있는 경험이 되어야 한다
  • 양적인 이득
    • 배송을 추적하는데 드는 시간이 20% 감소한다
    • 선결제가 50% 증가한다
    • 고객 서비스 전화가 50% 감소한다

 

성공은 충돌을 수반한다, 적당한 균형을 찾아라

7. 모든 충돌을 피하라.

AVOID ALL CONFLICT

"충돌없는 진행는 없다"
"모든 사람이 동의한다면 프로젝트에 문제가 있다는 신호이다"

8. 아이디어까지 팔 필요는 없다고 믿어라.

BELIEVE YOU SHOULDN’T HAVE TO SELL YOUR IDEAS

아이디어를 팔기 위해서:

  • 프로젝트에 연관된 개인들을 이해하고 그들이 반대 의견과 걱정을 가져오기 전에 먼저 말하라
  • 고객의 의견을 듣고 당신의 의견이 그들과 일치한다는 것을 확신시켜라, 그리고 다른 고객들의 말을 빌어 말하라("전에 우리의 고객들이 얘기해준 것과 같네요…")
  • 겸손하지만 정렬적으로 아이디어를 말하라
  • 공격적으로 팔라

 

9. 완벽한 계획을 세워라.

PLAN FOR PERFECTION

심지어 길을 찾는 것도 많은 변수가 있고 변경이 있으니 개발은 어떻겠느냐는 거죠. 뭐 많이 얘기되었던 사항이죠.

 

10. 제품보다 프로세스에 가치를 두라.

VALUE PROCESS OVER THE PRODUCT

엄청나게 많은 프로세스 다이어그램이 있지만 어떤 것도 실제 프로젝트와 일치하지 않는다는군요. 제 아무리 좋은 프로세스와 방법론으로 '제 시간에' 개발 했을지라도 제품이 엉망이면 아무 의미가 없다고 정리하네요.

우리가 '아이디어'를 스케줄에 포함 할 수 있다면 좋겠지만 좋은 아이디어는 절대로 스케줄을 잡는다고 나오는게 아니죠. 소프트웨어 프로젝트는 건설 프로젝트와는 달리 완벽하게 설계하거나 예측할 수 없죠.

사람들은 전혀 기대하지 못한 상황에서 문제를 해결하는 경우가 많다고 해요.

뭐 그 뒤로는 회사 자랑이 조금 이어지고요^^

암튼, 몇몇은 이제 꽤나 잘 알려진 사항이지만 한번 쯤 들어볼만해요. 시간도 40분정도 밖에 안되니까요.

저작자 표시 동일 조건 변경 허락
Posted by gongdo

What’s New in Microsoft Silverlight 3 : http://videos.visitmix.com/MIX09/T14F 참고 :D

Silverlight 3 툴 지원

  • Visual Studio 2008 Tools for Silverlight 3 beta/RTM
    • XAP 압축률 향상
      • 10~30% 감소된 XAP파일 크기
    • 인터랙티브 디자이너
      • Visual Studio 2010에서 지원 예정
  • Expression Blend 3 preview
    • 최종 버전은 올해 말

Media Format 지원

  • H.264/AAC/MP4 디코더 지원
  • 산업 표준 포맷으로 광범위하게 사용되고 있으므로 지원하기로 결정
  • H.264 파일로 할 수 없는 것
    • DRM 지원
    • Windows Media Server에서 스트리밍 호스팅

GPU 가속 지원

  • 옵트인 기능 즉, 명시적으로 사용할 것을 지정해야 함
    • Param으로 EnableGPUAcceleration, EnableCacheVisualization를 true로 설정
    • 최종 서피스 렌더링에 GPU를 사용
  • 엘리먼트 마다 옵트인으로 적용
    • CacheMode="BitmapCache"로 설정해야 함
    • 여러 개의 엘리먼트가 조합되어 렌더링 될 때 GPU를 사용
    • 엘리먼트를 늘릴 때(Stretch) GPU를 사용
  • 브라우저와 full-screen 모드에서 모두 동작
  • GPU 가속이 가능한 클라이언트에서 성능 향상
    • 다른 어떤 비주얼도 수정하지 않아도 됨

(데모)
미디어 관련 : T43F, T19F, T56F
GPU 관련 : T17F

Perspective 3D(Projection)

  • Perspective 3D
    • 2D 오브젝트를 3D 공간에 배치
    • X,Y,Z 회전 및 X,Y,Z 회전 축 지정
    • 지역/전역 X,Y,Z 옵셋 지원
  • Element.Projection
    • 현재는 PlaneProjection만 지원

애니메이션 가속도 지원

  • 기본 지원되는 애니메이션 가속도 함수
    • CircleEase, SineEase, BackEase
    • ExponetialEase, PowerEase
    • QuadraticEase, CubicEase
    • QuarticEase, QuinticEase
    • ElasticEase, BounceEase
  • 커스텀 가속도 함수도 작성 가능
    • 자신만의 가속도 함수를 사용 가능

비트맵 이펙트와 픽셀 셰이더

  • 이펙트
    • 비주얼의 동작에 영향을 줌
    • 기본 지원되는 이펙트
      • Blur, DropShadow
  • 커스텀 이펙트
    • 커스텀 이펙트는 Shader로 구현됨
    • HLSL이라는 표준 코드를 사용
      • DX SDK 유틸리티를 사용하여 byte code로 컴파일
      • 실버라이트 3는 컴파일 된 byte code를 사용
    • 셰이더는 UI 엘리먼트가 렌더링 되기 전에 각각의 픽셀을 변경할 수 있는 기회를 제공
    • 셰이더 = 픽셀 단위 함수 혹은 명령
    • (Green screen 등)

픽셀 API

  • 두 개의 파츠
    • 동적 비트맵 생성
      • WriterbleBitmap
      • 비트맵에 있는 픽셀을 읽고 쓰기
    • 비주얼 트리를 비트맵에 렌더링하기
  • 시나리오
    • 동적인 이미지 생성(실시간 그래프 등)
    • 이미지 편집 및 효과
    • 비주얼 복사
      • reflections, drag effect 등

Raw 오디오/비디오 API

  • 픽셀 API와 비슷하지만 오디오/비디오를 위한 기능
  • 시나리오
    • 동적으로 사운드 생성
    • 커스텀 오디오/비디오 디코더 작성(DIVX, XVID 등)

자세한 데모 : T17F

로컬 메시징 지원

  • 실버라이트 플러그인 간 데이터 통신
    • 같은 페이지에 있는 여러 플러그인
    • 다른 브라우저 탭에 있는 여러 플러그인
    • 다른 브라우저에 있는 여러 플러그인
  • 구현
    • 공유 메모리(Shared memory)로 구현
    • "named pipes"와 같이 노출됨
    • 문자열 기반의 메시지

UI Framework 향상

  • 리소스 병합 기능(Merged Resource Dictionaries)
  • BasedOn 스타일(스타일 구조화)
  • 런타임에 스타일 변경 가능
  • 다중 선택 리스트박스
  • "Handled"된 라우트 이벤트를 수신하는 것이 가능
  • VSM에 "Invalid" 상태 추가
    • 입력 상태가 유효하지 않을 때를 의미
    • TextBox, CheckBox, ComboBox, ListBox, RadioButton 등

상세 : T16F

기타 향상

  • SystemColors
    • 플랫폼에서 사용중인 색상 테마
  • FileSaveDialog 지원
    • 명시적인 UI를 통한 저장 위치 결정 다이얼로그를 통해 파일 위치 결정
    • 보안상의 이유로 유저가 선택한 파일을 열고 쓸 수만 있음
  • 텍스트 향상
    • 클리어 타입 텍스트(베타 이후에 지원 예정)
    • CaretBrush(텍스트 박스 안에 있는 커서)
    • 텍스트 애니메이션을 위한 최적화 옵션
      • 텍스트가 정확한 픽셀에 정렬하기 위해 걸리는 것을 선택 가능
    • Glyphs도 시스템 폰트를 지원
  • 이미지 정렬

새 SDK 컨트롤

  • DockPanel, Expander, Label, TreeView, ViewBox, WrapPanel, ChildWindow, DatePickerTextBox, TabPanel
  • +기타…

그 외 중요한 추가 사항

  • 비즈니스 관점의 지원
    • 내비게이션 프레임워크(Frame, Page 모델)
    • 데이터 건트롤
    • SEO(검색 엔진 최적화) 지원
    • N-Tier 데이터 모델 지원
    • T40F 참고
  • WebService 스택 향상
    • Binary XML, SOAP faults, Credentials 지원
    • T42F 참고
  • Silverlight Toolkit
    • T15F 참고

"Out of the Browser" 지원

  • 실버라이트를 브라우저 바깥에서 실행 가능
    • 그러나 일반 애플리케이션과는 다르게 철저하게 Sandbox 보안 모델 내에서 실행됨
    • 브라우저에서 실행하는 것과 정확하게 동일한 보안 모델 및 사용성을 가짐
  • 실버라이트 코어 런타임에 통합
    • 브라우저 바깥에서 실행 될 때 SilverlightLauncher가 실행되고 그 위에서 동작
  • 애플리케이션 단위로 사용 가능
    • Manifest에 애플리케이션을 설명
    • Deployment.ApplicationIdentity
  • 설치 경험
    • 우클릭하여 Install 선택
      • 데스크탑과 프로그램 그룹에 추가할지 여부 선택
    • 또는 설치를 위해 커스텀 버튼을 추가 가능
      • Application.Current.Detach
    • 삭제는 단순히 우클릭 후 Uninstall 한방으로 끝
  • 새 네트워크 API
    • 연결/연결 안됨 상태
    • 상태 변경됨 이벤트
  • Offline API
    • 브라우저에서 실행되었는지 브라우저 바깥에서 실행되었는지 상태
      • Application.Current.RunningOffline
    • 업데이트 API 등
      • 기본적으로 Online상태일 경우 새 버전의 XAP을 자동으로 설치
  • 비즈니스 관점의 지원
저작자 표시 동일 조건 변경 허락
Posted by gongdo

음… 한 달 전에 월간 마이크로소프트에 실버라이트 데이터 바인딩에 대해 기고를 했는데요, 3월호에 실렸더군요. 전 모르고 있었는데…(이건 뭔가… ┐─) 이 글은 총 3회로 나누어 쓴 글로 현재 2회까지 기고를 했고 아마 4월호에 두 번째 내용이 나갈거에요. 글의 저작권은 제게 있지만 월간 마이크로소프트가 나오면 그 때 올리도록 할께요.

--------------------------

데이터의 표현과 로직의 분리

표현과 로직의 분리. 얼마나 아름다운 말인가! 그러나 우리는 십수년간 사용해왔던 HTML의 경험으로부터 결코 쉽지만은 않다는 걸 배웠을뿐이다. 그렇지 않은가? 여러분은 디자이너가 만든 HTML 레이아웃을 손대지 않고 얼마나 작업할 수 있는가? 여러분은 데이터의 표현을 얼마나 협업의 고통 없이 수정할 수 있는가?

실버라이트가 출시된지도 벌써 2년이 다 되어간다. 결코 긴 시간은 아니지만 경험을 쌓기엔 충분한 시간이다. 현장에서 접하는 실버라이트는 어떤 모습인가? 필자를 포함한 얼리어답터들이 주장하던 것 처럼 정말로 표현과 로직이 잘 분리되어 디자이너와 개발자가 원활한 협업을 하고 있는가?

필자의 답은 ‘아니오’이다. 우리는 여전히 HTML 시절에 겪었던 문제를 고스란히 안고 있고 여전히 디자이너의 결과물을 개발자가 망치고 있으며 데이터의 표현이 변경될 필요가 있을 때 디자이너와 소모적인 코드 수정을 하고 있다. 다만 HTML에 비해 레이아웃이나 표현을 하기가 쉬워졌고 엄격한 XML 문법으로 인하여 구조적인 문제가 줄었을 뿐이다.

그렇다면 도대체 무엇이 문제일까? 단지 디자이너가 툴에 익숙하지 않아서 협업이 이루어지지 않는다고 말한다면 그것은 ‘비겁한 변명’일 것이다. 필자는 실버라이트가 표현과 로직을 분리하기 위한 도구와 기법들을 제공함에도 불구하고 별반 나아진게 없는 문제의 원인을 패러다임의 변화에 적응하지 못하는 우리 개발자에게 돌리고 싶다. 그러나 처음부터 너무 비관적으로 될 필요는 없다. 문제를 발견했다면 그것을 해결할 뿐. 오히려 문제를 푸는 과정이 재밌다고 느껴지지 않는가? 기존의 경험으로부터 정리된 통찰을 이끌어내는 과정은 짜릿하지 않은가?

물론 모든 문제를 해결하는 마법 같은건 존재하지 않지만 적어도 몇몇 문제를 해결하는 좋은 방법 정도는 존재하는 법이다. 앞으로 연재될 이 글을 통해 데이터의 표현과 로직을 보다 효율적으로 분리하는 방법을 연구해보고 아주 조금이라도 디자이너와 개발자가 협업의 고통을 줄였으면 하는 바램이다.

처음 기고하다 보니 의욕이 넘쳐 서론이 길었다(^^a). 그럼 본격적으로 데이터와 표현과 로직을 분리하기 위해 반드시 익혀야 할 실버라이트의 데이터 바인딩에 대해 연구해보자.

전형적인 데이터 표현 과정

메신저나 커뮤니티 회원 명부 등에서 볼 수 있는 회원 카드 애플리케이션을 생각해보자. 단순하게 ID, 사진, 이메일 주소, 블로그 주소, 생일 정보 정도면 충분할 것이다. 필자는 다음과 같은 구조의 프로젝트를 만들어 봤다.


[그림 1. 샘플 프로젝트의 구조]

먼저 데이터를 다루는 Model 폴더에는 회원 정보 클래스인 Profile.cs가 있고 회원 정보를 제공하는 서비스를 시뮬레이션하는 MockProfileService가 있다. 물론 제대로 하려면 웹 서버를 구축하여 서버에서 데이터를 가져와야 겠지만 그렇게 구성되었다고 가정하겠다. MockProfileService는 다음과 같이 회원 정보를 랜덤하게 반환하는 GetAnyProfile 메서드와 주어진 회원 정보를 업데이트하는 UpdateProfile 메서드를 노출하고 있다.

public Profile GetAnyProfile() //생략
public void UpdateProfile(Profile profile) //생략

[리스트 1. MockProfileService 클래스가 노출하고 있는 메서드]

다음으로 회원 카드를 보여주기 위한 유저 컨트롤인 CardView가 View폴더에 있다. 익스프레션 블렌드를 사용하여 다음과 같이 간단하게 디자인했다.


[그림 2. 간단한 회원 카드 디자인(말할 것도 없이 엉망이다.)]

디자인은 IdLabel, ProfileIamge, BritdayInput과 같이 직관적인 이름으로 오브젝트를 배치했다. 뭔가 아니다 싶은 디자인이 보이는가? 이것이 필자가 개발자라는 직업을 선택한 이유 중 하나이다. 어쨌든 지금은 디자인의 품질이 중요한게 아니므로 이쯤하고 넘어가도록 하자.

앞에서 디자인한 유저 컨트롤의 코드 비하인드인 CardView.xaml.cs 파일을 열어보면 Profile 속성을 설정했을 때 해당 회원의 데이터를 화면에 보여주고, 또한 TextBox의 Text속성이 변경되었을 때 ProfileUpdated 이벤트를 던지는 코드가 작성되어 있다.

private Profile _profile;
public Profile Profile
{
    get { return _profile; }
    set
    {
        _profile = value;
        // 입력 받은 정보로 UI를 업데이트
        IdLabel.Text = _profile.Id;
        BirthdayInput.Text = _profile.Birthday.ToString("yyyy-MM-dd");
        EmailInput.Text = _profile.Email;
        BlogInput.Text = _profile.Blog;
    }
}

// 입력창의 포커스가 벗어났을 때 값을 변경하는 코드들
void BirthdayInput_LostFocus(object sender, RoutedEventArgs e)
{
    Profile.Birthday = DateTime.Parse(BirthdayInput.Text);
    FireProfileUpdated();
}

[리스트 2. CardView의 코드 비하인드에 작성된 지루한 코드의 일부]

마지막으로 루트 비주얼인 Page.xaml에는 버튼 하나와 MyCard라는 이름의 CardView 하나를 올려놓았고 Page의 코드 비하인드인 Page.xaml.cs를 보면 MockProfileService의 인스턴스를 하나 만들어놓고 컨트롤이 초기화되거나 버튼을 클릭했을 때 서비스의 GetAnyProfile 메서드를 호출하여 MyCard의 Profile 속성을 설정하게 되어 있으며, MyCard에서 ProfileUpdated 이벤트가 발생했을 때 MockProfileService의 UpdateProfile 메서드를 호출하여 변경된 데이터를 업데이트하고 있다.

솔루션을 빌드하고 실행해 보면 버튼을 클릭할 때마다 샘플로 작성한 데이터 중 하나를 랜덤으로 표시하는 것을 볼 수 있고 텍스트 박스 중 하나를 변경하면 변경된 데이터가 실행되고 있는 동안에는 유지되는 것을 확인할 수 있다. 자세한 코드와 동작은 다운로드 받은 파일의 압축을 풀고 [DataBinding Take1] 폴더에 있는 소스코드를 열어 직접 확인하길 바란다.


[그림 3. 회원 카드 애플리케이션의 동작 화면]

어쨌든 이 애플리케이션은 잘 동작한다. 실무에서 이 정도 코드면 충분하다. 아니, 충분했었다. 그럼 도대체 무엇때문에 잘 동작하는 코드를 바꿔야 할까? 이 프로젝트는 협업과 유지보수의 관점에서 적어도 네 가지 이상의 문제점을 가지고 있다. 여러분도 읽기 전에 한 번 생각해보길 바란다.

  • 불필요한 임시 데이터가 XAML에 직접 하드코딩 되어 있다. 혹시 임시 데이터라고 아무렇게나 데이터를 넣었다가 실제 런타임에 고객에게 노출된 적은 없는가?
  • 디자인에 들어가야 할 구성요소의 종류가 강제되고 있으며 이름을 정확히 맞춰주지 않으면 CardView.xaml.cs에 있는 코드는 무용지물이 된다. 디자이너의 표현력이 코드 때문에 제한받고 있지 않은가?
  • CardView에서 Profile 속성의 세터(setter)를 보자. Profile 데이터 하나하나를 다시 설정하고 있다. 만약 더 많은 속성이 추가되거나 변경된다면 그때마다 이렇게 단순 반복적이고 소모적인 코드를 다시 작성하고 싶은가?
  • 디자인이 변경되었을 때 역시 이 과정을 다시 반복할 것인가?
  • 또한 입력한 값이 유효한지 확인하는 처리까지 들어간다면 복잡도는 더욱 늘어날 것이다.

데이터 바인딩 예제

데이터 바인딩은 컨트롤의 특수한 속성과 XAML의 몇 가지 표현식을 사용한다. 데이터 바인딩을 설명하기 전에 먼저 사용 예제를 보도록 하자. 앞에서 작성한 코드에서 아주 조금만 고쳐도 상당히 쾌적해진다. 물론 모든 문제를 한꺼번에 해결할 수는 없지만 하나씩 단계적으로 잡아 나가도록 하겠다. 역시 자세한 코드는 [DataBinding Take2 - binding basic] 폴더의 코드를 참고하길 바란다.

먼저 CardView에 작성했던 지루한 설정/업데이트 코드들을 시원하게 날려버리자. 컴포넌트 초기화를 제외한 모든 코드를 말 그대로 지우면 된다. Profile을 받고 XAML에 어떤 디자인에 어떻게 설정해야 할지 고민할 필요가 없다.

public partial class CardView : UserControl
{
    public CardView()
    {
        InitializeComponent();
    }
}

[리스트 3. CardView.xaml.cs: 단순해진, 아니 텅비게 된 CardView의 코드 비하인드]

앞의 코드를 제거하면 업데이트 등으로 사용했던 이벤트가 삭제되어 Page.xaml.cs에서 오류가 발생한다. 여기에서도 불필요한 이벤트 처리등을 제거하자. 다만 버튼을 클릭하여 회원 정보를 다시 받아야 할 때 다음과 같이 MyCard의 DataContext 속성을 설정하기만 하면 된다.

private void UpdateProfile()
{
    // 서비스 호출(웹 서비스 등의 호출을 통해 받았다고 가정)
    Profile profile = _service.GetAnyProfile();

// 회원 카드의 정보 업데이트
    MyCard.DataContext = profile;
}

[리스트 4. Page.xaml.cs: CardView에 대한 의존성이 줄어든 Page의 코드 비하인드]

CardView의 인스턴스인 MyCard를 사용하는 곳이 UpdateProfile 메서드 단 한 곳으로 줄었다. 나중에 뭔가 변경이 생기더라도 간편하게, 대부분은 전혀 손대지 않고도 적용이 가능할 것이다.

다음으로 DataContext에 설정된 회원 데이터를 CardView에 보여줘야 한다. CardView.xaml에 데이터 바인딩 표현식을 사용하여 데이터를 표시하면 된다. 지면 관계상 핵심적인 부분만 표시하였다.

<TextBlock Text="{Binding Id}" />
<Image Source="{Binding Picture}" />
<Grid >
        <TextBlock Text="Birthday" />
        <TextBox Text="{Binding Birthday, Mode=TwoWay}" />
        <TextBlock Text="Email" />
        <TextBox Text="{Binding Email, Mode=TwoWay}"  />
        <TextBlock Text="Blog" />
        <TextBox Text="{Binding Blog, Mode=TwoWay}" />
</Grid>

[리스트 5. CardView.xaml: Binding 표현식으로 설정된 CardView]

센스있는 독자라면 굳이 설명하지않더라도 위의 코드가 무엇을 의미하는지 눈치 챘을 것이다. <TextBlock Text="{Binding Id}" …/> 코드를 예로 들어 간단하게 말로 하자면 “TextBlock의 Text 속성을 Id라는 이름을 가진 속성으로 바인딩(Binding)한다.”라고 할 수 있다. 물론 여기에서 Id라는 이름을 가진 속성은 CardView 유저 컨트롤의 DataContext에 설정된 데이터에서 가져오는 것임은 말 할 것도 없다.

아래쪽에는 좀 더 흥미있는 표현식이 보이는데, <TextBox Text="{Binding Birthday, Mode=TwoWay}" …/> 코드를 예로 들자면 “TextBox의 Text 속성을 Birthday라는 이름을 가진 속성으로 바인딩하되, 바인딩 모드는 양방향(TwoWay)로 한다.”라고 할 수 있다. 여기에서 TwoWay라는 모드는 그 이름에서 추측할 수 있듯이 바인딩 된 대상 오브젝트의 속성이 변경될 경우 역으로 바인딩 된 원본 데이터의 속성도 변경시켜 서로 동기화시킨다는 의미이다. 보통 TextBox나 CheckBox, RadioButton과 같이 사용자가 값을 입력하거나 선택할 수 있는 컨트롤의 속성에 많이 이용된다. 실행결과는 당연하게도 앞의 프로젝트와 동일하다.


[그림4. 데이터 바인딩을 사용한 실행 화면]

자 어떤가? 데이터 바인딩을 사용하여 50라인이 넘는 코드를 삭제하고 아주 단순한 코드와 표현식만으로 서비스에서 받은 데이터를 효과적으로 표시하는 것이 가능해졌다. 특히 CardView의 XAML 코드에는 x:Name이라는 속성 없이도 데이터를 표현하는 것이 가능하므로 디자이너가 더 이상 개발자와 골치아픈 이름 짓기 문제로 싸울 필요가 없게 되었다. 물론 의미가 있는 오브젝트에 x:Name으로 그 오브젝트를 설명하는 것은 훌륭한 시도이다. 그러나 이 이름은 어디까지나 참고일 뿐이지 실제 코드 작성에 반드시 필요한 것이 아니므로 디자이너든 개발자든 마음대로 이름을 지어도 된다. 이것만으로도 행복하지 않은가!

또한, CardView를 제어하고 CardView에서 일어나는 동작을 감시하여 별도의 처리를 해줘야 했던 Page 유저 컨트롤 역시 CardView와의 의존성이 줄어들고 CardView에게 필요한 데이터를 줘 버리고 모른척할 수 있게 되었다. 서로의 의존성을 줄이는 것, 이것이야말로 개체지향 프로그래밍의 성배가 아니었던가!

물론 여기에는 문제점도 남아있다. 블렌드로 CardView 유저 컨트롤을 열어보자.


[그림5. 데이터 바인딩된 유저 컨트롤의 모습]

데이터 바인딩을 위해 사용한 표현식때문에 앞에서 임시로 넣었던 데이터는 온데간데가 없다. 다만 해당 속성에는 데이터 바인딩을 사용하고 있음을 알리는 노란색 테두리가 있을 뿐. 이래서야 디자이너가 디자인을 변경할 때 결과물을 쉽게 예측하기 어렵다. 아니, 불가능하다.

또한 데이터 바인딩을 사용한 실행 결과를 보면 날짜 필드가 우리가 기대한 것과는 달리 년/월/일만 나온게 아니라 월/일/년에 시간까지 나온다. 이래서야 단순 바인딩은 제대로 쓸 수 없다.

사실 필자도 처음에는 이런 문제점 때문에 데이터 바인딩을 사용하지 않았었다! 그렇다면 데이터 바인딩으로 디자이너와의 협업을 보다 원활하게 한다는 필자의 말이 거짓이란 말인가. 물론 아니다. 필자는 앞으로 진행되는 연재를 통해 이 문제를 우아하게(?) 해결하는 법을 소개하고자 한다. 물론 데이터 바인딩을 소개하기 위해 건너뛴 데이터 바인딩의 이론적인 기초 및 중요한 문법에 대해서도 소개할 것을 약속한다.

참고 자료

저작자 표시 비영리 변경 금지
Posted by gongdo

매년 MIX에서는 실버라이트에 대한 굵직한 릴리즈와 정보가 쏟아지죠. 이번 MIX09에서는 드디어 Silverlight 3가 베일을 벗었어요. 2가 나온지 얼마나 되었다고 벌써 3가 다가오고 있죠. 물론 잦은 릴리즈가 현업에 압박으로 다가올 수도 있지만 개발 프로세스를 잘 준비한다면 2에서 할 수 있는 것과 3에서만 되는 것… 이렇게 구분을 하여 대응할 수 있을거에요.

마이크로소프트는 실버라이트의 릴리즈 주기를 9~12개월로 빠르게 한다는 계획을 발표한 적도 있는데요, 그만큼 RIA의 개발이 정형화되지 않았기에 그만큼 현업의 요구를 빠르게 수용하겠다는 의미로 받아들일 수도 있죠.

앞으로의 실버라이트의 큰 뼈대는 2를 기반으로 계속하여 새로운 기능이 추가되는 형식이다…라고 얘기들 하는데요, 물론 닷넷 코드 베이스라는 개발 프로세스를 놓고 보면 맞는 말이지만, 솔직히 제 느낌으로는 오프라인 지원 등의 너무나도 굵직한 내용 때문에 3를 기반으로 새로운 기능이 추가되거나 향상된다… 라고 얘기하고 싶어요.

어쨌든, 실버라이트 3가 제게 강한 인상을 주는건 단순히 새로운 기능들 때문이 아니에요. Perspective 3D, 비트맵 프로세싱, GPU 가속, H.264 지원(아직 불완전하지만), 오프라인 및 데스크탑 설치 지원, 폰트 가독성의 지속적인 향상, 더 많은 컨트롤 지원, 스타일 병합, 브라우저 스택을 사용하지 않는 순수 HTTP 요청, 블렌드 3의 비약적 향상, 데이터 친화적인 개발 환경… 이것들은 바로 실버라이트 2에서 Adoption Blocker로 작용하던 요소들이었고 실버라이트 3는 이런 요소를 적극적으로 해소하기 시작한 첫 버전이라고 생각해요. 전에 없이 현업의 요구사항과 개발 커뮤니티에서 나온 훌륭한 실험 결과를 적극적으로 그리고 대규모로 수용한 첫 버전이란 말이죠.

실버라이트 1.1과 2에서는 사실 몇몇 시나리오에서 필요한 기능을 중심으로 홍보되었고 또 사용되었어요. 바로 미디어와 딥줌이죠. 물론 텍스트 지원 향상, 컨트롤 모델 지원 등의 굵직한 내용도 있었고 미디어와 딥줌 외의 다른 분야에도 시도된 사례가 많지만 상업적으로 의미가 있었던 건 역시 미디어와 딥줌 뿐이었다고 생각해요.
(그간 다른 곳에 적용하려고 얼마나 삽질을 했었던지 =_=)

실버라이트 3는 이제 그간 플래시만이 독보적인 지위를 차지하고 있던 모든 RIA 시장에 참가할 수 있게 되었어요. 뿐만 아니라 깜짝 놀랄만한 오프라인/데스크탑 설치 시나리오 지원으로 AIR만이 할 수 있었던 그것도 가능해졌죠. 비공식적이기도 하고 물론 짜는 사람에 따라 다르겠지만 단순한 코드 실행 성능은 이미 실버라이트 2가 앞서 있다는 점을 감안했을 때 앞으로의 상황이 너무나도 기대되고 흥분돼요.

자, 좋은 얘기는 다 했고 아쉬운 점을 얘기해보자면… 웹 카메라와 마이크로폰! 최근 닌텐도 DS에도 채용되어 더욱 재밌는 사용자 경험을 제공할 수 있는 기회가 아쉽게도 다음으로 미뤄졌어요. 뭐 크게 아쉬운 기능은 아니지만서도 말이죠. 다음으로 블렌드. 물론 이번에 엄청난 기능 향상과 추가가 있었지만 제가 보기엔 (아직 써보지 않았어요) 아주 자잘한 인터랙션들은 크게 개선되지 않은 것 같아요. 예를 들어 타임라인에서 키프레임을 드래그하여 선택한다거나 하는… 사실 없어도 못쓰는 건 아니지만 그런게 디자이너의 접근을 막는 요소이기도 하죠. 여튼 이 얘기는 글로벌 서밋때도 나왔으니 아마도 개선될 거에요.

아직 써보지도 않고 써내려간 얘기라 기대감이 더 크네요. 부디 2 베타때 겪었던 엄청난 버그의 홍수는 없길 바라면서 버추얼 머신에 실버라이트 3 개발환경을 설치하며 주절거려봤어요. Silverlight Rocks! XD

저작자 표시 동일 조건 변경 허락
Posted by gongdo

살다보니 마이크로소프트가 이런 것도 하네요^^ 지금 MSDN 사이트에 가보시면 MIX로 단장한 페이지를 볼 수 있어요.
예를 들면 http://msdn.microsoft.com/en-us/library/system.windows.media.matrixtransform.aspx 이런곳…

저작자 표시 동일 조건 변경 허락
Posted by gongdo
TAG MIX09, MSDN

아침을 후다닥 먹고 Bill의 키노트 듣는 중…
무선 인터넷 연결되는게 없네요 –_-

최근 들어 마이크로소프트의 컨퍼런스에 빠지지 않는 내용은 바로 Experience죠. 키노트에서도 사용자 경험에 대한 얘기를 무척이나 강조하네요.

특히 디자인 경험에 있어서 스케치, 프로토타이핑에서의 과정과 문제점들 종이를 사용한 유용한 기법들에 대한 간단한 소개도 있었고요. 또한 어떤 상태가 전환될 때에는 트랜지션Transition이 수반되어야 과정의 변화를 자연스럽게 전할 수 있다는 얘기를 강조… 아마도 실버라이트의 Visual State Manager를 염두한 것이겠죠. 그러면서 살짝 SketchFlow의 스크린 샷도 나오고요.^^ SketchFlow는 아래에…

여튼 마이크로소프트가 UX와 디자인 경험에 얼마나 투자를 하고 있는지 강조하는게 인상적이었고 저도 좋아하는 모델인 마이크로소프트 ARC 마우스의 디자인 사례도 소개하더군요. 또 ZUNE의 사례에서는 단순한 하드웨어 혹은 소프트웨어가 아니라 eco-system을 고려하는 설계 철학도 설명하고요.

 

다음으로는 스캇거쓰리 쑈쑈쑈~

Expression Web 3가 제일 먼저 소개되었는데요, 이런저런 향상이 있지만 가장 인상적이었던 것은 SuperPreview라고 불리우는 기능이에요. SuperPreview는,

- 클라우드에 올라가 있는 렌더링 엔진을 사용
- 인스톨되지 않아도 다른 브라우저들을 사용하여 preview
- 오버레이, 스플릿 모드 등으로 동시에 각 브라우저간 차이를 찾을 수 있음
- SuperPreview: IE6, 7, 8은 지금 Beta 가능

이런 특성들을 가지고 있는데요, 진짜 웹 호환성 작업에 엄청나게 도움을 줄 거에요. 진짜 대단!

 

다음으로는 ASP.NET MVC 1.0
- Shipping today! 라는군요^^

ASP.NET 4 and VS 2010에 대한 소개도 있었고… 
- Web Forms
- MVC
- AJAX
- Distributed Caching

- Code focused improvements
- javascript/AJAX/jQuery tooling
- SharePoint
-Publishing & deployment

 

 

웹 개발에 필요한 도구를 App Gallery까지 포함하여 설치할 수 있는 Web Platform Installer에 대한 소개도 있었어요.
정말 편리할 듯!

 

Commerce Server 2009도 – Today! 릴리즈되고요^^

 

다음으로 드디어 실버라이트 3 소식.

실버라이트를 사용한 새 버전의 버추얼 어스가 준비되고 있다는군요. 거 왜 우주까지 보이는거 있잖아요.
Netflix사와 실버라이트 미디어 경험에 대한 얘기가 이어졌고요.
 

SL3 Media
- GPU 가속
- New codec (H.264, AAC, MPEG-4)
- Raw bitstream Audio/Video API
- Improved logging for media analytics

IIS Media Services
- On-demand smooth streaming
- Live smooth streaming[new]
- Edge caching
- Web playlists
- Bitrate throttling
- Advanced logging

와 같은 기능이 제공된대요. 역시 가장 환영할만 한 건 GPU 가속을 사용한 성능 향상!
그리고 Smooth Streaming은 사용자의 대역폭에 따라 서버에 준비된 다양한 bitrate의 동영상을 자동으로 선택하여 스트리밍하는데 중간에 버퍼링이 거의 없게 만드는 기술이죠. 이건 직접 보면 끝내줘요^^
그렇지만 가장 인상적이었던 건 라이브 방송을 보면서도 내부적으로 데이터를 저장하고 있다가 일시정지나 이전 장면 조그셔틀과 같은 기능을 사용할 수 있어요. 이제 TV 필요 없겠어요 정말…;

NBC 방송은 2010 밴쿠버 올림픽 중계에 실버라이트의 이런 모든 기능을 적극적으로 사용할 것이며 100% Smooth Streaming과 Full 720p HD 화면으로 중계할거래요.

 

Graphics 기능에서는,
- GPU
- Perspective 3D
- Bitmap & pixel API
- Pixel shader effect
- DeepZoom improvements

가 제공되는데요, 스캇구가 Perspective 3D를 활용한 멋진 데모를 보여줬어요. 이건 말로는 어려우니 나중에 동영상으로 확인하시길.

 

Application Development 을 위해 다음과 같은 사항들이 지원된다고 하고요,
- Deep linking, navigation and SEO
- Improved text quality
- Multi-touch support
- 100+ controls
- Library caching support

 

Vertigo에서 구현한 RollingStone 잡지 데모가 나왔어요.
기본적으로 딥줌을 사용한 것이지만 정말 차원이 다르네요.
검색, DeepLink, DeepZoom, Perspective 3D가 녹아들어간 데모. 직접 보셔야해요!

 

Epxression Blend 3에는 다음의 기능이 추가되고요

Workflow
Expression Blend 3
- SketchFlow
- Adobe Photoshop & Illustrator file import
- Behaviors
- Designing with data
- Source code control
- Xaml, C# & VB code intellisense

 

그리고 이번 키노트에서 가장 멋졌던 것은 바로 Expression Blend 3에 탑재된 Sketch Flow! 
근데 이건 꼭꼭꼭 동영상을 봐야 해요!

SketchFlow
- Prototype에 적합한 컨트롤 스타일을 제공하고,
- SketchFlow Player
- with Transition(Animation)
- Feedback을 직접 컨셉위에서 수정
- Document export 기능!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- Behavior를 사용하여 Action, Navigate 등을 사용 가능!! 커스터마이징하여 복잡한 Drag&Drop등까지도 가능
- Photoshop importing
- SampleData 매니징 기능, Drag&Drop –> 곧바로 ListBox로 삽입 –> Stle을 사용하여 단순한 ListBox를 수정
- DataTemplate도 향상되었네~

 

Eclipse Support for Silverlight on MAC, 이건 뭐 그닥…

 

나머지는 졸려서 그냥 메모만…

Data
- Data binding improvements
- Validation error templates
- Server data push improvements
- Binary XML networking support
- Multi-Tier REST data support

 

Silverlight Business Apps
- SAP NetWeaver Support

 

Out of Browser Scenarios
- Extend media experiences
- Companion applications for your web site
- Lightwegiht data snacking applications

- Simple consumer friendly experience
- Safe, secure, sandboxed environment
- Built-in auto-update support
- Build offline-aware applications
- Integrate with underlying operating system

KEXP
90.3 FM Seattle / Tom Mara & Aaron Starkey
- 뭐야 Air랑 똑같이 되잖아~~~
- Desktop 바로가기 도 가능
- Offline/Online 감지
- 자동 업데이트

 

이 모든 기능들이 들어간 실버라이트의 다운로드 용량은 무려 2에 비해서도 40kb가 줄어들었대요!
그러면서도 당연히 Silverlight 2와 하위호환성을 갖고요.

 

마지막으로 오늘 지금 당장 다운로드 받을 수 있는 것들.

Download Now!
- Silverlight 3 beta : http://www.microsoft.com/downloads/details.aspx?FamilyID=D09B6ECF-9A45-4D99-B752-2A330A937BC4&displaylang=en
- Expression Blend 3 beta : http://download.microsoft.com/download/F/9/C/F9C8EAEE-B3B6-44C9-9854-3C0AF0602AE1/Blend_Trial_en.exe
- Silverlight 3 Tools for Visual Studio 2008 : http://www.microsoft.com/downloads/details.aspx?FamilyID=11DC7151-DBD6-4E39-878F-5081863CBB5D&displaylang=en
- IIS Media Services : http://www.microsoft.com/web/gallery/install.aspx?appsxml=www.microsoft.com/web/webpi/2.0/WebProductList.xml;www.microsoft.com/web/webpi/2.0/WebProductList.xml&appid=145;146

 

단, 모든 베타/프리뷰는 기존 버전을 삭제하고 설치해야 하니까 개발 머신에서 하기보담 VPC등을 이용하세요^^

저도 빨리 깔아보고 싶은데 시간이 부족하네요.
그럼 또 중계를…

저작자 표시 동일 조건 변경 허락
Posted by gongdo