동기화 데이터 필터링
필터는 동기화되는 데이터를 제한하는 데 사용됩니다. 일반적으로 원본 공급자에서 변경 내용을 열거하는 동안 필터를 적용하여 보내는 변경 내용을 제한합니다. Sync Framework에서는 다음과 같은 유형의 필터를 지원합니다.
항목 필터 - 동기화 데이터를 항목의 하위 집합으로 제한합니다. 예를 들어 두 파일 폴더 간에 다른 형식의 파일은 무시하고 .txt 파일만 동기화할 수 있습니다. 기존 항목을 필터 내부나 외부로 이동하는 방식으로 항목이 변경되지는 않습니다. 항목 필터는 간편하게 사용할 수 있지만 동기화 범위에 포함되는 항목 수에 비례하여 동기화에 사용되는 메타데이터가 증가합니다.
변경 단위 필터 - 동기화 데이터를 변경 단위의 하위 집합으로 제한합니다. 예를 들어 나머지 변경 단위는 무시하고 연락처의 name 및 phone number 필드만 동기화할 수 있습니다.
사용자 지정 필터 - Sync Framework에 알려지지 않은 방식으로 동기화 데이터를 제한합니다. 시간이 지나면 항목을 사용자 지정 필터에 포함하거나 필터에서 제외할 수 있습니다. Sync Framework에서는 메타데이터의 전체 크기를 최소화하는 동시에 사용자 지정 필터를 효율적으로 지원할 수 있도록 추가적인 메타데이터, 인터페이스 및 클래스를 정의합니다.
필터는 동기화 응용 프로그램, 원본 또는 대상 공급자에서 정의되거나 원본 및 대상 공급자 간에 협상될 수 있습니다.
필터는 변경 내용이 감지될 때 원본 공급자에서 사용됩니다. 변경 내용을 감지하는 동안 작성된 변경 내용 일괄 처리에는 필터를 통과하는 동기화 데이터만 포함됩니다.
필터는 변경 내용을 적용할 때 대상 공급자에서 사용될 수도 있습니다. 대상 복제본에 적용되는 변경 내용에는 필터를 통과하는 동기화 데이터만 포함됩니다.
동기화되는 항목 제어
항목 필터는 변경 내용을 열거하는 동안 원본 공급자가 보내는 항목 변경 내용을 정의합니다. 항목 필터링 방법이 동기화 범위의 데이터 형식에 따라 달라지므로 Sync Framework에서는 원본 공급자가 필터링 메커니즘을 정의할 수 있습니다. 공급자와 동기화 응용 프로그램 간에 필터에 대한 통신이 필요하면 적절한 메커니즘을 사용하여 수행할 수 있습니다.
원본 공급자가 항목 변경 내용을 필터링할 때 Sync Framework에서는 원본 공급자가 필터에 대한 정보를 변경 내용을 열거하는 동안 보내는 모든 변경 내용 일괄 처리 개체에 연결하도록 요청합니다. 변경 내용 일괄 처리 개체에 항목 필터 정보가 있으면 Sync Framework에서 필터링된 동기화가 발생하고 있음을 알 수 있으므로 Sync Framework에서 필터링된 변경 내용 일괄 처리에 대한 정보를 올바로 처리할 수 있습니다. 원본 공급자에서 변경 내용 일괄 처리에 포함된 항목을 필터링하지만 변경 내용 일괄 처리 개체에 항목 필터 정보를 지정하지 않으면 Sync Framework에서 정보를 제대로 처리하지 못할 수 있습니다.
원본 공급자가 필터를 사용하여 변경 내용 일괄 처리에 포함되는 항목을 제한할 때 공급자는 필터에 대한 정보를 ChangeBatch(관리 코드의 경우) 또는 ISyncChangeBatch(비관리 코드의 경우) 개체에 연결해야 합니다. 필터 정보는 ItemListFilterInfo 개체(관리 코드의 경우) 또는 SYNC_FILTER_INFO_FLAG_ITEM_LIST 플래그가 설정된 ISyncFilterInfo 개체(비관리 코드의 경우)로 표현됩니다. 비관리 코드에서 공급자는 IProviderFilteredSyncServices::CreateFilterInfo를 사용하여 ISyncFilterInfo 개체를 만듭니다. ChangeBatch(관리 코드의 경우) 또는 IProviderFilteredSyncServices::CreateFilteredEnumerationChangeBatch(비관리 코드의 경우)를 사용하여 변경 내용 일괄 처리에 필터 정보를 연결합니다.
항목 필터링을 사용하는 방법에 대한 자세한 내용은 방법: 열거된 항목 필터링을 참조하십시오.
동기화되는 변경 단위 제어
변경 단위 필터는 변경 내용을 열거하는 동안 원본 공급자가 보내는 각 항목 변경 내용에 포함할 변경 단위 변경 내용을 정의합니다. 변경 단위 필터는 범위 안의 항목에 대해 정의된 변경 단위의 하위 집합만 복제본에 저장된 경우 유용합니다.
예를 들어 동기화 커뮤니티에서 연락처 정보를 교환하고 name, phone number 및 address에 대한 변경 단위를 정의합니다. 커뮤니티의 한 복제본은 name과 phone number만 저장할 수 있는 모바일 장치입니다. 이 복제본에서는 변경 단위 필터를 사용하여 이러한 두 변경 단위에 대한 정보만 추적하도록 지정합니다. 원본 복제본에서 장치 복제본에 데이터를 동기화할 때 변경 단위 필터를 사용하여 name 및 phone number 변경 단위에 대한 정보만 보냅니다. 원본 공급자에서 배운 정보가 변경 단위 필터에 투영되므로 장치 복제본의 정보에는 name 및 phone number 변경 단위의 정보만 포함됩니다. 마찬가지로 장치에서 로컬로 변경되고 이후 장치가 동기화 세션에서 원본 복제본으로 사용될 때 변경 내용을 받는 복제본에서 지정된 변경 단위 집합에 대한 정보만 업데이트합니다.
변경 단위 필터가 사용될 때 Sync Framework에서 변경 내용 일괄 처리에 대한 배운 정보를 필터에 지정된 변경 단위 집합에 투영하므로 변경 내용 일괄 처리에 대한 배운 정보에 지정된 변경 단위 집합에 대한 정보만 포함됩니다.
변경 단위 변경 내용을 필터링하기 위해 원본 공급자에서 ChangeUnitListFilterInfo 개체(관리 코드의 경우) 또는 IChangeUnitListFilterInfo(비관리 코드의 경우)를 만들고 동기화될 변경 단위 집합을 지정합니다. 비관리 코드에서 IChangeUnitListFilterInfo 개체는 SYNC_FILTER_INFO_FLAG_CHANGE_UNIT_LIST를 IProviderFilteredSyncServices::CreateFilterInfo 메서드에 지정하여 만들어집니다. 원본 공급자는 ChangeBatch(관리 코드의 경우) 또는 IProviderFilteredSyncServices::CreateFilteredEnumerationChangeBatch(비관리 코드의 경우)를 사용하여 변경 내용 일괄 처리 개체를 만드는 방식으로 필터 정보를 변경 내용 일괄 처리에 연결합니다.
변경 단위 필터를 사용하는 방법에 대한 자세한 내용은 방법: 열거된 변경 단위 필터링을 참조하십시오.
사용자 지정 필터를 사용하여 동기화되는 내용 제어
사용자 지정 필터는 대개 공급자 개발자에 의해 Sync Framework 외부에서 정의되지만 타사에서 정의될 수도 있습니다. Sync Framework에는 필터가 동기화 범위에 포함시킬 대상을 결정하는 방법에 대한 정보가 없습니다. 사용자 지정 필터는 시간에 따라 항목이 필터에 포함되거나 필터에서 제외되는 방식으로 정의할 수 있습니다. 예를 들어, 미디어 파일을 저장하는 복제본에 대해 별점 3개 이상의 파일을 모두 포함하는 필터를 정의할 수 있습니다. 이 경우 사용자가 파일의 별점을 변경하면 파일이 필터에 포함되거나 필터에서 제외될 수 있습니다.
사용자 지정 필터는 단순 공급자 또는 제약 조건 충돌을 보고하거나 변경 적용 서비스를 사용하는 공급자에서 사용할 수 없으며, 그렇지 않을 경우 예상치 못한 결과가 발생할 수 있습니다.
사용자 지정 필터를 효율적으로 지원하기 위해 Sync Framework에서는 몇 가지 새로운 개념을 정의합니다.
필터 추적 복제본은 현재 추적된 필터에 있는 항목과 변경 단위, 최근에 추적된 필터에 포함되거나 제외된 항목과 변경 단위, 그리고 추적된 필터에 없으며 잊어버린 모든 항목과 변경 단위를 다루는 필터 잊어버린 정보를 정의하는 메타데이터를 유지 관리하는 복제본입니다. 필터 추적은 복제본에 저장되는 항목에는 영향을 미치지 않습니다. 복제본은 동기화 범위의 모든 항목을 저장하면서 여러 필터를 추적할 수 있습니다. 일반적으로, 필터 추적 복제본은 추적된 모든 필터에 대해 필터링된 변경 내용 일괄 처리를 제공할 수 있습니다.
필터링된 복제본은 필터에 있는 항목과 변경 단위에 대해서만 항목과 변경 단위 데이터를 저장하고 필터에 포함되었지만 제외된 항목과 변경 단위에 대해서는 메타데이터를 저장하는 복제본입니다. 필터링된 복제본은 항상 현재 사용하는 필터를 추적하며 경우에 따라 추가 필터도 추적할 수 있습니다. 필터링된 대상 공급자는 원본 공급자로부터 필터링된 변경 내용 열거를 요청하거나 전체 변경 내용 열거를 요청한 다음 변경 내용을 적용하는 동안 자체적으로 변경 내용을 필터링할 수 있습니다.
삭제할 항목은 필터에 있었지만 제외된 필터링된 복제본의 항목과 변경 단위입니다. 필터링된 복제본은 삭제할 항목에 대한 메타데이터를 저장하지만 항목 또는 변경 단위 데이터는 저장하지 않습니다.
필터 잊어버린 정보는 필터 추적의 시작 지점을 정의합니다. 필터 추적 복제본은 삭제할 항목을 제거하고 제거된 삭제할 항목 중에서 버전이 가장 높은 항목을 포함하도록 필터 잊어버린 정보를 진행하는 방식으로 저장 공간을 절약할 수 있습니다. 동기화 커뮤니티의 한 복제본이 필터를 사용하고 있는 상태에서 다른 복제본이 필터를 추적하기 시작하는 경우에도 필터 잊어버린 정보가 사용됩니다.
필터 추적
동기화 커뮤니티의 모든 복제본이 커뮤니티에 사용되는 필터를 추적하는 것이 좋습니다. 필터링된 복제본이 필터 추적 복제본에서 필터링된 변경 내용 열거를 받은 경우에는 필터링된 복제본의 정보 크기가 작게 유지됩니다. 하지만 필터링된 복제본이 필터를 추적하지 않는 복제본으로부터 필터링된 변경 내용 열거를 받은 경우에는 정보 크기가 전송된 변경 내용의 수에 비례하여 커집니다.
추적 필터에 대한 자세한 내용은 방법: 필터 추적 및 필터링된 변경 내용 열거를 참조하십시오.
필터 메타데이터
필터를 추적하기 위해 복제본은 복제본에 있는 각 항목이나 변경 단위에 대한 필터 메타데이터를 저장합니다. 필터 메타데이터에는 다음 표에 있는 요소가 포함됩니다.
필터에 있는지 여부 | 이동 버전 |
---|---|
항목이나 변경 단위가 필터에 있는지 여부를 나타냅니다. |
항목이 필터와 관련하여 이동하게 한 변경 버전입니다. 항목이 생성되고 항목이 필터에 있는 경우 이 버전은 항목의 생성 버전으로 설정됩니다. 항목이 필터에 있었던 적이 없다면 이 버전은 (0,0)으로 설정됩니다. |
복제본이 필터를 추적하기 시작할 때 모든 항목이나 변경 단위가 필터에 대해 평가되어야 합니다. 항목이나 변경 단위가 필터에 있는 경우 해당 필터 메타데이터는 필터에 있는 항목이나 변경 단위임을 나타내야 하며 해당 이동 버전은 항목이나 변경 단위의 최신 변경 버전으로 설정되어야 합니다. 항목이 필터에 없는 경우 해당 필터 메타데이터는 필터에 없는 항목이나 변경 단위임을 나타내야 하며 해당 이동 버전은 (0,0)으로 설정되어야 합니다.
필터 추적 복제본은 추적 대상이 되는 각 필터에 대한 필터 잊어버린 정보를 저장할 수도 있습니다. 필터 추적 복제본이 필터가 시작된 시점부터 필터를 추적한 경우에는 필터를 추적하지 않는 복제본으로부터 동기화 데이터를 받지 않는 한 필터 잊어버린 정보를 저장하지 않습니다. 필터 추적 복제본이 필터가 시작된 후에 필터를 추적하기 시작한 경우에는 복제본의 현재 정보에 대한 필터 잊어버린 정보를 초기화해야 합니다. 복제본에서 삭제 표식과 필터 변경 내용 메타데이터가 정리된 경우에는 필터 잊어버린 정보를 무시하고 대신 잊어버린 정보를 사용할 수 있습니다.
추적된 필터 협상
필터 추적 공급자는 IFilterTrackingProvider(관리 코드의 경우) 또는 IFilterTrackingProvider(비관리 코드의 경우)를 구현해야 합니다. 이 인터페이스는 원본 복제본과 대상 복제본에서 모두 추적되는 필터의 통신에 사용됩니다. 원본 복제본은 원본 복제본과 대상 복제본에서 모두 추적되는 필터에 대한 필터 메타데이터를 보냅니다.
동기화 세션의 두 공급자가 모두 필터 추적 공급자인 경우 Sync Framework는 두 공급자 모두에 의해 추적되는 필터에 대한 협상을 중재합니다. 추적된 필터는 다음과 같은 단계에 따라 두 필터 추적 공급자 간에 협상됩니다.
BeginSession(관리 코드의 경우) 또는 IKnowledgeSyncProvider::BeginSession(비관리 코드의 경우)을 호출한 다음 Sync Framework에서 대상 공급자의 SpecifyTrackedFilters(관리 코드의 경우) 또는 IFilterTrackingProvider::SpecifyTrackedFilters(비관리 코드의 경우)를 호출합니다.
대상 공급자는 자신의 추적된 필터 목록을 열거한 후 그 각각을 RequestTrackedFilterCallback 대리자(관리 코드의 경우) 또는 SpecifyTrackedFilters에 대한 호출에 지정된 IFilterRequestCallback 개체의 IFilterRequestCallback::RequestFilter 메서드(비관리 코드의 경우)에 전달합니다.
대상 공급자에 의해 지정된 각 필터에 대해 Sync Framework는 원본 공급자에서 TryAddTrackedFilter(관리 코드의 경우) 또는 IFilterTrackingProvider::AddTrackedFilter(비관리 코드의 경우)를 호출합니다.
원본 공급자는 대상 공급자에 의해 추적되는 필터 목록을 유지 관리하며 자신이 지정된 필터를 추적하는지 여부를 나타내는 값을 반환합니다.
Sync Framework에서는 이 값을 대상 공급자로 전달합니다.
추적된 필터에 대한 필터 메타데이터 보내기
대상 공급자가 추적하는 필터를 원본 공급자도 추적하는 경우 서로 추적되는 필터에 대한 필터 메타데이터는 원본 공급자가 보내야 합니다. 이를 위해 원본 공급자의 GetChangeBatch(관리 코드의 경우) 또는 IKnowledgeSyncProvider::GetChangeBatch(비관리 코드의 경우) 구현에 다음과 같은 변경 내용을 추가해야 합니다.
FilterKeyMap 속성을 설정하여 FilterKeyMap 개체를 ChangeBatch 개체에 추가하거나(관리 코드의 경우), ISyncChangeBatchWithFilterKeyMap::SetFilterKeyMap을 호출하여 IFilterKeyMap 개체를 ISyncChangeBatchWithFilterKeyMap 개체에 추가합니다(비관리 코드의 경우). 필터 키 맵 개체는 원본 공급자와 대상 공급자에서 모두 추적되는 필터를 포함합니다. 변경 내용 일괄 처리에서 그룹이 시작되기 전에 FilterKeyMap 속성을 설정하거나(관리 코드의 경우), SetFilterKeyMap 메서드를 호출해야 합니다(비관리 코드의 경우).
변경 내용 일괄 처리의 각 그룹에 대해 SetFilterForgottenKnowledge(관리 코드의 경우) 또는 ISyncChangeBatchWithFilterKeyMap::SetFilterForgottenKnowledge(비관리 코드의 경우)를 호출하여 추적된 필터에 대한 필터 잊어버린 정보를 추가합니다.
추적된 필터에 포함되거나 제외된 각 항목이나 변경 단위에 대한 필터 변경 내용 메타데이터를 보냅니다. 필터 변경 내용 메타데이터는 AddFilterChange(관리 코드의 경우) 또는 IFilterTrackingSyncChangeBuilder::AddFilterChange(비관리 코드의 경우)를 호출하여 변경 내용에 추가됩니다. FilterChange 속성(관리 코드의 경우) 또는 SYNC_FILTER_CHANGE 값(비관리 코드의 경우)은 항목이 필터에 포함되는지 아니면 제외되는지 여부와 항목을 이동하게 한 변경 내용의 버전을 나타냅니다. 필터 변경 내용 메타데이터는 이동 버전이 항목의 대상 정보에 포함되어 있지 않은 경우에만 추가됩니다. 변경 단위를 사용하는 경우 이동 버전이 변경 단위의 대상 정보에 포함되어 있지 않으면 필터 변경 내용 메타데이터가 추가되어야 합니다. 변경 단위 버전을 사용하는 것이 아니라 항목 버전을 사용하는 형태의 Contains 메서드(관리 코드의 경우) 또는 ISyncKnowledge::ContainsChange 메서드(비관리 코드의 경우)를 사용하여 포함 여부를 확인하므로, 이동 버전은 변경 단위를 사용하는 경우에 항목 버전으로 취급된다는 점에 주의하십시오.
변경 단위가 사용되고 최소한 하나 이상의 변경 단위 변경 내용이 대상 정보에 포함되어 있지 않으면 AllChangeUnitsRequired와 소유하는 항목의 항목 ID(관리 코드의 경우) 또는 소유하는 항목의 항목 ID(비관리 코드의 경우)를 지정하여 대상 정보에 대해 ContainsMarker(관리 코드의 경우) 또는 IKnowledgeWithMarkers::ContainsAllChangeUnitsRequiredMarker(비관리 코드의 경우)를 호출합니다. 이 메서드에서 모든 변경 단위가 필요하다고 나타나는 경우 항목에 대한 모든 변경 단위를 전송하고 ItemChange 개체의 SetAllChangeUnitsPresent(관리 코드의 경우) 또는 IFilterTrackingSyncChangeBuilder::SetAllChangeUnitsPresentFlag(비관리 코드의 경우)를 호출합니다.
필터링된 변경 내용 보내기
일반적으로, 필터 추적 복제본을 나타내는 원본 공급자는 추적된 모든 필터에 대해 필터링된 변경 내용 일괄 처리를 열거할 수 있습니다. 필터는 응용 프로그램에 의해 식별되거나, 응용 프로그램과 원본 공급자 간의 사용자 지정 메커니즘을 사용하여 식별되거나 또는 원본 공급자와 대상 공급자 간에 협상될 수 있습니다. 필터 협상에 대해서는 이 문서의 뒷부분에서 설명합니다.
필터링된 변경 내용 일괄 처리를 보내려면 원본 공급자의 GetChangeBatch 메서드에 다음 요소를 추가합니다.
동기화에 사용된 필터를 포함하는 CustomFilterInfo(관리 코드의 경우) 또는 ICustomFilterInfo(비관리 코드의 경우) 개체를 만듭니다. 필터 정보 개체를 적절한 변경 내용 일괄 처리 생성자 ChangeBatch에 전달하거나(관리 코드의 경우), IProviderFilteredSyncServices::CreateFilteredEnumerationChangeBatch를 호출하여(비관리 코드의 경우) 필터링된 변경 내용 일괄 처리 개체를 만듭니다. 또한, 변경 내용 일괄 처리 개체를 만들 때 복제본의 잊어버린 정보 대신 필터의 필터 잊어버린 정보를 전달합니다.
항목이나 변경 단위가 이전에 필터에 있었지만 현재는 필터에 없는 경우 ChangeKind 속성을 Ghost로 지정하거나(관리 코드의 경우), SYNC_CHANGE_FLAG_GHOST 플래그를 ISyncChangeBatchBase::AddItemMetadataToGroup으로 전달합니다(비관리 코드의 경우).
대상 공급자의 필터링 유형이 CurrentItemsOnly(관리 코드의 경우) 또는 FT_CURRENT_ITEMS_ONLY(비관리 코드의 경우)이면 항목이 필터에 있는 경우에만 변경 내용 일괄 처리에 항목을 포함시킵니다. 즉, 삭제할 항목을 보내지 마십시오.
대상 공급자의 필터링 유형이 CurrentItemsAndVersionsForMovedOutItems(관리 코드의 경우) 또는 FT_CURRENT_ITEMS_AND_VERSIONS_FOR_MOVED_OUT_ITEMS(비관리 코드의 경우)이면 필터에 있는 항목과 필터에서 제외된 항목을 포함시킵니다. 항목이나 변경 단위가 이전에 필터에 있었지만, 현재는 필터에 없으며 항목이나 변경 단위를 필터에서 제외한 변경 내용의 버전이 대상 정보에 포함되어 있지 않은 경우 제외 정보를 보내야 합니다.
필터 메타데이터 적용
대상 공급자가 필터 추적 공급자를 나타내고 변경 내용 적용자를 사용하여 대상 복제본에 변경 내용을 적용하는 경우 대상 공급자가 IFilterTrackingNotifyingChangeApplierTarget(관리 코드의 경우) 또는 IFilterTrackingNotifyingChangeApplierTarget(비관리 코드의 경우)을 구현해야 합니다. 이 인터페이스에는 Sync Framework에서 추적된 필터의 필터 키 맵과 필터 잊어버린 정보를 가져오는 데 사용하는 메서드가 포함됩니다. 또한, Sync Framework에서 필터 추적 공급자에 대해 StoreKnowledgeForScope(관리 코드의 경우) 또는 ISynchronousNotifyingChangeApplierTarget::SaveKnowledge(비관리 코드의 경우) 대신 호출하는 SaveKnowledgeWithFilterForgottenKnowledge(관리 코드의 경우) 또는 IFilterTrackingNotifyingChangeApplierTarget::SaveKnowledgeWithFilterForgottenKnowledges(비관리 코드의 경우) 메서드도 포함됩니다. Sync Framework에서는 변경 내용 일괄 처리가 적용된 후 이 메서드를 사용하여 공급자로 업데이트된 정보, 잊어버린 정보 및 필터 잊어버린 정보를 보냅니다.
다음 단계를 수행하려면 IFilterTrackingNotifyingChangeApplierTarget을 구현할 뿐만 아니라 대상 공급자의 SaveItemChange나 SaveChangeWithChangeUnits 메서드(관리 코드의 경우) 또는 ISynchronousNotifyingChangeApplierTarget::SaveChange나 ISynchronousNotifyingChangeApplierTarget::SaveChangeWithChangeUnits 메서드(비관리 코드의 경우)를 업데이트해야 합니다.
변경 내용 개체에 대해 GetFilterChange(관리 코드의 경우) 또는 ISyncChangeWithFilterKeyMap::GetFilterChange(비관리 코드의 경우)를 호출하여 각 추적된 필터에 대한 필터 변경 내용 메타데이터를 가져옵니다.
변경 내용 메타데이터가 있는 경우 사용되는 것인지 확인합니다. 해당 이동 버전이 항목의 대상 정보에 포함되면 필터 변경 내용은 사용되지 않습니다. 변경 단위를 사용하는 경우 이동 버전이 모든 변경 단위의 대상 정보에 포함되어 있을 때만 필터 변경 내용이 사용되지 않습니다. 필터 변경 내용이 사용되지 않는 경우 대상 복제본에 적용하지 마십시오.
필터 변경 내용 메타데이터가 존재하고 사용되지 않는다면 대상 복제본에 이미 존재하는 필터 변경 내용 정보와 충돌하지 않는지 확인합니다. 충돌을 확인하려면 다음 단계를 수행하십시오.
대상 복제본에서 항목이나 변경 단위에 대해 현재 저장되어 있는 이동 버전을 가져옵니다.
이동 버전이 항목의 기본 정보에 포함되어 있거나, 항목과 연결된 모든 변경 단위 변경 내용의 기본 정보에 포함되어 있는지 여부를 확인합니다.
이동 버전이 해당하는 기본 정보에 포함되어 있지 않다면 필터 변경 내용이 충돌하는 상태입니다. 이 경우 대상 공급자가 충돌을 적절히 해결하고 변경 내용에 대한 새 이동 버전을 할당해야 합니다.
이동 버전과 함께 충돌이 검색되지 않으면 원본 필터 변경 내용의 내부로 이동 플래그를 대상 항목의 내부로 이동 플래그 또는 변경 단위와 대조합니다. 플래그의 값에 일관성이 없는 경우 대상 공급자는 해당 항목 또는 변경 단위를 필터에 대해 평가하고 올바른 내부로 이동 플래그 값을 새로운 이동 버전과 함께 할당해야 합니다.
충돌이 검색되지 않으면 항목의 메타데이터와 함께 필터 변경 내용 메타데이터를 저장합니다.
필터 변경 내용 메타데이터가 추적된 필터에 대해 없거나 대상 복제본에 의해 추적되지만 원본 복제본에 의해 추적되지 않는 필터에 없는 경우 대상의 필터에 대해 변경 내용을 평가합니다. 항목이 필터에 있는지 여부를 포함하도록 필터 메타데이터를 업데이트하고 변경 내용으로 인해 항목이 필터와 관련하여 이동하는 경우 이동 버전을 변경 내용의 버전으로 업데이트합니다. 필터와 연결된 여러 변경 단위가 있고 그에 대한 변경 내용으로 인해 항목이 필터와 관련하여 이동하는 경우 새 로컬 버전을 만들어 새 버전을 해당 항목의 이동 버전으로 할당하고 필터와 연결된 모든 변경 단위의 변경 내용 버전으로 할당합니다.
필터링된 복제본
필터링된 복제본은 필터에 있는 항목과 변경 단위에 대해서만 항목과 변경 단위 데이터를 저장하고, 이전에 필터에 포함되었다가 현재는 제외된 항목과 변경 단위(삭제할 항목)에 대해서는 메타데이터를 저장합니다. 또한, 필터링된 복제본은 해당 필터를 추적하며 경우에 따라 다른 필터도 추적할 수 있습니다. 필터링된 복제본은 원본 공급자와 함께 필터를 협상할 수 있으며, 이 경우 원본 공급자가 필터링된 변경 내용 일괄 처리를 생성합니다. 원본 공급자가 필터링된 변경 내용 일괄 처리를 생성할 수 없는 경우에는 필터링된 공급자가 변경 내용 자체를 필터링하여 현재 필터에 있는 변경 내용만 적용할 수 있습니다.
필터링된 복제본의 구현에 대한 자세한 내용은 방법: 복제본 필터링을 참조하십시오.
필터에 포함된 항목 열거
필터링된 복제본은 IFilteredReplicaNotifyingChangeApplierTarget(관리 코드의 경우) 또는 IFilteredReplicaNotifyingChangeApplierTarget(비관리 코드의 경우) 인터페이스를 구현합니다. 이 인터페이스에는 Sync Framework에서 특정 시점 이후에 필터에 포함된 항목을 가져오는 데 사용하는 GetNewMoveInItems(관리 코드의 경우) 또는 IFilteredReplicaNotifyingChangeApplierTarget::GetNewMoveins(비관리 코드의 경우)가 포함됩니다. 항목이 활성 상태이고, 항목이 필터에 있으며, 항목의 이동 버전이 메서드에 지정된 정보에 포함되어 있지 않은 경우 이 메서드에서 반환된 목록에 항목이 추가됩니다.
필터링되지 않은 변경 내용 보내기
필터링된 복제본이 원본 복제본이고 대상 복제본이 필터링된 변경 내용 열거를 요청하지 않거나 두 복제본 간에 필터가 성공적으로 결정되지 않는 경우 원본 복제본은 변경 내용을 필터링되지 않은 것처럼 열거합니다. 이는 다음과 같은 방법으로 필터링된 변경 내용을 보내는 과정에서 달라집니다.
필터링되지 않은 일괄 변경 내용이 만들어집니다.
일괄 변경 내용을 만들 때는 복제본의 잊어버린 정보가 전달되지만 필터링된 변경 내용을 보낼 때는 필터 잊어버린 정보가 전달되지 않습니다.
필터링된 변경 내용 적용
대상 공급자가 변경 내용 적용자를 사용하여 변경 내용을 적용할 경우 대상 공급자는 변경 내용 적용자에 대상 버전을 보낼 때 대상 항목이나 변경 단위가 삭제할 항목인지 여부를 지정해야 합니다. 이렇게 하려면, 항목이 대상 복제본에서 삭제할 항목인 경우 ChangeKind 속성에 Ghost를 지정하거나(관리 코드의 경우), IDestinationChangeVersionsBuilder::AddItemMetadata로 SYNC_CHANGE_FLAG_GHOST 플래그를 전달합니다(비관리 코드의 경우). 대상 메타데이터 저장소에 특정 항목의 메타데이터가 존재하고, 항목이 삭제되지 않았으며, 대상 저장소에 해당 항목의 데이터가 없는 경우 항목은 삭제할 항목이 됩니다.
원본 공급자의 변경 내용이 필터링되지 않은 경우 대상 공급자가 대상 복제본의 필터를 기준으로 원본 공급자에서 보낸 모든 변경 내용을 평가합니다. 대상 공급자는 필터를 통과한 변경 내용을 적용하고 영향을 받는 모든 삭제할 항목을 업데이트하며, 모든 건너뛴 변경 내용을 변경 내용 일괄 처리의 정보에서 제외합니다.
또한, 대상 공급자는 SaveItemChange 또는 SaveChangeWithChangeUnits(관리 코드의 경우) 메서드나 ISynchronousNotifyingChangeApplierTarget::SaveChange 또는 ISynchronousNotifyingChangeApplierTarget::SaveChangeWithChangeUnits(비관리 코드의 경우) 메서드를 다음과 같이 변경해야 합니다.
삭제할 항목에 대한 메타데이터를 만들거나 업데이트하여 CreateGhost 및 UpdateGhost(관리 코드의 경우) 동작이나 SSA_CREATE_GHOST 또는 SSA_UPDATE_GHOST(비관리 코드의 경우) 동작을 처리합니다. 해당되는 경우 필터 변경 내용 메타데이터도 업데이트해야 합니다.
항목이나 변경 단위에 대한 데이터를 제거하고 변경 내용을 반영하도록 항목이나 변경 단위에 대한 메타데이터를 업데이트하여 MarkItemAsGhost(관리 코드의 경우) 동작 또는 SSA_GHOST_ITEM(비관리 코드의 경우) 동작을 처리합니다.
항목이나 변경 단위에 대한 데이터를 검색하고, 대상 복제본에 데이터를 저장하고, 변경 내용을 반영하도록 메타데이터를 업데이트하여 UnmarkItemAsGhost(관리 코드의 경우) 또는 SSA_UNGHOST_ITEM(비관리 코드의 경우) 동작을 처리합니다.
삭제할 항목의 메타데이터를 삭제된 것으로 표시하여 DeleteGhostAndStoreTombstone(관리 코드의 경우) 동작 또는 SSA_DELETE_GHOST_AND_STORE_TOMBSTONE(비관리 코드의 경우) 동작을 처리합니다.
삭제할 항목 정리
필터링된 복제본에서 저장 공간을 확보하기 위해 삭제할 항목을 제거할 수 있습니다. 삭제할 항목을 제거할 때 삭제할 항목의 이동 버전을 필터 잊어버린 정보의 ForgetTo(관리 코드의 경우) 또는 IForgottenKnowledge::ForgetToVersion(비관리 코드의 경우) 메서드로 전달하여 필터의 필터 잊어버린 정보를 업데이트해야 합니다.
필터 협상
대상 공급자는 변경 내용을 열거하는 동안 원본 공급자에서 사용되는 필터를 지정할 수 있습니다. 원본 공급자는 대상 공급자가 요청하는 필터를 허용하거나 거부할 수 있습니다. 대상 공급자는 원본 공급자가 허용하는 필터를 찾을 때까지 계속 필터를 요청할 수 있습니다. 이 협상은 Sync Framework에서 조정됩니다. 필터는 공급자에 가장 적합한 어떤 형식이든 될 수 있습니다.
필터 협상에 참여하려면 원본 공급자에서 ISupportFilteredSync(관리 코드의 경우) 또는 ISupportFilteredSync(비관리 코드의 경우)를 구현하고 대상 공급자에서 IRequestFilteredSync(관리 코드의 경우) 또는 IRequestFilteredSync(비관리 코드의 경우)를 구현해야 합니다.
다음 단계를 통해 필터를 협상합니다.
원본 공급자가 변경 내용 열거를 시작하기 전과 BeginSession(관리 코드의 경우) 또는 IKnowledgeSyncProvider::BeginSession(비관리 코드의 경우)을 호출한 후에 Sync Framework에서는 대상 공급자에 대해 SpecifyFilter 메서드(관리 코드의 경우) 또는 IRequestFilteredSync::SpecifyFilter(비관리 코드의 경우)를 호출하여 필터 협상을 시작합니다.
SpecifyFilter 처리 중에 대상 공급자는 Sync Framework에 지정된 FilterRequestCallback 대리자(관리 코드의 경우) 또는 IFilterRequestCallback::RequestFilter 메서드(비관리 코드의 경우)로 필터를 전달합니다. 대상 공급자는 요청된 필터를 추적하지 않을 경우 필터링 유형을 CurrentItemsOnly(관리 코드의 경우) 또는 FT_CURRENT_ITEMS_ONLY(비관리 코드의 경우)로 지정하고, 요청된 필터를 추적할 경우에는 필터링 유형을 CurrentItemsAndVersionsForMovedOutItems(관리 코드의 경우) 또는 FT_CURRENT_ITEMS_AND_VERSIONS_FOR_MOVED_OUT_ITEMS(비관리 코드의 경우)로 지정합니다.
FilterRequestCallback(관리 코드의 경우) 또는 RequestFilter(비관리 코드의 경우)를 처리하는 동안 Sync Framework에서는 원본 공급자의 TryAddFilter(관리 코드의 경우) 또는 ISupportFilteredSync::AddFilter(비관리 코드의 경우) 메서드를 호출합니다. 원본 공급자에 지원되지 않는 필터를 요청한 경우 대상 공급자는 지원되는 필터를 찾을 때까지 계속 필터를 요청할 수 있습니다.
대상 공급자가 원본 공급자에서 허용되는 필터를 찾을 수 없는 경우 SyncInvalidOperationException을 발생시키거나(관리 코드의 경우), SYNC_E_FILTER_NOT_SUPPORTED와 같은 오류 코드를 반환하여(비관리 코드의 경우) 동기화를 종료할 수 있습니다.
필터가 협상되면 원본 공급자에서 이 필터를 사용하여 변경 내용 열거 작업에 포함할 항목을 지정합니다.
필터를 협상하는 방법에 대한 자세한 내용은 방법: 필터 협상을 참조하십시오.
참고 항목
개념
표준 사용자 지정 공급자 구현
동기화 응용 프로그램 구현
방법: 열거된 항목 필터링
방법: 열거된 변경 단위 필터링
방법: 필터 협상
방법: 필터 추적 및 필터링된 변경 내용 열거
방법: 복제본 필터링