모바일 응용 프로그램에서 데이터 액세스

John Papa

코드 다운로드 위치: DataPoints2008_01.exe (179 KB)
:Track('ctl00_ContentPlaceHolder1_ctl00|ctl00_ContentPlaceHolder1_ctl01',this);" href="http://msdn.microsoft.com/ko-kr/magazine/cc164176.aspx">Browse the Code Online

목차

모바일 개발
시작하기
자동 바인딩
필드 바인딩
모바일 바인딩 옵션
모바일 응용 프로그램 미세 조정
결론

데이터 액세스는 Windows Mobile® 장치를 위한 Microsoft® .NET Compact Framework를 사용하여 응용 프로그램을 개발하는 데 있어 중요한 측면입니다. 기존 아키텍처를 사용하여 모바일 응용 프로그램과 응용 프로그램 서버 간에 데이터를 보내고 받음으로써 DataSet, 사용자 지정 개체 또는 스칼라 값이 있는 데이터를 전달할 수 있습니다.

DataPoints에 대한 이번 칼럼에서는 Smartphone용 모바일 응용 프로그램을 개발할 때의 데이터 액세스 전략을 위한 최상의 방법을 설명하겠습니다. 인터넷을 통해 데이터를 표시하고 저장할 수 있는 데이터 기반 Smartphone 응용 프로그램을 설계하는 방법을 알아보고 DataSet, 사용자 지정 개체 및 엔터티의 generic List<T>를 사용하여 데이터를 가져오기 위한 메서드를 제공하는 서버 응용 프로그램과 통신하는 방법을 살펴보겠습니다.

모바일 개발

모바일 개발을 위한 필수 도구

모바일 응용 프로그램을 개발하려면 먼저 .NET Compact Framework 및 최신 서비스 팩을 설치해야 합니다. 최신 업데이트는 .NET Compact Framework 2.0 SP2입니다. 진행하기 전에 응용 프로그램을 사용하려는 플랫폼(Windows Mobile 5.0 또는 Windows Mobile 6)과 장치를 결정해야 합니다. 이러한 결정에 따라 설치해야 하는 SDK가 달라집니다.

Windows Mobile 5.0 SDK는 대상 장치가 Smartphone인지 Pocket PC인지 또는 Pocket PC Phone인지에 따라 다른 버전으로 제공됩니다. Windows Mobile 6 SDK도 대상 플랫폼에 따라 다른 버전이 제공되는데, 명명 규칙이 변경되었고 사용하기가 조금 더 어려워졌습니다. 그림 1은 다양한 SDK 버전과 각 버전이 대상으로 할 수 있는 장치를 보여 줍니다. 따라서 대상으로 하는 각 장치 종류에 따라 그에 맞는 SDK를 설치해야 합니다.

 

이 기사에서는 Smartphone용 Windows Mobile 5를 사용하여 설명합니다. 그러나 여기에 등장하는 데이터 액세스 개념은 버전에 관계없이 동일하기 때문에 버전은 핵심 사안이 아닙니다.

.NET Compact Framework 2.0 SP2와 적절한 Windows Mobile SDK를 설치한 후에 ActiveSync(Windows® XP용) 또는 Windows Mobile Device Center(Windows Vista®용)도 설치해야 합니다. 이는 모바일 장치 에뮬레이터가 네트워크나 인터넷으로 통신하는 데 필요합니다.

또한 대상으로 하는 장치와 비슷한 에뮬레이터도 다운로드하여 설치해야 합니다. 이 칼럼에서는 320x240 가로 화면을 사용하기로 했습니다. 대상 장치의 화면 크기가 제각각 다른 경우 적절한 모든 에뮬레이터를 사용하여 각 대상 장치에 대해 응용 프로그램을 테스트해야 합니다.

Windows Vista 또는 Windows Mobile 6 SDK를 사용 중인 경우 Device Emulator 2.0을 설치해야 합니다. 준비할 필수 구성 요소가 많기 때문에 다운로드 파일과 MSDN Magazine 웹 사이트(msdn.microsoft.com/msdnmag/issues/08/01/datapoints)에 링크 목록을 넣어 두었습니다.

시작하기

응용 프로그램이 에뮬레이터에서는 잘 작동하지만 장치에서는 작동하지 않는 상황을 방지하기 위해 에뮬레이터와 장치 모두에서 테스트를 수행하는 것이 좋습니다. 필자가 사용하는 방법은 모바일 응용 프로그램을 개발하는 전 과정에 걸쳐 에뮬레이터를 사용하고 특정 검사점마다 응용 프로그램을 실제 모바일 장치에 배포하는 것입니다.

