내보내기(0) 인쇄
모두 확장
정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Windows Phone 8의 로컬 데이터베이스 마이그레이션 개요

2014-06-18

적용 대상: Windows Phone 8 및 Windows Phone Silverlight 8.1 | Windows Phone OS 7.1

 

Windows Phone OS 7.1 부터는 앱의 로컬 폴더에 있는 관계형 데이터를 로컬 데이터베이스에 저장할 수 있습니다. 앱이 발전하면서 앱이 단말기에 배포된 후 데이터베이스 스키마를 변경해야 할 수 있습니다. 열/인덱스/테이블을 추가하는 것보다 더 광범위한 변경을 적용해야 하는 경우 새 데이터베이스를 만들고 이전 데이터베이스에서 새 데이터베이스로 데이터를 마이그레이션해야 합니다. 이 항목에서는 로컬 데이터베이스 마이그레이션에 대한 개요를 제공합니다. Windows Phone 앱에서 로컬 데이터베이스를 사용하는 방법에 대한 자세한 내용은 Windows Phone 8의 로컬 데이터베이스를 참조하세요.

참고참고:

마이그레이션 대신 데이터베이스 업데이트를 사용할 수 있습니다. 업데이트에서 열, 인덱스 및 테이블 추가 등의 추가 작업을 수행할 수 있습니다. 자세한 내용은 연습: Windows Phone 8의 로컬 데이터베이스 앱 업데이트를 참조하세요.

이 항목에는 다음 단원이 포함되어 있습니다.

 

데이터 마이그레이션을 수행할 필요가 없는 경우도 있습니다. Windows Phone SDK 7.1 에서는 추가 작업을 통해 로컬 데이터베이스를 업그레이드하는 API를 제공합니다. DatabaseSchemaUpdater 클래스를 사용할 경우 다음 메서드를 사용하여 단말기에 배포된 기존 데이터베이스를 업데이트합니다.

이러한 메서드는 데이터베이스 스키마 변경 내용을 대부분 처리합니다. 엄격하게 추가 작업으로 제한되기 때문에 이 메서드의 변경 내용은 사용자 데이터에 부정적 영향을 줄 가능성이 적습니다.

중요중요:

데이터베이스 마이그레이션을 수행하는 대신 가능한 한 DatabaseSchemaUpdater 클래스를 사용하여 데이터베이스 업데이트를 수행하는 것이 좋습니다.

데이터베이스 마이그레이션의 첫 단계는 마이그레이션이 필요한지 여부를 확인하는 것입니다. 이렇게 하려면 앱이 개체 모델에 정의된 데이터베이스 스키마와 단말기에서 현재 사용된 데이터베이스 스키마 간에 버전 차이가 있는지 확인해야 합니다.

코드나 리소스 파일에서 개체 모델 버전을 앱 패키지 내에 저장해야 합니다. 현재 데이터베이스 버전은 플랫폼이 유지 관리하며 DatabaseSchemaUpdater 클래스의 DatabaseSchemaVersion 속성에서 사용할 수 있습니다. 시작 시 앱이 이러한 값의 불일치를 확인해야 합니다. 코드 버전이 단말기 버전보다 최신 버전인 경우 마이그레이션이 필요합니다.

마이그레이션 용도로만 사용되는 하나 이상의 마이그레이션 클래스에 모든 마이그레이션 논리를 격리하고 캡슐화해야 합니다. 이 논리는 앱 개체 모델의 어떤 부분과도 혼합하면 안 됩니다. 앱이 여러 마이그레이션 경로를 처리해야 할 가능성이 있는 경우 적절한 마이그레이션 개체를 반환할 수 있는 팩터리 클래스를 제공해야 합니다. 예를 들어 팩터리 클래스에 버전 1.0에서 버전 1.2로의 마이그레이션을 위한 반환 개체와 버전 1.1에서 버전 1.2로의 마이그레이션을 위한 다른 개체가 있을 수 있습니다. 지원되는 마이그레이션 경로 수에 비례하여 마이그레이션 처리에만 사용되는 코드의 크기와 복잡성이 증가합니다. 스키마를 변경할 때는 이후의 앱 유지 관리를 고려합니다.

