앱 데이터 로밍

Windows 8 앱 개발자 블로그

Windows 8 엔지니어링 팀에서 제공하는 Windows 8용 Metro 스타일 앱 개발의 이해

앱 데이터 로밍

  • Comments 0

Windows 8은 항상 연결된 경험을 제공합니다. 사용자는 인터넷과 클라우드 서비스는 물론, 사용자의 다른 Windows 8 PC에도 연결할 수 있습니다. 개발자의 앱도 이와 마찬가지로, 앱 데이터 로밍을 통해 항상 연결 상태가 유지되는 에코시스템에 참여할 수 있습니다. 이 글에서는 앱 데이터 로밍이 무엇인지, 왜 중요한지, 그리고 무엇보다 앱에 얼마나 쉽게 구현할 수 있는지 등 앱 데이터 로밍에 대해 자세히 살펴보겠습니다.

데이터를 로밍하는 이유

개인 설정을 로밍해 보면 Windows와의 연결 경험을 확실히 체감할 수 있습니다. Windows 8에서는 바탕 화면 테마, 바탕 화면 배경, 브라우저 즐겨찾기 등 다양한 Windows 설정을 로밍할 수 있습니다. 하지만 Windows 설정이 사용자 개인 설정에서 차지하는 비중은 극히 일부분에 지나지 않습니다. 항상 연결된 Windows 8 경험에서 가장 중요한 비중을 차지하는 것은 앱입니다. Windows 사용자에게 즐거움을 선사하는 것도 앱이고, 사용자가 사용 시간을 가장 많이 할애하는 것도 바로 앱이기 때문입니다. 따라서 Windows 8의 비전, 즉 항상 연결된 경험을 실현하기 위해서는 Bing 날씨 및 스포츠와 같은 Windows 기본 앱에서 로밍 경험을 제공하는 것도 중요하지만 보다 완벽한 경험을 제공하기 위해서는 개발자 여러분의 도움이 필요합니다.

클라우드 로밍 기능은 고객에게 즐거움과 편의를 제공하고 앱을 돋보이게 하는 멋지고 흥미로운 기능 중 하나입니다. 뛰어난 Metro 스타일 앱에 로밍 기능이 더해지면 사용자가 한 번 구성한 후에 어디에든 사용할 수 있게 되고, 다른 PC에서 액세스할 때마다 앱을 다시 구성해야 하는 번거로움이 사라집니다. 또한 사용자가 여러 대의 PC를 사용하더라도 단절이 없는 지속적인 경험이 제공되므로 어디에서든 손쉽게 연결할 수 있게 됩니다.

간편한 기능

앱 데이터 로밍 기능을 개발하는 데 있어 우리의 목표는 보다 쉽고 편리한 로밍 경험을 만드는 것이었습니다. 이러한 맥락에서 번거롭고 복잡한 동기화 메커니즘을 개발자가 관리할 필요가 없도록 했습니다. 즉, 모든 사용자 구성 환경에 로밍 기능을 구현할 수 있도록 했습니다.

이러한 목표를 실현하기 위해 Windows 8에는 사용자의 연결된 Microsoft 계정을 사용하는 모든 Metro 스타일 앱의 Application Data에 대한 통합 로밍 동기화 기능이 추가되었습니다. ApplicationData는 로컬, 로밍, 임시라는 세 가지 데이터 유형으로 구분되는데 우리는 이를 로컬리티라고 부릅니다. 로밍 로컬리티에 데이터를 작성하기만 하면 연결된 Microsoft 계정에 동기화되는 데이터를 앱에서 이용할 수 있게 됩니다. 다시 말해, 개발자가 동기화 관계를 관리하거나, ID와 로그인을 설정하거나, 서비스를 구매 또는 관리하는 등 번거로운 일들을 신경 쓸 필요가 없게 됩니다. 이러한 모든 것들이 Windows에서 자동으로 이루어지기 때문입니다. 개발자는 로밍할 데이터를 결정하고 이 기능을 이용하도록 앱을 설계하는 데에만 신경 쓰면 됩니다. 사용자의 계정이 Windows에 연결되면 동시에 앱에도 연결되니까요.