디버깅하기 전에 Visual Studio®의 도구 메뉴에서 장치 에뮬레이터를 실행하십시오. 원하는 에뮬레이터를 마우스 오른쪽 단추로 클릭하고 연결을 선택합니다. 그러면 에뮬레이터에서 Smartphone 부팅이 시작됩니다. Smartphone이 에뮬레이터에서 실행되면 다시 장치 관리자에서 해당 항목을 마우스 오른쪽 단추로 클릭하고 크레들에 놓기를 선택합니다. 크레들에 놓으면 에뮬레이터가 네트워크와 통신할 수 있게 됩니다. 마지막으로 Visual Studio의 장치 도구 모음에 있는 드롭다운 목록에서 에뮬레이터를 선택합니다(그림 2 참조).

그림 2 대상 에뮬레이터 선택

샘플 응용 프로그램은 데이터를 가져오기 위해 IIS 웹 서버의 웹 서비스와 통신합니다. 웹 서비스는 DataSet와 같은 ADO.NET 개체와 사용자 지정 엔터티를 모두 전달할 수 있으므로 모바일 응용 프로그램에서 잘 작동합니다. 먼저 웹 서비스 프로젝트를 만들고 CustomerWebService라는 WebService를 추가합니다. 3개의 메서드를 WebService에 추가하고 각각에 WebMethod 특성을 추가합니다.

코드 복사

[WebMethod]
public Customer GetCustomer(string customerID) {
  ...
}

[WebMethod]
public DataSet GetCustomerDataSet(string customerID) {
  ...
}

[WebMethod]
public List<Customer> FindCustomerList() {
  ...
}

GetCustomer 메서드는 사용자 지정 엔티티 형태로 단일 고객 레코드를 검색합니다. GetCustomerDataSet 메서드도 단일 고객 레코드를 가져오지만 이 메서드는 이 고객을 DataSet에 반환합니다. FindCustomerList 메서드는 고객 목록을 가져와 List<Customer>를 반환하므로 고객 엔터티 및 제네릭을 이용합니다. 이 웹 서비스의 전체 코드는 다운로드 가능한 코드에 포함되어 있습니다.

웹 서비스가 만들어지면 Windows Mobile 5.0 Smartphone 응용 프로그램을 솔루션에 추가합니다. Windows Mobile 5.0과 Windows Mobile 6 SDK를 모두 설치한 경우 이 대화 상자에서 대상 응용 프로그램을 선택할 수 있습니다. 이 프로젝트에서는 Windows Mobile 5.0 Smartphone 장치 응용 프로그램을 만듭니다.

Smartphone 응용 프로그램은 드롭다운 목록에 고객 목록을 표시하는 시작 폼을 갖게 됩니다. 사용자는 고객 중 한 명을 선택한 후 다른 페이지에서 해당 고객에 대한 자세한 내용을 볼 수 있습니다. 고객 목록은 웹 서비스의 FindCustomerList 웹 메서드에서 검색되며, 이를 통해 List<Customer>를 폼으로 가져옵니다. 그러면 목록을 드롭다운 목록에 수동 또는 자동으로 바인딩할 수 있습니다. 곧 두 가지 방법 모두 살펴보겠습니다.

자동 바인딩

CustomerPicker 폼은 사용자가 보는 첫 화면입니다. 이 폼에 드롭다운 목록을 추가하고 이름을 ddlCustomer로 지정합니다. 자동 바인딩을 사용하여 FindCustomerList 웹 메서드에서 받을 List<Customer>에 드롭다운 목록을 바인딩하려고 합니다. 프로젝트에 새 데이터 원본을 추가하고 드롭다운 목록을 바인딩하려는 엔터티 유형을 선택합니다. 웹 서비스를 참조하기 때문에 응용 프로그램은 WebMethods가 어떤 엔터티 유형을 반환할지 알고 있습니다. 따라서 엄격한 형식의 엔터티로 드롭다운 목록에 손쉽게 바인딩할 수 있습니다.

데이터 원본 창으로 이동하여 새 데이터 원본 추가를 클릭하면 마법사가 나타납니다. 개체 유형 추가를 선택하고 다음을 클릭한 후 제공된 목록에서 Customer 엔터티를 찾습니다(그림 3 참조). 새 데이터 원본을 추가할 때 목록에 엔터티가 표시되지 않을 경우 먼저 웹 서비스 프로젝트를 성공적으로 컴파일했는지 확인한 다음 다시 돌아와 데이터 원본을 다시 추가해 보십시오. 웹 서비스에 의해 노출된 엔터티는 DLL을 컴파일하기 전에는 목록에 나타나지 않습니다.

0) this.src=small; if (current.indexOf(small) > 0)this.src=large;" alt="" src="http://msdn.microsoft.com/ko-kr/magazine/cc135982.fig03.gif">

그림 3 사용자 지정 데이터 원본 만들기 (더 크게 보려면 이미지를 클릭하십시오.)

