| categories |
|
||||
|---|---|---|---|---|---|
| date | 2026-03-06 | ||||
| description | GroupDocs.Comparison for .NET을 사용하여 문서 비교 시 대상 메타데이터를 보존하는 방법을 배우세요. C# 예제가 포함된 단계별 가이드. | ||||
| keywords | preserve target metadata, GroupDocs.Comparison metadata preservation, .NET document comparison, metadata preservation tutorial | ||||
| lastmod | 2026-03-06 | ||||
| linktitle | Metadata Preservation Tutorial | ||||
| tags |
|
||||
| title | GroupDocs.Comparison을 사용한 대상 메타데이터 보존 – .NET 튜토리얼 | ||||
| type | docs | ||||
| url | /ko/net/advanced-comparison/groupdocs-comparison-net-metadata-target/ | ||||
| weight | 1 |
두 문서를 비교하면서 중요한 메타데이터가 사라진 적이 있나요? 당신만 그런 것이 아닙니다. .NET 애플리케이션에서 대상 메타데이터를 보존해야 할 때 작업이 까다롭게 느껴질 수 있지만, 반드시 그렇게 할 필요는 없습니다.
GroupDocs.Comparison for .NET을 사용하면 비교 결과에 어느 문서의 메타데이터를 남길지 선택할 수 있습니다. 문서 관리 시스템을 구축하든, 법률 계약을 다루든, 협업 콘텐츠를 관리하든, 언제나 올바른 소스 문서의 메타데이터를 원하게 될 것입니다.
이 튜토리얼에서는 비교 중 대상 메타데이터를 보존하는 방법을 배우고, 흔히 발생하는 함정을 피하며, 실제 시나리오에 적용하는 방법을 살펴봅니다.
- “preserve target metadata”가 의미하는 것은? 비교 결과를 생성할 때 대상(document)으로 지정한 문서의 메타데이터(작성자, 생성 날짜, 사용자 정의 속성 등)를 유지한다는 뜻입니다.
- 필요한 GroupDocs.Comparison 버전은? 버전 25.4.0 이상.
- .NET Core와도 사용 가능한가요? 예 – .NET Core 2.0+ 또는 .NET Framework 4.6.1+.
- 프로덕션에 라이선스가 필요한가요? 프로덕션에서는 상용 라이선스가 필요합니다; 학습용으로는 무료 체험판을 사용할 수 있습니다.
- PDF와 DOCX에서도 동작하나요? 예 – 주요 Office 및 PDF 형식 모두 메타데이터 보존을 지원합니다.
코드에 들어가기 전에, 왜 대상 메타데이터를 보존해야 하는지 이야기해 보겠습니다. 문서 메타데이터는 단순히 “있으면 좋은” 것이 아니라, 법적 요구사항이거나 비즈니스에 필수적인 경우가 많습니다:
- 법률 문서 – 변호사‑고객 특권 표시를 유지해야 합니다.
- 기업 파일 – 컴플라이언스 태그와 승인 체인을 보존해야 합니다.
- 학술 논문 – 저자 표기와 수정 이력이 필수적입니다.
- 기술 문서 – 버전 관리와 검토 상태가 중요합니다.
적절히 처리하지 않으면 수개월 동안 구축한 정보를 실수로 삭제할 수 있습니다. 바로 여기서 대상 메타데이터 보존 옵션이 빛을 발합니다.
- GroupDocs.Comparison for .NET: 버전 25.4.0 이상 (이전 버전은 메타데이터 옵션이 제한적).
- .NET Framework: 4.6.1 이상, 또는 .NET Core 2.0+.
- Visual Studio (또는 선호하는 C# IDE).
- 기본 C# 지식 (너무 고급일 필요는 없습니다).
- 테스트용 샘플 문서 두 개 (Word .docx 권장).
GroupDocs 전문가일 필요는 없지만, 다음에 익숙해야 합니다:
- C#
using구문 및 파일 처리. - 기본 문서 처리 개념.
- 메타데이터가 무엇인지(작성자, 제목, 사용자 정의 속성 등).
준비되셨나요? 설정을 시작해 보겠습니다.
GroupDocs.Comparison 설치는 간단하지만, 몇 가지 주의할 점이 있습니다.
NuGet Package Manager Console (가장 쉬운 방법):
Install-Package GroupDocs.Comparison -Version 25.4.0.NET CLI (명령줄을 선호한다면):
dotnet add package GroupDocs.Comparison --version 25.4.0Pro tip: 예상치 못한 브레이킹 체인을 방지하려면 항상 버전을 명시하세요.
많은 개발자가 처음에 여기서 막히곤 합니다. GroupDocs.Comparison은 무료가 아니지만 선택지는 있습니다:
- Free Trial – 30 일 동안 전체 기능 제공, 평가에 최적.
- Temporary License – 더 긴 평가 기간이 필요할 때.
- Commercial License – 프로덕션 사용(다양한 가격 옵션 제공).
지금은 학습 단계이므로 라이선스에 신경 쓰지 않아도 됩니다. 체험판에도 preserve target metadata 기능이 모두 포함되어 있습니다.
간단한 테스트로 모든 것이 정상 동작하는지 확인해 보세요:
using System.IO;
using GroupDocs.Comparison;
string sourceFilePath = "source.docx";
string targetFilePath = "target.docx";
// Initialize the Comparer object.
using (Comparer comparer = new Comparer(sourceFilePath))
{
// Add the target document for comparison.
comparer.Add(targetFilePath);
}오류 없이 컴파일되면 준비 완료입니다. 오류가 발생하면 패키지 설치와 using 구문을 다시 확인하세요.
이제 본격적으로 문서 비교 중 메타데이터를 보존하는 방법을 살펴보겠습니다. 바로 GroupDocs.Comparison의 핵심 기능입니다.
일반적인 비교 흐름:
- Source document가 기본 콘텐츠를 제공합니다.
- Target document가 비교 대상 변경 사항을 제공합니다.
- Output document는 두 문서를 결합하지만, 메타데이터는 어느 쪽이 승리할까요?
기본 설정에서는 Source 문서의 메타데이터가 사용됩니다. 대상 메타데이터를 보존하려면 API에 명시적으로 알려줘야 합니다.
비교 기준이 되는 “baseline” 문서를 설정합니다:
using (Comparer comparer = new Comparer(sourceFilePath))
{
// All comparison operations happen within this scope
}using 구문을 사용하는 이유는 리소스를 자동으로 해제해 메모리 누수를 방지하기 위함입니다. 50 MB 규모의 Word 파일을 다룰 때 큰 도움이 됩니다.
변경 사항이 들어 있는 문서를 지정합니다:
comparer.Add(targetFilePath);흔한 실수: source와 target을 혼동하는 것. source는 “원본”, target은 “업데이트된 버전”이라고 생각하면 됩니다.
출력 문서에 어떤 메타데이터를 남길지 지정합니다:
comparer.Compare(outputFileName, new SaveOptions() { CloneMetadataType = MetadataType.Target });무슨 일인가요? CloneMetadataType = MetadataType.Target은 GroupDocs.Comparison에 “결과 문서에 대상 문서의 메타데이터를 유지해 주세요”라고 알려주는 역할을 합니다.
전체 코드를 한 번에 실행할 수 있는 예제입니다:
using System;
using System.IO;
using GroupDocs.Comparison;
using GroupDocs.Comparison.Options;
class Program
{
static void Main(string[] args)
{
try
{
string sourceFile = "original_document.docx";
string targetFile = "updated_document.docx";
string outputFile = "comparison_result.docx";
using (Comparer comparer = new Comparer(sourceFile))
{
comparer.Add(targetFile);
// Preserve target document metadata
comparer.Compare(outputFile, new SaveOptions()
{
CloneMetadataType = MetadataType.Target
});
Console.WriteLine($"Comparison completed! Check {outputFile}");
}
}
catch (Exception ex)
{
Console.WriteLine($"Error during comparison: {ex.Message}");
}
}
}파일 경로 문제 – 절대 경로나 작업 디렉터리를 확실히 지정하세요:
// Good
string sourceFile = Path.Combine(Directory.GetCurrentDirectory(), "docs", "source.docx");
// Risky (might work locally but fail in production)
string sourceFile = "source.docx";메모리 관리 – 큰 문서를 처리할 때는 항상 Comparer 객체를 using 블록으로 감싸세요.
버전 호환성 – 각 GroupDocs.Comparison 릴리스마다 메타데이터 옵션이 다르니, 25.4.0 이상을 사용하세요.
| Scenario | Prefer Target Metadata | Prefer Source Metadata |
|---|---|---|
| Updated author info needed | ✅ | ❌ |
| Original document has legal precedence | ❌ | ✅ |
| Custom properties added only in the newer file | ✅ | ❌ |
| You want to keep the “master” document’s history | ❌ | ✅ |
여러 대상 문서를 비교하면서도 첫 번째로 추가한 대상의 메타데이터를 유지할 수 있습니다:
using (Comparer comparer = new Comparer(sourceFilePath))
{
comparer.Add(targetFilePath1);
comparer.Add(targetFilePath2);
comparer.Add(targetFilePath3);
// Metadata will come from the first target document
comparer.Compare(outputFileName, new SaveOptions()
{
CloneMetadataType = MetadataType.Target
});
}법률 사무소에서는 계약 버전을 비교하면서 특정 메타데이터 표시를 유지해야 합니다:
// Preserve client metadata from updated contract
using (Comparer comparer = new Comparer("original_contract.docx"))
{
comparer.Add("client_revised_contract.docx");
comparer.Compare("final_contract_comparison.docx", new SaveOptions()
{
CloneMetadataType = MetadataType.Target // Keep client's metadata
});
}여러 연구자가 협업할 때 최신 저자 정보를 보존하고 싶을 때:
// Keep metadata from the researcher's latest submission
using (Comparer comparer = new Comparer("draft_paper.docx"))
{
comparer.Add("researcher_updates.docx");
comparer.Compare("paper_comparison.docx", new SaveOptions()
{
CloneMetadataType = MetadataType.Target // Preserve researcher metadata
});
}규제 산업에서는 컴플라이언스 메타데이터 유지가 핵심입니다:
// Preserve compliance tags from updated policy document
using (Comparer comparer = new Comparer("old_policy.docx"))
{
comparer.Add("compliance_approved_policy.docx");
comparer.Compare("policy_comparison.docx", new SaveOptions()
{
CloneMetadataType = MetadataType.Target // Keep compliance metadata
});
}가장 흔한 문제입니다. 명시적인 경로 확인 코드를 사용해 디버그하세요:
string sourceFile = "source.docx";
// Always check if files exist before comparison
if (!File.Exists(sourceFile))
{
Console.WriteLine($"Source file not found: {Path.GetFullPath(sourceFile)}");
return;
}
// Same for target files
if (!File.Exists(targetFile))
{
Console.WriteLine($"Target file not found: {Path.GetFullPath(targetFile)}");
return;
}10 MB 이상 문서에 대해서는 다음 최적화를 고려하세요:
// Use explicit disposal for large documents
using (var comparer = new Comparer(sourceFile))
{
comparer.Add(targetFile);
var saveOptions = new SaveOptions()
{
CloneMetadataType = MetadataType.Target
};
comparer.Compare(outputFile, saveOptions);
// Explicitly clean up
GC.Collect();
GC.WaitForPendingFinalizers();
}보호된 파일이나 네트워크 공유를 다룰 때는 다음을 참고하세요:
try
{
using (var comparer = new Comparer(sourceFile))
{
comparer.Add(targetFile);
comparer.Compare(outputFile, new SaveOptions()
{
CloneMetadataType = MetadataType.Target
});
}
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine("Access denied. Check file permissions.");
Console.WriteLine($"Details: {ex.Message}");
}
catch (IOException ex)
{
Console.WriteLine("File I/O error occurred.");
Console.WriteLine($"Details: {ex.Message}");
}GroupDocs.Comparison은 메모리를 많이 사용합니다. using 구문으로 반드시 해제하도록 하세요:
// Good - automatic resource cleanup
using (var comparer = new Comparer(sourceFile))
{
// comparison logic here
}
// Bad - potential memory leaks
var comparer = new Comparer(sourceFile);
// ... comparison logic
// comparer.Dispose(); // Easy to forget!배치 처리 – 많은 파일을 비교할 경우, 메모리 사용량을 낮추기 위해 작은 그룹으로 나누어 처리합니다.
데스크톱이나 웹 앱에서는 비교 작업을 비동기로 감싸는 것이 좋습니다:
public async Task<bool> CompareDocumentsAsync(string source, string target, string output)
{
return await Task.Run(() =>
{
try
{
using (var comparer = new Comparer(source))
{
comparer.Add(target);
comparer.Compare(output, new SaveOptions()
{
CloneMetadataType = MetadataType.Target
});
return true;
}
}
catch
{
return false;
}
});
}- Small (< 1 MB) – 바로 처리.
- Medium (1‑10 MB) – UI 응답성을 위해 진행 상황 표시.
- Large (> 10 MB) – 반드시 비동기 처리와 위에서 보여준 명시적 GC를 사용하세요.
아래는 두 파일을 업로드받아 비교하고 대상 메타데이터를 보존한 결과를 반환하는 컨트롤러 예시입니다:
[ApiController]
[Route("api/[controller]")]
public class DocumentComparisonController : ControllerBase
{
[HttpPost("compare-with-target-metadata")]
public async Task<IActionResult> CompareWithTargetMetadata(
IFormFile sourceFile,
IFormFile targetFile)
{
var tempSource = Path.GetTempFileName();
var tempTarget = Path.GetTempFileName();
var outputPath = Path.GetTempFileName();
try
{
// Save uploaded files temporarily
await sourceFile.CopyToAsync(new FileStream(tempSource, FileMode.Create));
await targetFile.CopyToAsync(new FileStream(tempTarget, FileMode.Create));
// Perform comparison with target metadata preservation
using (var comparer = new Comparer(tempSource))
{
comparer.Add(tempTarget);
comparer.Compare(outputPath, new SaveOptions()
{
CloneMetadataType = MetadataType.Target
});
}
// Return comparison result
var resultBytes = await System.IO.File.ReadAllBytesAsync(outputPath);
return File(resultBytes, "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"comparison_result.docx");
}
finally
{
// Clean up temporary files
if (System.IO.File.Exists(tempSource)) System.IO.File.Delete(tempSource);
if (System.IO.File.Exists(tempTarget)) System.IO.File.Delete(tempTarget);
if (System.IO.File.Exists(outputPath)) System.IO.File.Delete(outputPath);
}
}
}Q: 여러 대상 문서를 비교할 때 메타데이터를 모두 보존할 수 있나요?
A: 여러 대상 파일을 추가하면 GroupDocs.Comparison은 첫 번째 대상 문서의 메타데이터를 사용합니다. 보존하고 싶은 메타데이터를 가진 문서를 가장 먼저 추가하세요.
Q: 대상 문서에 메타데이터 필드가 일부 없으면 어떻게 되나요?
A: 대상에 존재하는 메타데이터만 복사됩니다. 누락된 필드는 그대로 제외되며, 비교는 정상적으로 진행됩니다.
Q: 비밀번호가 설정된 문서는 어떻게 처리하나요?
A: LoadOptions 객체에 비밀번호를 지정한 뒤 Comparer 생성자에 전달하면 됩니다:
var loadOptions = new LoadOptions() { Password = "your_password" };
using (var comparer = new Comparer(sourceFile, loadOptions))
{
// comparison logic here
}Q: 선택한 메타데이터 속성만 보존할 수 있나요?
A: 현재 API는 선택된 속성이 아니라 전체 메타데이터를 선택된 소스(Target 또는 Source)에서 복사합니다. 개별 속성을 제어하려면 비교 후 속성을 추출해 직접 재적용해야 합니다.
Q: 어떤 문서 형식이 메타데이터 보존을 지원하나요?
A: 대부분의 비즈니스 형식—DOCX, PDF, PPTX, XLSX 등—이 메타데이터 보존을 지원합니다. 전체 목록은 공식 문서를 참고하세요.
Q: 문제가 발생하면 어디서 도움을 받을 수 있나요?
A: 커뮤니티 지원은 GroupDocs Support Forum에서 받을 수 있으며, 상용 라이선스 보유자는 직접 GroupDocs 지원팀에 문의할 수 있습니다.
- Official Documentation: GroupDocs.Comparison for .NET Docs
- API Reference: Complete API Reference
- Download Latest Version: GroupDocs Downloads
- Free Trial: Start Your Trial
- Purchase Options: Licensing and Pricing
Last Updated: 2026-03-06
Tested With: GroupDocs.Comparison 25.4.0 for .NET
Author: GroupDocs