마이그레이션 코드에서 마이그레이션 자체와 UI에 바인딩하는 데 필요한 진행률 정보를 모두 관리하는 것이 좋습니다. 진행률 정보는 단계(2/5 단계) 또는 완료율(73% 완료)을 기반으로 합니다.

중요중요:

OnNavigatedTo 이벤트에서 마이그레이션을 수행하지 않아야 합니다. 이 메서드에서 긴 작업을 수행하면 운영 체제가 앱을 종료할 수 있습니다. 자세한 내용은 Windows Phone 8의 앱 성능 고려 사항에서 생성자 및 로드된 이벤트의 코드 최소화를 참조하세요.

앱에 여러 마이그레이션이 필요할 것으로 예상되면 각 마이그레이션 경로에 대해 상속 및 확장할 수 있는 기본 클래스를 만들 수 있습니다. 예를 들어 기본 클래스에서 마이그레이션 시작과 해당 진행률 유지 관리를 처리할 수 있습니다.

앱은 DatabaseSchemaUpdater에서 Execute를 호출하기 전에 DatabaseSchemaVersion 속성을 업데이트해야 합니다. Execute 메서드를 실행하면 스키마 수정 및 버전 번호 업데이트를 비롯한 모든 변경 작업이 동일한 트랜잭션에서 수행됩니다.

자주 액세스하지 않는 테이블이 있는 경우 앱이 요청 시 마이그레이션을 수행하도록 선택할 수 있습니다. 최종 사용자가 전체 마이그레이션을 기다리도록 하는 대신 데이터베이스 마이그레이션을 작은 작업으로 나누어 사용자가 앱의 해당 영역에 접근할 수 있게 합니다. 예를 들어 정식 버전의 앱에 대한 마이그레이션 작업과 체험 버전에 관련된 작업을 구분할 수 있습니다. 이 방법은 체험 사용자에 맞게 마이그레이션 환경을 최적화하는 데 유용합니다.

이 릴리스에서는 기존 데이터베이스에서 열이나 테이블을 제거할 수 없습니다. 개체 속성이 더 이상 앱과 관련이 없어도 마이그레이션 후에 관련 열이 데이터베이스에 무기한 유지됩니다. 사용하지 않는 열이 원본 데이터베이스 정의에서 CanBeNull 열 특성을 통해 nullable로 정의되지 않은 경우 해당 행에 대한 이후 삽입 시 열에 null이 아닌 값을 지정해야 합니다.

앱이 한 테이블을 다른 테이블로 바꾸며 이전 테이블을 더 이상 사용하지 않는 경우 사용하지 않는 데이터 저장에 사용되는 공간 크기를 제한하기 위해 이전 테이블에서 모든 행을 제거합니다.

로컬 데이터베이스는 로컬 폴더에 있습니다. 로컬 폴더의 다른 파일과 유사하게 IsolatedStorageFile 클래스를 사용하여 로컬 데이터베이스를 삭제할 수 있습니다. 마이그레이션 후에 이전 데이터베이스가 더 이상 필요하지 않은 경우 앱이 삭제하는 것이 좋습니다.

마이그레이션을 앱에 통합할 때는 다음과 같은 모범 사례를 고려합니다.

  • 마이그레이션과 관련된 클래스 및 이전 데이터 컨텍스트를 해당 네임스페이스로 분리합니다. 예를 들어 MyProject.v1DataModel 네임스페이스는 네임스페이스의 코드가 첫 번째 버전의 데이터 모델과 관련이 있음을 나타냅니다.

  • Migration 클래스에서 새 버전의 데이터 모델을 기준으로 새 데이터베이스를 만듭니다.

  • 새 데이터베이스가 생성된 후 데이터를 테이블 단위로 전송합니다. 외래 키 관계로 연결된 테이블의 경우 부모 테이블을 복사한 다음 자식 테이블을 복사합니다.

  • 마이그레이션 상태는 마이그레이션 클래스에서 유지 관리합니다. 예를 들어 각 테이블에서 복사가 완료되면 마이그레이션 상태를 업데이트합니다. 마이그레이션이 완료되기 전에 앱이 종료된 경우 마이그레이션 상태를 사용하여 효율적인 방식으로 마이그레이션을 계속합니다.

  • 페이징이 포함된 큰 테이블을 복사하는 경우 다시 활성화 시 계속될 수 있도록 페이징 상태를 유지합니다.

표시:
© 2014 Microsoft