Skip to content

Latest commit

 

History

History
521 lines (403 loc) · 18.9 KB

File metadata and controls

521 lines (403 loc) · 18.9 KB
categories
Document Comparison
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
GroupDocs.Comparison
metadata-preservation
dotnet-tutorial
document-management
title GroupDocs.Comparison을 사용한 대상 메타데이터 보존 – .NET 튜토리얼
type docs
url /ko/net/advanced-comparison/groupdocs-comparison-net-metadata-target/
weight 1

Preserve Target Metadata with GroupDocs.Comparison – .NET Tutorial

Introduction

두 문서를 비교하면서 중요한 메타데이터가 사라진 적이 있나요? 당신만 그런 것이 아닙니다. .NET 애플리케이션에서 대상 메타데이터를 보존해야 할 때 작업이 까다롭게 느껴질 수 있지만, 반드시 그렇게 할 필요는 없습니다.

GroupDocs.Comparison for .NET을 사용하면 비교 결과에 어느 문서의 메타데이터를 남길지 선택할 수 있습니다. 문서 관리 시스템을 구축하든, 법률 계약을 다루든, 협업 콘텐츠를 관리하든, 언제나 올바른 소스 문서의 메타데이터를 원하게 될 것입니다.

이 튜토리얼에서는 비교 중 대상 메타데이터를 보존하는 방법을 배우고, 흔히 발생하는 함정을 피하며, 실제 시나리오에 적용하는 방법을 살펴봅니다.

Quick Answers

  • “preserve target metadata”가 의미하는 것은? 비교 결과를 생성할 때 대상(document)으로 지정한 문서의 메타데이터(작성자, 생성 날짜, 사용자 정의 속성 등)를 유지한다는 뜻입니다.
  • 필요한 GroupDocs.Comparison 버전은? 버전 25.4.0 이상.
  • .NET Core와도 사용 가능한가요? 예 – .NET Core 2.0+ 또는 .NET Framework 4.6.1+.
  • 프로덕션에 라이선스가 필요한가요? 프로덕션에서는 상용 라이선스가 필요합니다; 학습용으로는 무료 체험판을 사용할 수 있습니다.
  • PDF와 DOCX에서도 동작하나요? 예 – 주요 Office 및 PDF 형식 모두 메타데이터 보존을 지원합니다.

Why Metadata Preservation Matters

코드에 들어가기 전에, 왜 대상 메타데이터를 보존해야 하는지 이야기해 보겠습니다. 문서 메타데이터는 단순히 “있으면 좋은” 것이 아니라, 법적 요구사항이거나 비즈니스에 필수적인 경우가 많습니다:

  • 법률 문서 – 변호사‑고객 특권 표시를 유지해야 합니다.
  • 기업 파일 – 컴플라이언스 태그와 승인 체인을 보존해야 합니다.
  • 학술 논문 – 저자 표기와 수정 이력이 필수적입니다.
  • 기술 문서 – 버전 관리와 검토 상태가 중요합니다.

적절히 처리하지 않으면 수개월 동안 구축한 정보를 실수로 삭제할 수 있습니다. 바로 여기서 대상 메타데이터 보존 옵션이 빛을 발합니다.

Prerequisites

Required Libraries and Versions

  • GroupDocs.Comparison for .NET: 버전 25.4.0 이상 (이전 버전은 메타데이터 옵션이 제한적).
  • .NET Framework: 4.6.1 이상, 또는 .NET Core 2.0+.