데이터 원본이 추가된 후 데이터 원본 창에서 새 Customer 데이터 원본(그림 4 참조)을 드롭다운 목록으로 끌어 놓습니다. 그러면 customerBindingSource라는 폼에 BindingSource 컨트롤이 자동으로 만들어지며 이 컨트롤은 Customer 엔터티에서 컨트롤로 양뱡향 바인딩을 처리합니다.

그림 4 Customer 데이터 원본 사용

에뮬레이터에서 응용 프로그램을 테스트하기 전에 자동 바인딩을 설정하기 위한 단계가 두 가지 더 있습니다. 다음 단계는 드롭다운 목록의 DisplayMember 및 ValueMember 속성을 설정하는 것입니다. DisplayMember 속성을 CompanyName으로, ValueMember 속성을 CustomerID로 설정합니다. 데이터 원본이 엄격한 형식이기 때문에 이러한 값은 드롭다운 목록 컨트롤의 속성 창에 있는 드롭다운 목록에 있습니다.

마지막 단계는 데이터를 가져올 위치를 BindingSource 컨트롤에 알려주는 것입니다. 이 단계는 간단해서 다음과 같이 웹 서비스 프록시 클래스의 인스턴스를 만들고, 적절한 메서드를 호출하고, 반환되는 List<Customer>를 BindingSource 컨트롤의 DataSource 속성으로 설정하기만 하면 됩니다.

코드 복사

private void CustomerPicker_Load(object sender, EventArgs e)
{
    using (RemoteService.CustomerWebService svc = 
                        new RemoteService.CustomerWebService())
        customerBindingSource.DataSource = svc.FindCustomerList();
}

이 시점에서 응용 프로그램을 실행하고 드롭다운 목록에 고객 목록이 표시되는지 테스트할 수 있습니다. 이때에는 Visual Studio에서 대상 장치를 설정했는지, ActiveSync® 또는 Windows Mobile Device Center를 실행 중인지, 그리고 에뮬레이트하는 장치가 크레들에 놓여 있는지(장치 에뮬레이터 관리자 사용) 확인하십시오.

필드 바인딩

CustomerPicker 폼을 만들고 테스트한 후에 CustomerDetail이라는 다른 폼을 만듭니다. 이 폼은 선택된 고객을 표시합니다. 데이터 원본 설정을 변경하여 Customer 데이터 원본을 폼으로 끌어올 때 세부 사항 컨트롤이 만들어지도록 한 다음 데이터 원본 창에 표시되는 속성을 사용자 지정합니다. 그런 후에 컨트롤을 CustomerDetail 폼으로 끌어 놓습니다. 그림 5는 사용자 지정 후의 데이터 원본을 보여 줍니다.

그림 5 사용자 지정된 데이터 원본

이제 웹 서비스의 GetCustomer 웹 메서드에서 선택한 Customer 레코드를 가져와야 합니다. 이전 폼에서 선택한 CustomerID를 사용하고 GetCustomer 웹 메서드를 호출합니다. 그러면 반환된 Customer 엔터티가 CustomerDetail 폼에 있는 customerBindingSource 컨트롤의 데이터 원본으로 설정됩니다. 이제 에뮬레이터에서 응용 프로그램을 다시 테스트하면 그림 6의 화면이 표시됩니다.

그림 6 에뮬레이터에서 실행 중인 응용 프로그램

모바일 바인딩 옵션

모바일 장치 응용 프로그램에서 BindingSource 컨트롤을 사용하여 자동 바인딩을 구현하기는 매우 쉽습니다. BindingNavigator 컨트롤이 없다는 점을 제외하면 Windows Forms 응용 프로그램에서 BindingSource 컨트롤이 작동하는 방식과 비슷하게 작동합니다. 모바일 응용 프로그램에는 BindingNavigator 컨트롤이 없기 때문에 레코드 사이를 탐색하는 기능이 필요한 경우 이를 위한 코드를 직접 작성해야 합니다. 이러한 종류의 기능은 일반적으로 많은 항목이 있는 목록을 검색할 때 사용되기 때문에 필자는 그다지 사용하지 않는 편입니다. 모바일 장치에서는 대개 대역폭이 제한적이므로 이 기능은 모바일 응용 프로그램의 성능에 영향을 미칠 수 있습니다. 따라서 대역폭을 아낄 수 있다는 측면에서 보면 BindingNavigator의 부재가 나쁜 것은 아닙니다.

BindingSource는 엔터티에서 수동으로 값을 가져와 폼에 있는 컨트롤에 채워 넣는 골치 아픈 문제를 해결해 줍니다. 또한 BindingSource는 레코드를 저장할 때 폼의 컨트롤에서 값을 검색하여 다시 엔터티로 끌어오는 번거로움도 없애 줍니다. BindingSource의 단점은 데이터 로드 속도가 데이터를 수동으로 로드할 때보다 약간 느려질 수 있다는 것입니다.

