변경 단위 동기화
변경 단위는 연락처 카드를 나타내는 항목의 전화 번호 필드와 같은 하위 항목의 변경 내용을 나타냅니다. 변경 단위를 사용하면 공급자에서 하위 항목의 변경 내용을 보다 효율적으로 동기화할 수 있습니다. 변경 단위를 활용하는 공급자의 예로는 PIM(개인 정보 관리) 공급자 및 이미지 관련 메타데이터를 처리하는 공급자가 있습니다.
변경 단위
변경 단위를 사용하면 하위 항목의 변경 내용을 간편하게 나타내고 변경 내용을 보다 세밀하게 추적할 수 있습니다. 이를 통해 항목이 변경될 때 발생하는 충돌 횟수를 줄일 수 있습니다.
연락처 카드를 나타내는 항목을 파일 시스템에 유지한다고 가정해 봅니다. 변경 내용 추적의 세부 단위가 항목(파일) 수준인 경우 파일에 대한 모든 변경 내용이 항목 변경 내용이 되므로 연락처의 모든 데이터를 전송해야 합니다. 변경 단위를 사용하면 공급자가 연락처의 이름, 성 및 전화 번호와 같은 속성 수준에서 변경 내용을 검색하고 데이터 충돌을 해결할 수 있습니다. 이러한 경우 두 복제본에서 독립적으로 연락처의 서로 다른 속성을 변경하면(예: 복제본 하나에서는 전자 메일 주소를 수정하고 다른 복제본에서는 이미지를 추가한 경우) 항목 수준에서 충돌이 검색되지 않으며 변경 단위 데이터만 전송하면 됩니다.
변경 단위 집합은 특정 스키마를 동기화하는 복제본에서 변경 단위의 순서를 결정하는 스키마를 구성합니다. 예를 들어 복제본은 연락처 속성을 다음과 같이 나타낼 수 있습니다.
Change Unit[0] = First Name
Change Unit[1] = Last Name
Change Unit[2] = Phone Number
변경 단위 삭제
변경 단위의 지속 시간은 항목의 지속 시간에 종속됩니다. 일반적인 변경 내용 항목과 달리 변경 단위는 여러 복제본에서 항목의 속성으로 합의된 것이므로 삭제할 수 없습니다.
변경 단위 추가
예기치 않은 효과가 발생할 수 있으므로 공급자는 변경 단위를 임의로 만들지 말아야 합니다.
데이터 동기화와 별도로 발생하는 스키마 업데이트에 따라 변경 단위를 추가할 수 있습니다. 이때 추가되는 변경 단위는 null 값이거나 모든 복제본에서 가정하는 기본값이어야 합니다. 이렇게 하면 추가된 변경 단위의 업데이트 버전은 해당 변경 단위가 수정될 때까지 항목의 생성 버전이 됩니다. 이러한 방법으로 추가된 변경 단위는 응용 프로그램 구성 요소에서 처음부터 존재했으며 수정된 적이 없는 변경 단위와 마찬가지로 취급할 수 있습니다.
변경 단위 변경 내용 열거
원본 공급자에서 변경 단위를 사용하여 원본 복제본에서 열거되는 하위 항목을 나타내는 경우 전체 항목 대신 변경된 변경 단위만 전송됩니다. 항목에 변경 단위가 들어 있는 경우에는 항목 자체가 아닌 각 변경 단위에 대한 버전 정보만 유지됩니다.
관리 코드를 사용하여 변경 단위 변경 내용 열거
전송할 변경 단위를 결정하기 위해 원본 공급자는 대상 공급자에서 가져온 SyncKnowledge 개체의 Contains 또는 Contains 메서드를 사용합니다. 변경 단위 변경 내용이 대상 정보에 들어 있지 않으면 원본 공급자에서 전송하는 일괄 변경 내용에 해당 변경 내용을 포함해야 합니다.
변경 단위 변경 내용은 일괄 변경 내용에 추가된 항목 변경 내용 내에 들어 있습니다. ItemChange 생성자를 사용하여 변경 단위 변경 내용이 들어 있는 ItemChange 개체를 만들 수도 있고, AddChangeUnitChange를 사용하여 변경 단위 변경 내용을 추가할 수도 있습니다.
비관리 코드를 사용하여 변경 단위 변경 내용 열거
전송할 변경 단위를 결정하기 위해 원본 공급자는 대상 공급자에서 가져온 ISyncKnowledge 개체의 ISyncKnowledge::ContainsChangeUnit 메서드를 사용합니다. 변경 단위 변경 내용이 대상 정보에 들어 있지 않으면 원본 공급자에서 전송하는 일괄 변경 내용에 해당 변경 내용을 포함해야 합니다.
변경 단위 변경 내용은 일괄 변경 내용에 추가된 항목 변경 내용 내에 들어 있습니다. 변경 단위 변경 내용을 추가하려면 ISyncChangeBatchBase::AddItemMetadataToGroup 메서드의 ppChangeBuilder 매개 변수에 NULL이 아닌 값을 지정합니다. 그런 다음 반환된 ISyncChangeBuilder 개체의 ISyncChangeBuilder::AddChangeUnitMetadata를 사용하여 관련 항목 변경 내용에 변경 단위 변경 내용을 추가할 수 있습니다.
변경 단위 변경 내용 처리
대상 공급자가 ProcessChangeBatch(관리 코드의 경우) 또는 IKnowledgeSyncProvider::ProcessChangeBatch(비관리 코드의 경우) 메서드에서 변경 내용 적용자를 사용하여 일괄 변경 내용을 처리할 때 대상 공급자는 원본 공급자에서 받은 각 변경 내용의 대상 버전 정보를 열거합니다. 원본 변경 내용에 변경 단위 변경 내용이 들어 있는 경우 대상 공급자는 대상 버전의 일괄 처리에 포함할 변경 단위 버전(있는 경우)을 결정해야 합니다. 포함할 변경 단위 버전은 원본 공급자의 변경 내용 유형 및 해당 항목이 대상 복제본에서 삭제된 것으로 표시되는지 여부에 따라 결정됩니다. 다음 표에서는 대상 공급자가 변경 내용 적용자에 전송해야 하는 버전 정보를 보여 줍니다.
|
원본 변경 내용이 삭제인 경우 |
원본 변경 내용이 업데이트인 경우 |
대상 항목이 삭제된 경우 |
대상 항목 버전만 전송합니다. 전체 항목만 삭제할 수 있습니다. 따라서 삭제 버전 정보는 항목에 대해 추적됩니다. |
대상 항목 버전만 전송합니다. 전체 항목만 삭제할 수 있습니다. 따라서 삭제 버전 정보는 항목에 대해 추적됩니다. |
대상 항목이 삭제되지 않은 경우 |
전체 대상 변경 단위 버전을 전송합니다. |
원본에서 열거된 변경 단위에 대한 대상 변경 단위 버전만 전송합니다. |
변경 단위가 들어 있는 충돌 처리
응용 프로그램에서 변경 단위가 들어 있는 변경 내용에 대해 사용자 지정 충돌 해결을 사용하는 경우 일반적으로 SetResolutionAction(관리 코드의 경우) 또는 IChangeConflict::SetResolveActionForChangeUnit(비관리 코드의 경우)을 사용하여 변경 단위 충돌에 대한 해결 동작을 설정해야 합니다.
그러나 복제본 중 하나에서 업데이트가 수행되고 다른 복제본에서 삭제가 수행되어 충돌이 발생한 경우에는 응용 프로그램에서 SetResolutionAction(관리 코드의 경우) 또는 IChangeConflict::SetResolveActionForChange(비관리 코드의 경우)를 사용하여 항목 충돌에 대한 해결 동작을 지정해야 합니다.
변경 단위 변경 내용 적용
일반적으로 변경 내용에 변경 단위가 들어 있는 경우 Sync Framework에서는 SaveChangeWithChangeUnits(관리 코드의 경우) 또는 ISynchronousNotifyingChangeApplierTarget::SaveChangeWithChangeUnits(비관리 코드의 경우)를 호출하여 변경 내용을 대상 복제본에 적용합니다. 그러나 충돌이 발생했으며 충돌 해결의 결과로 항목이 삭제된 경우 Sync Framework에서는 SaveItemChange(관리 코드의 경우) 또는 ISynchronousNotifyingChangeApplierTarget::SaveChange(비관리 코드의 경우)를 호출합니다. 이는 개별 변경 단위가 아닌 전체 항목만 삭제할 수 있기 때문입니다.