컴퓨터, 로컬 저장소 및 클라우드 저장소 간의 데이터 이동을 보여 주는 흐름도

사용자 데이터와 앱 데이터

본론으로 들어가기 전에, 로밍 경험에 대한 작업을 하려면 사용자 데이터와 앱 데이터의 차이점부터 이해할 필요가 있습니다. 사용자 데이터는 사용자의 문서나 음악, 동영상, 사진과 같이 앱 사용 과정에서 사용자가 생성하는 데이터로, 사용자가 중요하게 인식하거나 앱 간에 공유될 수 있는 무엇이든 사용자 데이터가 될 수 있습니다. 이러한 유형의 데이터는 KnownFolder 라이브러리 중 하나에 저장하거나 SkyDrive API를 사용하여 로밍해야 합니다. 암호의 경우에는 항상 PasswordVault를 사용하여 저장하고 로밍해야 합니다. 이 글에서는 설정, 기본 설정, 상태 데이터 등 앱에서 생성되고 관리되는 데이터에 대해서만 다룹니다. 사용자 데이터와 앱 데이터 간의 이러한 차이점과 각각을 로밍하는 방법은 다음 표에 정리되어 있습니다.

사용자 데이터

앱 데이터

여러 앱에서 사용 가능

해당 데이터를 생성한 앱에만 의미 있음

문서, 음악, 사진, 내보낸 데이터

설정, 기본 설정, 컨텍스트, 앱 상태

SkyDrive를 사용하여 클라우드에 저장

ApplicationData를 사용하여 로밍

한 번의 구성으로 어디서나 사용 가능한 경험

이제 한 번 구성하여 어디서든 사용할 수 있는 간편한 경험에 대해서 먼저 설명하겠습니다. 사용자가 일련의 피드에서 원하는 항목을 읽을 수 있는 간단한 RSS 판독기 앱을 제가 개발하고 있다고 가정해 보겠습니다. 이 앱은 특정 피드를 보여 줄 때 페이지마다 일정 수의 항목을 표시합니다. 저는 한 페이지에 표시할 피드 항목 수를 제어하는 ItemsPerPage라는 설정을 사용자가 구성할 수 있게 구현했습니다. 그런데 사용자가 PC 중 하나에서 이 설정을 구성하면 이 앱이 설치된 다른 PC로 로밍되도록 하고 싶습니다. ApplicationData 클래스에는 RoamingSettings 속성이 있습니다. 원하는 설정이 RoamingSettings 속성의 값으로 쓰여지도록 하기만 하면 간단하게 설정을 로밍할 수 있습니다.

JS:

Windows.Storage.ApplicationData.current.roamingSettings.values[“ItemsPerPage”] = 10

C#:

Windows.Storage.ApplicationData.Current.RoamingSettings.Values[“ItemsPerPage”] = 10;

매우 간단하지 않습니까? 이제 모든 동기화 메커니즘은 Windows에서 처리되고, 추가로 조작하지 않아도 이 앱이 설치된 사용자의 모든 PC 간에 설정이 동기화됩니다. 일반적으로 이 설정은 앱 설정 참을 통해 사용자에게 제공되며, 앱 설정은 기본적으로 모두 로밍하는 것이 좋습니다. 하지만 일부 설정은 컴퓨터마다 달라질 수 있으므로 로밍 위치에 저장해서는 안 됩니다.

설정 대신 파일을 작성할 경우에는 Application Data에서 제공되는 RoamingFolder를 사용하면 됩니다. 이 속성도 RoamingSettings과 같은 방식으로 작동합니다. 로밍 데이터가 파일에 저장할 경우 쓰기 작업이 끝나면 파일의 열려 있는 핸들을 모두 닫아야 합니다. 핸들이 열려 있는 파일은 로밍되지 않기 때문입니다.

로밍 할당량 계획

