삭제 표식 관리
삭제 표식은 복제본에서 삭제된 항목을 나타냅니다. 삭제 표식은 삭제된 항목이 복제본에 다시 추가되지 않게 하는 데 주로 사용됩니다. 성능이나 저장 용량과 관련된 문제를 방지하려면 삭제 표식을 주기적으로 정리해야 합니다. 삭제된 항목이 다시 추가되지 않도록 이러한 정리를 주의하여 관리해야 합니다.
삭제 표식 나타내기
복제본은 모든 방법을 사용하여 삭제된 항목을 추적할 수 있습니다. 이 작업을 수행하려면 복제본에서 삭제 표식 비트나 삭제 표식 로그를 사용하는 것이 좋습니다.
삭제 표식 비트
복제본은 항목이 항목 저장소에서 삭제되었는지 여부를 나타내는 부울 값이 항목의 메타데이터에 포함되도록 정의합니다. 항목이 삭제되면 해당 항목의 메타데이터 항목에서 이 값이 true로 설정됩니다. 삭제 표식 비트에는 항목당 1비트만 추가로 필요하므로 추적해야 하는 삭제된 항목이 많은 경우 이 비트를 사용하면 저장 용량이 적게 필요하여 효율적입니다. 하지만 이 방법을 사용하면 전체 메타데이터 저장소를 검색해야 하므로 삭제 표식을 효율적으로 열거하거나 정리할 수 없습니다.
삭제 표식 로그
복제본은 항목 저장소에서 삭제된 항목을 나열하는 별도의 로그를 유지 관리합니다. 항목이 삭제되면 삭제 표식 로그에 해당 항목이 추가됩니다. 삭제 표식 로그를 사용하면 추적해야 하는 삭제된 항목이 많은 경우 삭제된 각 항목의 ID가 로그에 포함되어야 하므로 저장 용량이 많이 필요하여 효율적이지 않습니다. 하지만 이 방법을 사용하면 목록에 삭제된 항목만 들어 있으므로 삭제 표식을 효율적으로 열거하거나 정리할 수 있습니다.
삭제 표식 정리
동기화 커뮤니티의 각 복제본에는 해당 복제본의 상태에 대한 정보만 들어 있고 다른 복제본의 상태에 대한 정보는 들어있지 않습니다. 따라서 삭제 표식이 커뮤니티 전체에 복제되었는지 확인할 수 없으므로 특정 복제본에서 삭제 표식을 정리할 시점과 방법은 전적으로 로컬에서 결정해야 합니다. 예를 들어 로컬 타임스탬프 또는 공간 요구 사항에 따라 삭제 표식을 정리할 수 있습니다. 복제본에서 삭제 표식이 데이터 집합의 10% 이상을 점유하지 못하게 하는 정책을 설정할 수도 있습니다.
삭제 표식이 정리되면 복제본은 삭제에 대한 정보를 보유하지 않지만 해당 항목이 자신의 저장소나 다른 복제본에 다시 추가되지 않게 해야 합니다. 이러한 문제가 발생하지 않도록 각 항목의 생성 버전과 복제본의 잊어버린 정보가 복제본의 메타데이터 저장소에 유지됩니다. 복제본에서 삭제 표식을 정리하는 경우 복제본의 잊어버린 정보에 삭제 표식 버전이 기록되어야 합니다.
관리 코드를 사용하여 정리된 삭제 표식 기록
삭제된 항목의 메타데이터가 복제본의 메타데이터 저장소에서 제거된 것을 기록하려면 복제본의 ForgottenKnowledge 개체에 대해 ForgetTo를 호출합니다. 이 메서드에는 삭제된 항목의 버전이 필요합니다.
비관리 코드를 사용하여 정리된 삭제 표식 기록
삭제된 항목의 메타데이터가 복제본의 메타데이터 저장소에서 제거된 것을 기록하려면 복제본의 IForgottenKnowledge 개체에 대해 IForgottenKnowledge::ForgetToVersion을 호출합니다. 이 메서드에는 삭제된 항목의 버전이 필요합니다.
Sync Framework에 잊어버린 정보 제공
복제본에서 잊어버린 정보를 사용하여 정리된 삭제 표식을 추적하는 경우 복제본과 연결된 공급자가 잊어버린 정보를 필요로 하는 Sync Framework 메서드(예: 관리 코드의 경우 ChangeBatch 또는 비관리 코드의 경우 IProviderSyncServices::CreateChangeBatch)에 잊어버린 정보를 제공해야 합니다. 공급자는 동기화 중에 StoreKnowledgeForScope 메서드(관리 코드의 경우)나 ISynchronousNotifyingChangeApplierTarget::SaveKnowledge 메서드(비관리 코드의 경우) 등에서 업데이트된 정보와 함께 잊어버린 정보도 저장해야 합니다.
복제본에서 삭제 표식이 정리되지 않고 잊어버린 정보가 유지 관리되지 않는 경우 복제본과 연결된 공급자가 잊어버린 정보 매개 변수가 있는 Sync Framework 메서드에 null(관리 코드의 경우) 또는 NULL(비관리 코드의 경우)을 전달해야 합니다.
삭제 표식 관련 시나리오
삭제 표식과 관련하여 고려할 두 가지 시나리오는 동기화를 요청하는 오래된 복제본과 삭제된 항목에 대한 업데이트를 전송하는 복제본입니다. Sync Framework에서는 이러한 복제본을 모두 검색합니다.
오래된 복제본 검색
이 시나리오에서는 대상 복제본이 원본 복제본과 비교할 때 오래되었습니다. 원본 복제본에서는 삭제 표식이 정리되었으므로 삭제를 수행해야 하지만 원본 복제본에 삭제 관련 정보가 없습니다. 따라서 원본 공급자는 이러한 삭제를 나타내는 변경 내용을 대상 공급자에 전송할 수 없습니다. 변경 내용이 적용되기 전에 Sync Framework에서는 원본 복제본의 잊어버린 정보와 대상 복제본의 현재 정보를 비교합니다. 대상 정보에 잊어버린 정보가 포함되지 않은 경우 Sync Framework에서는 대상 복제본을 오래된 것으로 확인하고 복구 동기화를 시작합니다.
응용 프로그램에서 이벤트 처리기를 등록한 경우 Sync Framework를 통해 전체 열거를 계속하거나 중지할 수 있습니다. 관리 코드의 경우 FullEnumerationNeeded 이벤트가 발생합니다. 비관리 코드의 경우에는 응용 프로그램에서 ISyncCallback::OnFullEnumerationNeeded 콜백을 수신합니다.
응용 프로그램에서 이벤트 처리기를 등록하지 않은 경우 전체 열거가 자동으로 수행됩니다. 전체 열거를 수행하면 Sync Framework에서 원본 공급자의 변경 내용을 대상 복제본의 항목과 비교하고 대상 복제본에서 삭제해야 하는 항목을 확인할 수 있습니다. 원본 공급자의 변경 내용에 해당하지 않는 대상 복제본의 항목은 대상 복제본에서 모두 삭제됩니다.
삭제된 항목에 대한 업데이트 검색
이 시나리오에서는 원본 복제본이 대상 복제본과 비교할 때 오래되었습니다. 이러한 현상은 대상 복제본에서 삭제 표식이 마지막으로 정리된 이후 원본 복제본이 동기화되지 않은 경우에 나타납니다. 대상 복제본에서 항목이 삭제되고 이후에 대상 복제본에서 삭제 표식이 정리된 후 동일한 항목이 원본 복제본에서 업데이트된 경우 문제가 발생할 수 있습니다. 원본 공급자가 대상 공급자에 보내는 일괄 변경 내용에 해당 항목이 나타납니다. 대상 공급자는 해당 항목이 새 항목이 아님을 인식해야 합니다. 그렇지 않으면 항목이 의도와 다르게 대상 복제본에 다시 추가됩니다.
원본 복제본에 있는 항목의 현재 버전은 대상 복제본의 현재 정보와 비교해도 의미가 없습니다. 이는 다시 추가될 항목의 현재 버전이 대상 복제본의 현재 정보에 들어 있지 않기 때문입니다. 대신 원본 복제본에 있는 항목의 생성 버전을 대상 복제본의 현재 정보와 비교하여 대상 복제본에 이미 알려진 항목인지 확인해야 합니다. 항목이 삭제된 시점은 항목 생성보다 이후이며 대상 복제본의 현재 정보에는 삭제가 들어 있으므로 현재 정보에는 생성도 들어 있어야 합니다.
따라서 대상 복제본에 새 항목이 추가되기 전에 Sync Framework에서는 항목의 생성 버전을 대상 복제본의 현재 정보와 비교합니다. 대상 정보에 해당 항목의 생성 버전이 들어 있으면 해당 항목이 이미 알려졌지만 삭제된 후 잊혀진 것입니다. 이러한 항목은 업데이트-삭제 충돌로 취급됩니다.
참고 항목
참조
ISyncCallback::OnFullEnumerationNeeded
FullEnumerationNeeded