Environment Setup

  • Visual Studio (또는 선호하는 C# IDE).
  • 기본 C# 지식 (너무 고급일 필요는 없습니다).
  • 테스트용 샘플 문서 두 개 (Word .docx 권장).

Knowledge Prerequisites

GroupDocs 전문가일 필요는 없지만, 다음에 익숙해야 합니다:

  • C# using 구문 및 파일 처리.
  • 기본 문서 처리 개념.
  • 메타데이터가 무엇인지(작성자, 제목, 사용자 정의 속성 등).

준비되셨나요? 설정을 시작해 보겠습니다.

Setting Up GroupDocs.Comparison for .NET

GroupDocs.Comparison 설치는 간단하지만, 몇 가지 주의할 점이 있습니다.

Installation Options

NuGet Package Manager Console (가장 쉬운 방법):

Install-Package GroupDocs.Comparison -Version 25.4.0

.NET CLI (명령줄을 선호한다면):

dotnet add package GroupDocs.Comparison --version 25.4.0

Pro tip: 예상치 못한 브레이킹 체인을 방지하려면 항상 버전을 명시하세요.

License Acquisition

많은 개발자가 처음에 여기서 막히곤 합니다. GroupDocs.Comparison은 무료가 아니지만 선택지는 있습니다:

  • Free Trial – 30 일 동안 전체 기능 제공, 평가에 최적.
  • Temporary License – 더 긴 평가 기간이 필요할 때.
  • Commercial License – 프로덕션 사용(다양한 가격 옵션 제공).

지금은 학습 단계이므로 라이선스에 신경 쓰지 않아도 됩니다. 체험판에도 preserve target metadata 기능이 모두 포함되어 있습니다.

Basic Setup Verification

간단한 테스트로 모든 것이 정상 동작하는지 확인해 보세요:

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 구문을 다시 확인하세요.

How to Preserve Target Metadata

이제 본격적으로 문서 비교 중 메타데이터를 보존하는 방법을 살펴보겠습니다. 바로 GroupDocs.Comparison의 핵심 기능입니다.

Understanding the Metadata Flow

일반적인 비교 흐름:

  1. Source document가 기본 콘텐츠를 제공합니다.
  2. Target document가 비교 대상 변경 사항을 제공합니다.
  3. Output document는 두 문서를 결합하지만, 메타데이터는 어느 쪽이 승리할까요?

기본 설정에서는 Source 문서의 메타데이터가 사용됩니다. 대상 메타데이터를 보존하려면 API에 명시적으로 알려줘야 합니다.

Step‑by‑Step Implementation

Step 1: Initialize Your Comparer Object

비교 기준이 되는 “baseline” 문서를 설정합니다:

using (Comparer comparer = new Comparer(sourceFilePath))
{
    // All comparison operations happen within this scope
}

using 구문을 사용하는 이유는 리소스를 자동으로 해제해 메모리 누수를 방지하기 위함입니다. 50 MB 규모의 Word 파일을 다룰 때 큰 도움이 됩니다.

Step 2: Add the Target Document

변경 사항이 들어 있는 문서를 지정합니다:

comparer.Add(targetFilePath);

흔한 실수: source와 target을 혼동하는 것. source는 “원본”, target은 “업데이트된 버전”이라고 생각하면 됩니다.

Step 3: Set the Metadata Type (The Magic Happens Here)

출력 문서에 어떤 메타데이터를 남길지 지정합니다:

comparer.Compare(outputFileName, new SaveOptions() { CloneMetadataType = MetadataType.Target });

무슨 일인가요? CloneMetadataType = MetadataType.Target은 GroupDocs.Comparison에 “결과 문서에 대상 문서의 메타데이터를 유지해 주세요”라고 알려주는 역할을 합니다.

Complete Working Example

전체 코드를 한 번에 실행할 수 있는 예제입니다:

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}");
        }
    }
}

Common Pitfalls to Avoid

파일 경로 문제 – 절대 경로나 작업 디렉터리를 확실히 지정하세요:

// 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 이상을 사용하세요.

Advanced Metadata Scenarios

When to Use Target vs. Source Metadata

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

Handling Multiple Target Documents

여러 대상 문서를 비교하면서도 첫 번째로 추가한 대상의 메타데이터를 유지할 수 있습니다:

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 
    });
}

Practical Applications and Use Cases

Legal Document Management

법률 사무소에서는 계약 버전을 비교하면서 특정 메타데이터 표시를 유지해야 합니다:

// 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
    });
}

Academic and Research Collaboration

여러 연구자가 협업할 때 최신 저자 정보를 보존하고 싶을 때:

// 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
    });
}

Corporate Compliance Workflows

규제 산업에서는 컴플라이언스 메타데이터 유지가 핵심입니다:

// 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
    });
}

Troubleshooting Common Issues

“File Not Found” Errors

가장 흔한 문제입니다. 명시적인 경로 확인 코드를 사용해 디버그하세요:

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;
}

Memory Issues with Large Documents

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();
}

Permission and Access Issues

보호된 파일이나 네트워크 공유를 다룰 때는 다음을 참고하세요:

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}");
}

Performance Considerations and Best Practices

Memory Management

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!

배치 처리 – 많은 파일을 비교할 경우, 메모리 사용량을 낮추기 위해 작은 그룹으로 나누어 처리합니다.

Async Operations for Better Responsiveness

데스크톱이나 웹 앱에서는 비교 작업을 비동기로 감싸는 것이 좋습니다:

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;
        }
    });
}

File Size Guidelines

  • Small (< 1 MB) – 바로 처리.
  • Medium (1‑10 MB) – UI 응답성을 위해 진행 상황 표시.
  • Large (> 10 MB) – 반드시 비동기 처리와 위에서 보여준 명시적 GC를 사용하세요.

Integration with Larger Systems

ASP.NET Core Integration

아래는 두 파일을 업로드받아 비교하고 대상 메타데이터를 보존한 결과를 반환하는 컨트롤러 예시입니다:

[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);
        }
    }
}

Frequently Asked Questions

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 지원팀에 문의할 수 있습니다.

Additional Resources


Last Updated: 2026-03-06
Tested With: GroupDocs.Comparison 25.4.0 for .NET
Author: GroupDocs