간단한 설정만 지원하는 앱의 경우 지금까지 설명한 내용만으로도 충분합니다. 하지만 즐겨찾기 목록이나 컬렉션 또는 많은 양의 데이터를 로밍해야 할 경우에는 어떨까요? 얼마나 큰 데이터까지 로밍할 수 있을까요? 앱 데이터 로밍 기능은 설정과 기본 설정을 로밍하는 데 최적화되어 있으며, 이러한 유형의 데이터에 적절하게 앱당 저장소 할당량이 적용됩니다. 이는 시스템 리소스를 효율적으로 사용하기 위한 것입니다. 긴 배터리 수명과 뛰어난 시스템 성능은 Windows 8의 주요 특징 중 하나로, 로밍 경험을 제공할 때 할당량 제한을 통해 배터리 수명이나 성능이 저하되지 않도록 할 수 있습니다. 이 할당량은 ApplicationData의 RoamingStorageQuota 속성을 사용해 적용할 수 있으며, 이 글을 작성하는 현재 100KB로 설정되어 있습니다. 할당량 내에서 로밍을 처리하는 가장 좋은 방법은 앱을 설계할 때 데이터 사용량을 미리 계획하여 할당량을 초과하지 않도록 하는 것입니다.

그렇다면 RoamingStorageQuota를 초과하면 어떻게 될까요? 아무 일도 일어나지 않습니다. 좀 더 정확하게 설명하자면 아무 것도 로밍되지 않습니다. 앱이 작동을 멈추는 일은 없고, 로밍 위치에서 데이터도 계속 읽고 쓸 수 있습니다. 하지만 로밍 위치에 저장된 전체 로밍 데이터 용량이 RoamingStorageQuota보다 적어질 때까지 데이터가 클라우드에 동기화되지 않습니다.

로밍 데이터 사용량을 적절하게 계획하지 않은 앱에서는 콘텐츠를 참조해야 할 경우에 콘텐츠를 로밍하는 문제가 많이 발견됩니다. 예를 들어 즐겨 보는 뉴스 기사들을 로밍하려는 경우에는 전체 기사가 아니라 기사 식별자나 URL을 로밍해야 합니다. 사용 가능한 콘텐츠에 대한 참조가 아니라 원시 데이터를 로밍하는 것은 할당량을 소진하고 공간을 낭비하는 지름길입니다. 따라서 실제 콘텐츠 자체가 아니라 콘텐츠에 대한 식별자를 로밍해야 로밍 기능을 효과적으로 이용할 수 있습니다.

앱을 계획할 때는 크기가 너무 큰 데이터 집합을 사용하지 않는 것이 최선입니다. 즐겨찾기 목록과 같이 제한이 없는 데이터 집합의 경우 앱에서 해당 데이터가 항상 로밍 할당량 이내로 유지되도록 상한선을 정해야 합니다. 앞서 소개한 RSS 피드 판독기의 예를 다시 살펴보겠습니다. RSS 피드 목록을 사용자가 관리하는 목록으로 저장하려고 합니다. 이렇게 하려면 제한이 없는 항목을 제한이 있는 항목으로 바꾸어야 합니다. 그러기 위해서는 간단한 추정을 해야 합니다. 제가 RSS 피드 목록으로 20KB를 할당한다고 가정해보겠습니다. 설명의 편의를 위해 URL당 80바이트라는 보수적인 추정치를 정합니다. 이 크기로는 20KB에 250개의 URL을 저장할 수 있습니다. URL의 길이를 줄이면 크기가 더 줄어들겠지만 250개만으로도 앱에서 사용되는 피드 수로는 충분합니다. 이제 이 용량으로 상한선을 제한하고 피드 목록을 파일에 쓴 후 RoamingFolder에 저장하기만 하면 됩니다.

여러 PC 환경에서 지속적인 경험 구현하기

앱에 추가할 수 있는 유용한 로밍 경험이 한 가지 더 있습니다. 바로 PC 간의 지속적인 사용자 경험입니다. 집에서 데스크톱에 로그온한 사람이 제가 만든 판독기를 사용해 피드를 읽던 중에 버스를 타러 가야할 상황이라고 상상해보십시오. 버스를 타러 나가면서 Windows 8 태블릿을 들고 저의 앱을 엽니다. 지속적인 경험이란 이러한 경우에 사용자가 데스크톱 PC에서 읽다 만 부분부터 계속 읽을 수 있는 경험을 말합니다. 그리고 지속적인 경험을 가능하게 한다는 것은 사용자가 수행 중인 작업의 컨텍스트를 보존하여 로밍한다는 의미입니다.