그래도 테스트에서 성능 차이가 크게 나타나지만 않는다면 BindingSource 컨트롤을 사용하는 것이 좋습니다. 필자의 경험으로는 대부분 충분할 정도의 성능이 나왔습니다. BindingSource 컨트롤을 사용할 때 제공되는 자동 바인딩은 동일한 데이터 집합을 여러 컨트롤에 바인딩해야 하는 경우에도 매우 유용합니다.

수동 바인딩으로 변경하는 방법은 간단합니다. BindingSource 컨트롤을 제거하고 폼에서 컨트롤의 데이터 원본 설정을 지우고 엔터티에서 해당 컨트롤로 각 값을 수동으로 로드하는 약간의 코드를 작성하기만 하면 됩니다.

코드 복사

using (RemoteService.CustomerWebService svc = 
  new RemoteService.CustomerWebService()) {
    RemoteService.Customer customer = svc.GetCustomer(_customerID);
    companyNameTextBox.Text = customer.CompanyName;
    customerIDLabel1.Text = customer.CustomerID;
    ...
  }

수동 방식을 사용하는 경우에는 사용자가 데이터를 저장하려고 할 때 컨트롤에서 데이터를 어떻게 추출할지도 고려해야 합니다. 컨트롤에서 값을 구하여 엔터티로 끌어오는 절차는 간단하지만 이는 사용자가 정보를 저장하도록 허용할 경우 여러분이 처리해야 하는 추가 단계입니다. 수동 바인딩에서 일반적으로 사용되는 방법은 컨트롤에서 엔터티로 데이터를 끌어와야 할 때 즉시 액세스할 수 있도록 Customer 엔터티를 CustomerDetail 폼의 개인 필드로 저장하는 것입니다.

모바일 응용 프로그램 미세 조정

대역폭이 제한될 수 있고 모바일 장치의 프로세서는 데스크톱 컴퓨터보다 느리므로 응용 프로그램에 필요한 최소한의 데이터만 전달하는 것이 중요합니다. 샘플 응용 프로그램에서 필자는 Customer 엔터티 목록을 검색했지만 각 엔터티의 속성 중 두 개만 사용했습니다. 모든 고객에 대한 모든 데이터를 가져와야 했기 때문에 이 작업만으로도 CustomerPicker 화면에 사용되는 대역폭이 많이 소모되었습니다.

보다 효율적인 방법은 각 고객에 대한 CustomerID와 CompanyName만 검색하는 메서드를 만드는 것입니다. 데스크톱 응용 프로그램에서는 이와 같은 성능 문제가 눈에 띄지 않을 수 있으므로 모바일 응용 프로그램을 조정할 때에는 이러한 고려 사항을 유념해야 합니다.

결론

모바일 개발에 착수하기에 앞서 적절히 준비하는 것이 중요합니다. 올바른 에뮬레이터 관리자 버전, 적절한 에뮬레이터, 올바른 SDK, 그리고 필요한 ActiveSync 또는 Windows Mobile Device Center 버전을 갖추고 있는지 확인해야 합니다. Windows Vista에서 응용 프로그램을 실행할 때 Windows Mobile Device Center 6.1과 Device Emulator Manager 2를 설치하기 전까지는 에뮬레이터에서 웹 서비스와 통신하지 못합니다. 이 두 가지는 Windows Mobile 5.0을 대상으로 하는 경우라도 Windows Vista에서 실행할 때 반드시 설치해야 하는 중요한 소프트웨어 업데이트입니다.

ActiveSync에서 에뮬레이터를 확인하려고 시도할 때 오류가 발생하는 경우 ActiveSync가 DMA를 통해 통신하도록 설정되었는지 확인하십시오. 웹 서비스에 액세스를 시도할 때 오류가 발생하는 경우에는 웹 서비스가 localhost가 아닌 서버의 이름을 사용하는지 확인하십시오. localhost는 PC에서는 잘 작동하지만 에뮬레이터는 localhost를 중재할 때 localhost가 컴퓨터의 웹 서버를 의미한다는 사실을 알지 못합니다. 또 한가지 유용한 팁은 로컬 PC와 통신할 수 있도록 에뮬레이트하는 장치를 연결하고 크레들에 올려 놓아야 한다는 것입니다.

실제 모바일 장치에 응용 프로그램을 배포하는 방법에 대한 정보가 필요한 경우 필자의 2006년 12월 Data Points 칼럼, "Smartphone에서의 RSS 피드"(msdn.microsoft.com/msdnmag/issues/06/12/DataPoints)를 참조하십시오

+ Recent posts