Silverlight 개발: Silverlight에서 비즈니스 응용 프로그램 구축

Silverlight는 LOB(기간 업무) 응용 프로그램을 개발 및 배포하기 위한 견고한 플랫폼으로 발전했습니다.

Gill Cleeren과 Kevin Dockx

Microsoft가 Silverlight를 내놓은 이후 3년이라는 짧은 시간이 지났습니다. Microsoft의 새로운 RIA(다기능 인터넷 응용 프로그램) 플랫폼인 Silverlight의 첫 버전은 라스베이거스에서 열린 Mix07에서 대중에 공개되었습니다. 현재 Silverlight는 비즈니스 응용 프로그램을 개발 및 유지 관리할 수 있는 플랫폼으로 성장했습니다.

Silverlight 1.0의 프로그래밍 모델은 XAML 및 JavaScript를 기반으로 했습니다. 후자는 기업용 응용 프로그램 구축 용도로는 다소 맞지 않습니다. 그 결과 첫 버전은 주로 미디어 중심의 시나리오에 사용되었습니다. Silverlight 2가 출시되면서 이 플랫폼은 LOB(기간 업무) 응용 프로그램을 개발하기 위한 뛰어난 후보로 부상했습니다. 가장 중요한 변화는 JavaScript 대신 .NET(C# 또는 VB.NET)으로 코딩이 가능해졌다는 점이었습니다.

LOB 응용 프로그램 구축을 위한 Silverlight의 기능과 적합성을 “테스트”하기 위해 일반적인 비즈니스 응용 프로그램 요구 사항 목록을 간단히 정리해보았습니다. Silverlight가 이러한 요구 사항을 충족할 수 있는지 살펴보도록 하겠습니다.

데이터, 데이터, 데이터

비즈니스 응용 프로그램이라고 하면 무엇이 떠오르십니까? 데이터가 왕입니다. Silverlight 응용 프로그램은 클라이언트 측, 브라우저 내에서 실행됩니다. 그러나 데이터는 서버 측의 데이터베이스에 상주합니다. Silverlight 네임스페이스와 어셈블리는 ADO.NET을 지원하지 않으므로 DataReaders 또는 LINQ-To-SQL과 같은 잘 알려진 기능을 지원하지 않습니다.

또한 Silverlight에는 클라이언트 측 데이터베이스가 없습니다. 어차피 대부분 클라이언트 측 데이터베이스로 문제가 해결되지도 않습니다. 민감한 정보가 포함된 데이터베이스의 임시 복사본이 의도하지 않게 클라이언트의 시스템에 저장되기를 원하지는 않을 것이기 때문입니다.

해결책은 간단합니다. 데이터베이스 위에 서비스 계층을 추가하는 것입니다. 이 서비스 계층을 사용해서, 가급적이면 비즈니스 계층을 통해 데이터베이스에 연결할 수 있습니다. 그러면 클라이언트 측에서 Silverlight는 이러한 서비스에 연결해서 데이터에 액세스할 수 있습니다(그림 1 참조).

Figure 1 Silverlight can connect to services on the client side

그림 1 Silverlight는 클라이언트 측에서 서비스에 연결할 수 있습니다.

Silverlight는 ASMX, WCF 및 REST 서비스 유형을 지원합니다. 또한 Silverlight를 사용하면 소켓 및 net.tcp와 같은 특수한 유형의 서비스도 이용할 수 있습니다. 기업 내의 기존 기술 스택에 Silverlight를 추가한다면 이러한 특성이 유용할 것입니다. Silverlight가 데이터를 얻을 수 있는 서비스는 다른 응용 프로그램 유형에 사용하는 것과 같은 서비스입니다.

Silverlight 관점에서 ASMX와 WCF의 작동 방식은 비슷합니다. 서비스를 구현한다면 기본적으로 WCF를 선택해야 합니다. WCF 서비스에 연결하는 기본적인 예제를 살펴보겠습니다. 첫 번째 단계는 서비스가 하는 일을 정의하는 것입니다. 이 서비스는 제품 목록을 반환합니다.

[ServiceContract(Namespace = "")]
publicclassOrderService
{
[OperationContract]
publicList<Product> GetAllProducts()
        {
...
        }
    }

서비스가 준비되면 Silverlight로 연결할 수 있습니다. 이를 위해 Visual Studio의 서비스 참조를 추가합니다(그림 2 참조).

Figure 2 Use Visual Studio to add a service reference to Silverlight

그림 2 Visual Studio를 사용하여 Silverlight에 서비스 참조를 추가합니다.

Visual Studio가 프록시 클래스를 만들어 줍니다. 프록시 클래스는 서비스 클래스의 클라이언트 측 복사본이며, 메서드 구현이 서비스 메서드 호출로 대체되었다고 생각하면 됩니다. Silverlight의 모든 서비스 통신은 비동기적으로 수행됩니다. 아래 코드 예제에서는 프록시를 사용하여 제품 목록을 가져옵니다.

privatevoid button1_Click(object sender, RoutedEventArgs e)
{
OrderService.OrderServiceClient proxy = new OrderService.OrderServiceClient();
       proxy.GetAllProductsCompleted += newEventHandler<OrderService.GetAllProductsCompletedEventArgs>(proxy_GetAllProductsCompleted);
       proxy.GetAllProductsAsync();
}

void proxy_GetAllProductsCompleted(object sender, OrderService.GetAllProductsCompletedEventArgs e)
{
ProductGrid.ItemsSource = e.Result;
}

REST는 Facebook 및 Twitter와 같은 웹 2.0 API에서의 광범위한 도입으로 현재 널리 인기를 얻고 있는 프로토콜입니다. Silverlight는 REST도 완벽히 지원합니다. Silverlight에는 n계층 Silverlight 응용 프로그램을 염두에 두고 개발된 서비스 프레임워크, 즉 WCF RIA Services도 있습니다.

n계층의 등장

Silverlight 응용 프로그램을 만드는 경우 일반적으로 서비스 계층을 통해 데이터를 가져옵니다. 그러나 기본적으로 유효성 검사와 인증/권한 부여를 포함해서 데이터 전송 개체 및 클래스를 한 번만 작성할 수 있는 쉬운 방법은 없습니다. Silverlight 응용 프로그램은 제한된 버전의 Microsoft .NET Framework 4를 대상으로 구축되었습니다. 따라서 전체 .Net Framework 4를 대상으로 작성된 어셈블리(예: 클래스/유효성 검사 논리가 포함된 어셈블리)는 Silverlight 응용 프로그램에서 참조할 수 없습니다.

바로 이 부분에서 WCF RIA Services가 사용됩니다. 이러한 서비스는 LOB RIA 개발을 간소화하기 위한 목적으로 개발되었으며 서버 측과 클라이언트 측 모두에 프레임워크, 컨트롤 및 서비스를 제공함으로써 n계층 응용 프로그램 구축에 따르는 복잡성 문제를 해결해 줍니다.

이를 통해 서버 측의 데이터 저장소에 연결되는 서비스를 작성할 수 있습니다. 이 저장소는 SQL Server 데이터베이스, 사용자 자신의 POCO 클래스 또는 엔터티 모델일 수 있습니다. 그러면 클라이언트에 이러한 엔터티가 다시 생성됩니다. 그 다음으로 클라이언트에서 서비스와의 대화를 용이하게 하기 위해 필요한 컨텍스트, 메서드 및 작업이 생성됩니다.

Entity Framework에 익숙하다면 쉽게 적응될 것입니다. 비슷한 방식으로 코딩이 가능하기 때문입니다. 예를 들어 변경 집합을 추적하고 엔터티 목록을 포함하며 사용자가 이러한 변경을 제출할 수 있도록 하는 클라이언트 측 DomainContext가 있을 수 있습니다. 이는 서비스 계층을 통해 작업하고 있다는 사실을 “숨깁니다".

WCF RIA Services는 기본적으로 코드를 클라이언트로 뿌리는 서버 측 기술입니다. 또한 서비스 및 엔터티에 유효성 검사 및 인증/권한 부여를 추가하는 작업을 간소화하는 역할도 합니다. 덕분에 LOB Silverlight 응용 프고그램을 구축할 때 소요되는 개발 시간이 크게 단축됩니다.

컨트롤 문제

Silverlight에는 Button, TextBox 및 ComboBox와 같은 간단한 컨트롤이 포함된 확장된 컨트롤 집합이 있습니다. 또한 기본 설치 패키지에 DataGrid, RichTextBox 및 MediaElement와 같은 고급 컨트롤도 많이 있습니다. 새 버전이 나올 때마다 Microsoft는 더 많은 컨트롤을 추가합니다.

Microsoft는 Silverlight 컨트롤 도구 키트로 만들었습니다. 이는 공개 소스로서 CodePlex.com을 통해 무료로 제공되는 추가 컨트롤 집합입니다. 이 패키지는 정기적으로 업데이트되며 정규 Silverlight 릴리스와는 별개입니다.

여기에는 Silverlight 기업 개발자의 업무를 더욱 쉽게 해 주는 많은 컨트롤이 포함되어 있습니다. 또한 다음 요구 사항, 즉 보고에 유용한 차트 컨트롤도 있습니다.

인쇄 기능

인쇄는 여전히 빈번하게 요청되는 비즈니스 요구 사항입니다. Silverlight 4부터는 Silverlight에서 바로 인쇄할 수 있습니다. 이 API를 사용하면 전체 화면이든, 보고서와 같이 동적으로 생성되는 콘텐츠든 인쇄할 대상을 가리킬 수 있습니다. 따라서 Silverlight 4에서는 도구 키트의 컨트롤과 조합하여 다양한 차트와 같은 보고 솔루션을 쉽게 만들 수 있습니다.

패턴 및 모범 사례

Silverlight 또는 XAML 기반 응용 프로그램을 사용하여 작업할 경우 고려해야 할 중요한 점 하나는 ASP.NET 또는 Windows Forms와 같은 이전 기술로 코딩할 때 사용했던 방법과는 다른 방법으로 코드를 작성해야 한다는 것입니다. 같은 방식으로 코드를 작성할 수는 있지만, 그렇게 해서는 안 됩니다. 이 경우 기술의 잠재력을 최대한 이용할 수 없기 때문입니다.

Silverlight 응용 프로그램은 주로 DataContext, Data Binding 및 Observer 패턴을 사용해야 합니다. TextBox 값을 개체에 할당하거나 그 반대의 경우를 위한 반복적인 코드가 있어서는 안 됩니다. 이러한 종류의 코드를 많이 작성할수록 코드에 버그가 발생할 가능성도 높아집니다. 개체를 UI 요소에 바인딩하면 코드의 개체를 통해 자동으로 올바른 값을 사용할 수 있게 됩니다. 사실 UI 요소에 직접 액세스하면 안 됩니다.

이 부분에서 MVVM(Model-View-ViewModel) 디자인 패턴이 사용됩니다. 이 디자인 패턴은 각 영역의 분리를 촉진하기 위해 사용되는 경우가 많습니다(코드 숨김에는 코드가 거의 없거나 아예 없음). 이를 통해 개발자와 별개로 응용 프로그램 UI 작업을 할 수 있습니다. 또한 코드의 테스트 편의성도 높아집니다.

그러나 이 패턴이 제공하는 가장 중요한 이점은 개발자가 DataContext 및 데이터 바인딩 기술의 잠재력을 활용하도록 유도한다는 것입니다. 뷰에는 ViewModel이 DataContext로 있고, 여기에는 모든 데이터 속성이 포함되어 있습니다.

이러한 속성은 데이터 바인딩을 통해 뷰의 UI 요소에 바인딩됩니다. ViewModel은 기본적으로 모델(데이터의 개체 표현)에서 가져오는 데이터를 뷰에서 사용할 수 있는 데이터로 변환합니다. ViewModel은 “강력한 변환기”라고 생각하면 됩니다.

여기까지 되면 이벤트를 뷰 코드 숨김이 아닌 ViewModel에 릴레이할 방법이 필요합니다(예: 단추 클릭). 이 작업은 명령을 통해 수행합니다. Silverlight는 ICommand 인터페이스를 제공하므로 단추 기반(button base)을 상속하는 UI 요소를 명령에 바인딩할 수 있습니다. 이러한 명령은 ViewModel에 정의됩니다.

다음으로, 여러 ViewModel들이 서로 참조할 필요 없이 통신하는 방법이 필요합니다. 이는 브로드캐스트/수신 원칙을 통해 수행할 수 있습니다. ViewModel 구독자는 특정 유형의 메시지를 수신하며 다른 ViewModel은 다른 메시지를 보냅니다. 메시지를 수신한 후 필요한 조치를 취할 수 있습니다.

마지막으로, 뷰는 DataContext가 무엇이 되어야 하는지 알아야 합니다. 방법은 여러 가지인데, 뷰 우선 방식(뷰가 응용 프로그램에 의해 인스턴스화되어 필요한 ViewModel을 인스턴스화하는 역할을 수행함) 또는 ViewModel 우선 방식(역순으로 진행)이 있습니다. 많은 경우 IoC 컨테이너 또는 MEF(Managed Extensibility Framework)를 사용하여 역할을 재연합니다.

MVVM 구현은 꽤 여러 가지입니다. 직접 작성할 수도 있지만 공개 소스 커뮤니티에서 MVVM Light Toolkit, Caliburn 또는 Prism과 같은 뛰어난 구현들이 이미 나와 있습니다.

살펴본 바와 같이 Silverlight는 기업급 응용 프로그램 구축을 위한 용도로 사용할 준비가 되어 있습니다. 사실 저희 둘은 매일 그 일을 하고 있습니다.

Gill Cleeren

Gill Cleeren은 Microsoft 지역 관리자(theregion.com), MVP ASP.NET, INETA 발표자 기관 회원이며 Silverlight Insider입니다. 벨기에에 거주하며 그곳에서 Ordina의 .NET 설계자로 일하고 있습니다. 또한 다양한 개발자 잡지에 기사를 기고하는 필자이기도 하며 최근에는 첫 번째 책인 “Silverlight 4 Data and Services Cookbook”(Packt Publishing, 2010)을 출간했습니다. 블로그 주소는 snowball.be입니다.

 

Kevin Dockx

Kevin Dockx는 벨기에에서 가장 큰 ICT 기업 중 하나인 RealDolmen에서 .NET 웹 응용 프로그램을 다루는 전문가/프로젝트 책임자입니다. 주로 Silverlight에 관련된 일을 하지만 Microsoft .NET(웹) 스택의 다른 제품에 대한 새로운 개발에도 여전히 관심을 갖고 있습니다. Kevin은 네덜란드의 Microsoft DevDays, 포르투갈의 Microsoft Techdays 또는 BESUG(벨기에 Silverlight 사용자 그룹) 이벤트와 같은 다양한 국내 및 국제 이벤트에서 정기적으로 발표자로 활동하고 있습니다. Silverlight, .NET에 대한 여러 이야기와 자유로운 글들이 있는 Kevin의 블로그는 blog.kevindockx.com에서 볼 수 있습니다.

 

관련 콘텐츠