기능적으로 이는 다른 설정을 로밍하는 것과 차이가 없지만 대부분의 설정과는 사용되는 시나리오가 약간 다릅니다. 사용자가 매우 빠르게 피드를 탐색할 수도 있기 때문에 이 설정은 다른 설정보다 자주 변경될 수 있습니다. 뿐만 아니라 사용자에게 실질적으로 유용한 경험을 제공하기 위해서는 사용자가 마지막으로 수행하던 작업 상황이 데이터에 정확하게 반영되어야 합니다. 이러한 고객의 요구 사항을 충족하기 위해 우리는 이러한 경험을 처리하도록 특별히 설계된 HighPriority라는 고유한 설정 이름을 만들었습니다. 이 이름을 사용하려면 RoamingSettings의 루트 컨테이너에 해당 설정의 이름을 HighPriority로 지정하기만 하면 됩니다. 이 설정은 여타 설정과 동일하게 사용됩니다. 로밍 엔진은 이 설정을 다른 로밍 데이터보다 훨씬 빠르게 로밍할 수 있기 때문에 목표했던 경험을 제공할 수 있습니다.

저의 피드 판독기에서 이러한 경험을 가능하게 하려면 피드 식별자를 로밍하기만 하면 됩니다. 앱을 시작하거나 일시 중단되었다가 다시 시작할 때 식별자를 확인해 적절한 피드로 이동합니다. 설정 이름이 HighPriority인 것 외에는 앞서 설명한 설정과 거의 유사합니다.

JS:

Windows.Storage.ApplicationData.current.roamingSettings.values[“HighPriority”] = currentFeedId;

C#:

Windows.Storage.ApplicationData.Current.RoamingSettings.Values[“HighPriority”] = currentFeedId;

다른 로밍 경험과 마찬가지로 까다로운 부분은 Windows에서 자동으로 처리되기 때문에 신경 쓸 필요가 없습니다. HighPriority 사용에 있어서 열쇠는 설정을 읽어야 할 때와 써야 할 때를 아는 데 있습니다. 사용자가 현재 PC 또는 다른 PC에서 앱을 마지막으로 사용했을 때 했던 작업에 액세스할 수 있도록, 일반적으로 앱을 시작할 때 또는 일시 중단된 후 다시 시작할 때 HighPriority를 확인합니다. 사용자가 새로운 페이지로 이동하거나 링크를 클릭하는 등의 작업을 시작할 때 HighPriority를 씁니다.

HighPriority 설정은 일시적인 경우가 많지만 잦은 쓰기 작업으로 인해 제한을 받을 수 있으므로, 불필요한 쓰기 작업은 앱의 성능이 저하되는 문제만 일으키고 로밍 경험에는 도움이 되지 않습니다. 일반적인 규칙으로서 사용자가 어디에서 무엇을 하고 있었는지, 예를 들어 사용자가 앱 내에서 페이지를 탐색하고 있었는지, 아니면 콘텐츠를 검색하고 있었는지가 HighPriority에 나타나도록 해야 합니다. 재생 중인 비디오 내에 카운터가 표시되는 비디오 플레이어와 같은 일부 앱에는 빠르게 바뀌는 데이터가 있을 수 있습니다. 이 경우 비디오 카운터 값이 증가할 때마다 HighPriority에 데이터를 쓸 필요는 없습니다. 대신 재생/일시 중지되거나 사용자가 검사점에 도달하거나 앱이 일시 중단된 경우와 같이 비디오의 상태가 변경될 때에만 HighPriority를 업데이트하면 됩니다.

데이터 일관성 유지

서로 밀접하게 연관되어 있어 항상 함께 로밍해야 하는 데이터도 있습니다. 전형적인 예로 특정 지점의 좌표를 들 수 있습니다. 좌표가 바뀔 때 x 좌표와 y 좌표가 따로 로밍되면 데이터가 손상되고 잘못된 좌표가 생성될 수 있습니다. ApplicationData는 설정 및 파일 단위로 로밍되기 때문에 파일 내에 있는 항목은 항상 하나의 단위로 함께 로밍되며, 설정은 그 자체가 하나의 단위가 됩니다. 좌표의 경우와 같이 여러 설정을 함께 로밍하려면 CompositeSettingValue를 사용하면 됩니다. 이 설정 유형을 사용하면 여러 설정을 항상 한 단위로 함께 로밍되는 하나의 값으로 그룹화할 수 있습니다.

또한 HighPriority 설정을 복합 값으로 설정하여 앱의 현재 상태를 나타내는 여러 데이터를 안전하게 로밍할 수도 있습니다. 예를 들어 저의 피드 판독기는 쉽게 읽을 수 있도록 피드 항목을 페이지별로 그룹화합니다. 이 경우 피드의 페이지 번호가 서로 다를 수 있으므로 피드 ID와 페이지가 따로따로 로밍되어서는 안 됩니다. 현재 피드 ID와 해당 피드 내에서의 현재 페이지를 CompositeSettingValue로 함께 로밍하여 항상 일치하도록 해야 합니다.

JS:

var currentFeed = new Windows.Storage.ApplicationDataCompositeValue();
currentFeed.insert(“CurrentFeedId”, currentFeedId);
currentFeed.insert(“CurrentFeedPage”, currentFeedPage);
Windows.Storage.ApplicationData.current.roamingSettings.values[“HighPriority”] = currentFeed;

C#:

Windows.Storage.ApplicationDataCompositeValue currentFeed = 
new Windows.Storage.ApplicationDataCompositeValue();
currentFeed.Insert(“CurrentFeedId”, currentFeedId);
currentFeed.Insert(“CurrentFeedPage”, currentFeedPage);
Windows.Storage.ApplicationData.Current.RoamingSettings.Values[“HighPriority”] = currentFeed;

복합 값을 HighPriority 설정으로 사용하는 경우 HighPriority의 이점을 활용하려면 8KB 이내여야 합니다. 8KB를 초과하더라도 오류가 발생하지는 않지만 값이 일반적인 설정처럼 로밍됩니다.

수신되는 로밍 변경 내용에 응답

로밍 경험에서 알아두어야 할 부분이 한 가지 더 있습니다. 바로 ApplicationData의 DataChanged 이벤트입니다. DataChanged 이벤트는 사용자가 설정을 변경했음을 백그라운드 작업에 알리는 것과 같이 앱 데이터가 변경될 때마다 알릴 수 있는 이벤트입니다. 클라우드에서 데이터를 로밍하면 앱이 로컬로 변경되는 경우 Windows는 자동으로 이러한 이벤트를 알립니다. 따라서 다른 PC의 데이터가 지연되어 사용자가 이미 앱 사용을 시작한 후에 데이터가 도착하는 등의 상황에 대응할 수 있게 됩니다. 이 이벤트를 사용하면 데이터 보기를 새로 고치거나 설정이 변경된 경우에 대응할 수 있습니다. 한 가지 유의할 점은 이 경험은 한 번에 PC를 한 대씩만 사용하고 PC 간을 전환하는 소비자에게 최적화되어 있기 때문에 DataChanged 이벤트를 PC 간의 실시간 통신 메커니즘으로 사용해서는 안 된다는 것입니다.

앱 개발자와 함께 만들어가는 연결된 경험

로밍 기능을 지원하는 앱은 연결된 Windows 8 경험의 근간을 이루는 중요한 부분이므로 우리는 이러한 유용하고 새로운 경험을 손쉽게 구축할 수 있도록 플랫폼을 개발했습니다. 클라우드 로밍 기능은 개발자의 앱을 돋보이게 하고 고객에게 편리한 사용자 경험과 PC 간의 유연한 전환을 지원할 수 있는 좋은 수단입니다. 로밍 기능 사용과 관련하여 자세한 지침은 응용 프로그램 데이터 로밍에 대한 지침을 참조하십시오. 아울러 이 글에서 설명한 모든 경험의 예제가 수록된 ApplicationData 샘플도 살펴보시기 바랍니다. 이 글을 읽어 주셔서 감사합니다.

- Windows 프로그램 관리자, Dave Bennett

  • Loading...
Leave a Comment
  • Please add 4 and 6 and type the answer here:
  • Post