Skip to content

Latest commit

 

History

History
632 lines (472 loc) · 25 KB

File metadata and controls

632 lines (472 loc) · 25 KB
categories
Java Development
date 2025-12-20
description Java에서 디렉터리 비교를 위해 GroupDocs Comparison Java를 사용하는 방법을 배우세요. 파일 감사, 버전 관리 자동화 및 성능 최적화를 마스터하세요.
keywords java directory comparison tool, groupdocs comparison tutorial, java file audit automation, directory sync java, how to compare folders in java programming
lastmod 2025-12-20
linktitle Java Directory Comparison Guide
tags
directory-comparison
file-audits
groupdocs
java-tutorial
title GroupDocs 비교 Java - Java 디렉터리 비교 도구 - 완전 가이드
type docs
url /ko/java/advanced-comparison/master-directory-comparison-java-groupdocs-comparison/
weight 1

Java 디렉터리 비교 도구 - GroupDocs.Comparison을 활용한 완전 가이드

소개

두 프로젝트 버전 사이에서 어떤 파일이 변경되었는지 수작업으로 몇 시간을 보내본 적이 있나요? 당신만 그런 것이 아닙니다. 디렉터리 비교는 오후 전체를 잡아먹을 수 있는 지루한 작업 중 하나입니다 — 자동화하지 않으면 말이죠.

GroupDocs.Comparison for Java는 이 고통을 간단한 API 호출 하나로 바꿔줍니다. 방대한 코드베이스의 변경 사항을 추적하든, 환경 간 파일을 동기화하든, 규정 준수 감사를 수행하든, 이 라이브러리는 무거운 작업을 대신 처리해 주어 여러분은 신경 쓸 필요가 없습니다.

이 가이드에서는 실제 시나리오에서 작동하는 자동 디렉터리 비교 설정 방법을 배웁니다. 기본 설정부터 수천 개 파일이 있는 거대한 디렉터리를 위한 성능 최적화까지 모두 다룹니다.

학습 목표:

  • 전체 GroupDocs.Comparison 설정 (주의사항 포함)
  • 단계별 디렉터리 비교 구현
  • 사용자 정의 비교 규칙을 위한 고급 구성
  • 대규모 비교를 위한 성능 최적화
  • 흔히 발생하는 문제 해결 (문제는 반드시 발생합니다)
  • 다양한 산업 분야의 실제 사용 사례

빠른 답변

  • 주요 라이브러리? groupdocs comparison java
  • 지원 Java 버전? Java 8 이상
  • 일반적인 설정 시간? 기본 비교 기준 10–15 분
  • 라이선스 필요 여부? 예 – 체험판 또는 상용 라이선스 필요
  • 출력 포맷? HTML(기본) 또는 PDF

디렉터리 비교가 중요한 이유 (생각보다 더 큰 의미)

코드에 들어가기 전에, 왜 이 작업이 중요한지 이야기해 보겠습니다. 디렉터리 비교는 단순히 다른 파일을 찾는 것이 아니라, 데이터 무결성을 유지하고, 규정 준수를 보장하며, 프로덕션 환경을 망칠 수 있는 교묘한 변화를 잡아내는 일입니다.

필요한 일반적인 시나리오:

  • 릴리즈 관리: 배포 전 스테이징과 프로덕션 디렉터리 비교
  • 데이터 마이그레이션: 시스템 간 파일이 올바르게 전송됐는지 확인
  • 규정 감사: 규제 요구사항에 맞춰 문서 변경 추적
  • 백업 검증: 백업 프로세스가 실제로 작동했는지 확인
  • 팀 협업: 공유 프로젝트 디렉터리에서 누가 무엇을 변경했는지 식별

전제 조건 및 설정 요구 사항

코딩을 시작하기 전에 환경이 준비됐는지 확인하세요. 필요한 항목과 이유는 다음과 같습니다.

필수 요구 사항:

  1. Java 8 이상 – GroupDocs.Comparison은 최신 Java 기능을 사용합니다
  2. Maven 3.6 이상 – 의존성 관리를 위해 (수동 JAR 관리는 절대 금지)
  3. Java 지원이 좋은 IDE – IntelliJ IDEA 또는 Eclipse 권장
  4. 최소 2 GB RAM – 디렉터리 비교는 메모리를 많이 사용할 수 있습니다

지식 전제 조건:

  • 기본 Java 프로그래밍(반복문, 조건문, 예외 처리)
  • 파일 I/O 작업 이해
  • Maven 의존성 관리에 익숙함
  • try‑with‑resources 사용법(예제에서 많이 사용)

선택 사항이지만 도움이 되는 것:

  • 로깅 프레임워크 경험(SLF4J/Logback)
  • 멀티스레딩 개념 이해
  • HTML 기본 지식(출력 포맷을 위해)

GroupDocs.Comparison for Java 설정

이 라이브러리를 프로젝트에 올바르게 통합해 보겠습니다. 설정은 간단하지만 몇 가지 함정이 있습니다.

Maven 구성

pom.xml 파일에 아래 내용을 추가하세요 – 특히 자주 놓치는 저장소 설정을 확인하십시오:

<repositories>
    <repository>
        <id>repository.groupdocs.com</id>
        <name>GroupDocs Repository</name>
        <url>https://releases.groupdocs.com/comparison/java/</url>
    </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>com.groupdocs</groupId>
        <artifactId>groupdocs-comparison</artifactId>
        <version>25.2</version>
    </dependency>
</dependencies>

Pro Tip: GroupDocs 웹사이트에서 최신 버전 번호를 항상 사용하세요. 여기 표시된 버전이 최신이 아닐 수 있습니다.

라이선스 설정 (절대 건너뛰지 마세요)

GroupDocs는 무료가 아니지만 여러 옵션을 제공합니다:

  • 무료 체험: 전체 기능을 제공하는 30일 체험판(평가에 최적)
  • 임시 라이선스: 개발/테스트용 연장 체험판
  • 상용 라이선스: 프로덕션 사용용

라이선스는 아래에서 받으세요:

기본 초기화 및 테스트

의존성을 설정한 뒤, 통합을 테스트해 보세요:

import com.groupdocs.comparison.Comparer;

public class Main {
    public static void main(String[] args) {
        try {
            Comparer comparer = new Comparer();
            System.out.println("GroupDocs.Comparison initialized successfully!");
        } catch (Exception e) {
            System.err.println("Setup issue: " + e.getMessage());
        }
    }
}

오류 없이 실행되면 다음 단계로 진행할 수 있습니다. 오류가 발생하면 Maven 설정과 인터넷 연결(그룹닥스는 온라인으로 라이선스를 검증)을 확인하세요.

핵심 구현: 디렉터리 비교

이제 본격적으로 디렉터리를 비교합니다. 기본 구현부터 고급 기능까지 차례대로 살펴보겠습니다.

기본 디렉터리 비교

대부분의 사용 사례를 커버하는 기본 구현입니다:

단계 1: 경로 설정

String sourceDirectoryPath = "YOUR_DOCUMENT_DIRECTORY/source_directory";
String targetDirectoryPath = "YOUR_DOCUMENT_DIRECTORY/target_directory";
String outputFileName = "YOUR_OUTPUT_DIRECTORY/compare_result.html";

중요: 가능한 절대 경로를 사용하세요, 특히 프로덕션 환경에서는 상대 경로가 실행 위치에 따라 문제를 일으킬 수 있습니다.

단계 2: 비교 옵션 구성

import com.groupdocs.comparison.options.CompareOptions;
import com.groupdocs.comparison.options.enums.FolderComparisonExtension;

CompareOptions compareOptions = new CompareOptions();
compareOptions.setDirectoryCompare(true);
compareOptions.setFolderComparisonExtension(FolderComparisonExtension.HTML);

왜 HTML 출력인가요? HTML 보고서는 사람에게 읽기 쉽고 모든 브라우저에서 열 수 있어 비기술 이해관계자와 결과를 공유하기에 최적입니다.

단계 3: 비교 실행

try (Comparer comparer = new Comparer(sourceDirectoryPath, compareOptions)) {
    comparer.add(targetDirectoryPath, compareOptions);
    comparer.compareDirectory(outputFileName, compareOptions);
    System.out.println("Directory comparison completed. Results saved to: " + outputFileName);
} catch (Exception e) {
    System.err.println("Comparison failed: " + e.getMessage());
    e.printStackTrace();
}

왜 try‑with‑resources인가요? GroupDocs.Comparison은 파일 핸들과 메모리를 내부적으로 관리합니다. try‑with‑resources를 사용하면 특히 대용량 디렉터리 비교 시 적절한 정리가 보장됩니다.

고급 구성 옵션

기본 설정만으로는 부족합니다. 실제 환경에서는 맞춤형 구성이 필요합니다. 아래에서 비교를 세밀하게 조정하는 방법을 소개합니다:

출력 포맷 사용자 정의

CompareOptions compareOptions = new CompareOptions();
compareOptions.setDirectoryCompare(true);

// HTML for human review
compareOptions.setFolderComparisonExtension(FolderComparisonExtension.HTML);

// Or PDF for formal reports
// compareOptions.setFolderComparisonExtension(FolderComparisonExtension.PDF);

파일 및 디렉터리 필터링

필요 없는 항목을 제외하고 싶을 때는 다음과 같이 선택적으로 비교합니다:

CompareOptions compareOptions = new CompareOptions();
compareOptions.setDirectoryCompare(true);

// Skip temporary files and build directories
// Note: Exact filtering syntax may vary - check current API documentation
compareOptions.setShowDeletedContent(false); // Don't highlight deleted files
compareOptions.setShowInsertedContent(true); // Do highlight new files

흔히 발생하는 문제와 해결책

코딩하면서 마주칠 가능성이 높은 문제들을 정리했습니다 (머피의 법칙은 코딩에도 적용됩니다).

문제 1: 대용량 디렉터리에서 OutOfMemoryError

증상: 수천 개 파일을 비교할 때 힙 공간 오류로 애플리케이션이 크래시됩니다.

해결책: JVM 힙 크기를 늘리고 디렉터리를 배치(batch)로 처리하세요:

// JVM args: -Xmx4g -Xms2g

// For very large directories, consider processing subdirectories separately
String[] subdirectories = {"subdir1", "subdir2", "subdir3"};
for (String subdir : subdirectories) {
    String sourceSub = sourceDirectoryPath + "/" + subdir;
    String targetSub = targetDirectoryPath + "/" + subdir;
    // Process each subdirectory individually
}

문제 2: 경로가 올바른데 FileNotFoundException 발생

증상: 경로가 맞는데 파일을 찾을 수 없다는 오류가 뜹니다.

주요 원인 및 해결법:

  • 권한: Java 애플리케이션이 소스 디렉터리 읽기 권한과 출력 위치 쓰기 권한을 가지고 있는지 확인
  • 특수 문자: 공백이나 특수 문자가 포함된 디렉터리 이름은 적절히 이스케이프해야 함
  • 네트워크 경로: UNC 경로는 예상대로 동작하지 않을 수 있으니 파일을 로컬에 복사 후 사용
// Better path handling
Path sourcePath = Paths.get(sourceDirectoryPath).toAbsolutePath();
Path targetPath = Paths.get(targetDirectoryPath).toAbsolutePath();

if (!Files.exists(sourcePath)) {
    throw new IllegalArgumentException("Source directory doesn't exist: " + sourcePath);
}
if (!Files.exists(targetPath)) {
    throw new IllegalArgumentException("Target directory doesn't exist: " + targetPath);
}

문제 3: 비교가 너무 오래 걸림

증상: 비교 작업이 몇 시간씩 진행돼도 끝나지 않습니다.

해결책:

  1. 비교 전에 불필요한 파일을 필터링하세요
  2. 멀티스레딩을 활용해 독립적인 하위 디렉터리를 동시에 처리
  3. 진행 상황 추적을 구현해 현재 진행 중인 작업을 모니터링
// Add progress monitoring
CompareOptions compareOptions = new CompareOptions();
compareOptions.setDirectoryCompare(true);

// Log progress (pseudo-code - actual implementation may vary)
long startTime = System.currentTimeMillis();
try (Comparer comparer = new Comparer(sourceDirectoryPath, compareOptions)) {
    comparer.add(targetDirectoryPath, compareOptions);
    comparer.compareDirectory(outputFileName, compareOptions);
    long duration = System.currentTimeMillis() - startTime;
    System.out.println("Comparison completed in: " + (duration / 1000) + " seconds");
}

대규모 비교를 위한 성능 최적화

수천 개 파일이 있는 디렉터리를 다룰 때는 성능이 핵심입니다. 다음 방법으로 최적화하세요:

메모리 관리 모범 사례

// Increase heap size via JVM arguments
// -Xmx8g (for 8GB max heap)
// -XX:+UseG1GC (for better garbage collection with large heaps)

// In your code, help the GC by nulling large objects
CompareOptions compareOptions = new CompareOptions();
try (Comparer comparer = new Comparer(sourceDirectoryPath, compareOptions)) {
    // ... do comparison
    comparer.compareDirectory(outputFileName, compareOptions);
} // comparer auto‑closed here
compareOptions = null; // Help GC

배치 처리 전략

거대한 디렉터리 구조는 청크 단위로 처리합니다:

public void compareDirectoriesInBatches(String sourceDir, String targetDir, int batchSize) {
    try {
        File[] sourceFiles = new File(sourceDir).listFiles();
        if (sourceFiles != null) {
            for (int i = 0; i < sourceFiles.length; i += batchSize) {
                int end = Math.min(i + batchSize, sourceFiles.length);
                processBatch(sourceFiles, i, end, targetDir);
                
                // Optional: pause between batches to prevent system overload
                Thread.sleep(1000);
            }
        }
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
        throw new RuntimeException("Batch processing interrupted", e);
    }
}

독립 디렉터리의 병렬 처리

여러 디렉터리 쌍을 비교한다면 병렬로 실행하세요:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

ExecutorService executor = Executors.newFixedThreadPool(4);
List<Future<String>> futures = new ArrayList<>();

for (DirectoryPair pair : directoryPairs) {
    Future<String> future = executor.submit(() -> {
        // Perform comparison for this pair
        return compareDirectoryPair(pair.source, pair.target);
    });
    futures.add(future);
}

// Wait for all comparisons to complete
for (Future<String> future : futures) {
    try {
        String result = future.get();
        System.out.println("Comparison result: " + result);
    } catch (Exception e) {
        System.err.println("Comparison failed: " + e.getMessage());
    }
}

executor.shutdown();

실제 사용 사례 및 산업 적용

디렉터리 비교는 개발자 도구를 넘어 비즈니스 핵심 프로세스에 활용됩니다:

소프트웨어 개발 및 DevOps

릴리즈 관리: 배포 전 스테이징과 프로덕션 디렉터리를 비교해 설정 드리프트를 잡아냅니다:

// Automated pre-deployment check
String stagingConfig = "/app/staging/config";
String productionConfig = "/app/production/config";
String reportPath = "/reports/deployment-check-" + LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE) + ".html";

CompareOptions options = new CompareOptions();
options.setDirectoryCompare(true);
options.setFolderComparisonExtension(FolderComparisonExtension.HTML);

try (Comparer comparer = new Comparer(stagingConfig, options)) {
    comparer.add(productionConfig, options);
    comparer.compareDirectory(reportPath, options);
    
    // Integration with deployment pipeline
    if (hasSignificantDifferences(reportPath)) {
        throw new RuntimeException("Deployment blocked: significant configuration differences detected");
    }
}

금융 및 규정 준수

감사 추적 유지: 금융 기관은 규제 준수를 위해 문서 변경을 추적하는 데 디렉터리 비교를 사용합니다:

// Monthly compliance check
String previousMonthDocs = "/compliance/2024-11/documents";
String currentMonthDocs = "/compliance/2024-12/documents";
String auditReport = "/audit/compliance-changes-december-2024.html";

// Compare and generate audit‑ready reports
performComplianceComparison(previousMonthDocs, currentMonthDocs, auditReport);

데이터 관리 및 ETL 프로세스

데이터 무결성 검증: 데이터 마이그레이션이 성공적으로 완료됐는지 확인합니다:

public boolean verifyDataMigration(String sourceDataDir, String migratedDataDir) {
    try {
        CompareOptions options = new CompareOptions();
        options.setDirectoryCompare(true);
        
        String tempReport = "/tmp/migration-verification.html";
        try (Comparer comparer = new Comparer(sourceDataDir, options)) {
            comparer.add(migratedDataDir, options);
            comparer.compareDirectory(tempReport, options);
        }
        
        // Custom logic to parse results and determine if migration was successful
        return analyzeComparisonResults(tempReport);
    } catch (Exception e) {
        System.err.println("Migration verification failed: " + e.getMessage());
        return false;
    }
}

콘텐츠 관리 및 출판

비기술 팀을 위한 버전 관리: 마케팅·콘텐츠 팀이 Git 지식 없이도 문서 저장소 변화를 추적할 수 있습니다:

// Weekly content audit for marketing team
String lastWeekContent = "/content/backup/week-47";
String currentContent = "/content/current";
String marketingReport = "/reports/content-changes-week-48.html";

CompareOptions options = new CompareOptions();
options.setDirectoryCompare(true);
options.setFolderComparisonExtension(FolderComparisonExtension.HTML);

// Generate human‑readable report for non‑technical stakeholders
generateContentChangeReport(lastWeekContent, currentContent, marketingReport, options);

고급 팁 및 모범 사례

프로덕션 환경에서 디렉터리 비교를 운영한 뒤 얻은 교훈을 정리했습니다:

로깅 및 모니터링

포괄적인 로깅을 항상 구현하세요:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

private static final Logger logger = LoggerFactory.getLogger(DirectoryComparer.class);

public void compareWithLogging(String source, String target, String output) {
    logger.info("Starting directory comparison: {} vs {}", source, target);
    long startTime = System.currentTimeMillis();
    
    try {
        CompareOptions options = new CompareOptions();
        options.setDirectoryCompare(true);
        
        try (Comparer comparer = new Comparer(source, options)) {
            comparer.add(target, options);
            comparer.compareDirectory(output, options);
        }
        
        long duration = System.currentTimeMillis() - startTime;
        logger.info("Comparison completed successfully in {}ms. Report: {}", duration, output);
        
    } catch (Exception e) {
        logger.error("Directory comparison failed for {} vs {}: {}", source, target, e.getMessage(), e);
        throw new RuntimeException("Comparison failed", e);
    }
}

오류 복구 및 복원력

일시적인 실패에 대비해 재시도 로직을 구축하세요:

public void compareWithRetry(String source, String target, String output, int maxRetries) {
    int attempts = 0;
    Exception lastException = null;
    
    while (attempts < maxRetries) {
        try {
            performComparison(source, target, output);
            return; // Success!
        } catch (Exception e) {
            lastException = e;
            attempts++;
            
            if (attempts < maxRetries) {
                try {
                    Thread.sleep(1000 * attempts); // Exponential backoff
                } catch (InterruptedException ie) {
                    Thread.currentThread().interrupt();
                    throw new RuntimeException("Retry interrupted", ie);
                }
            }
        }
    }
    
    throw new RuntimeException("Comparison failed after " + maxRetries + " attempts", lastException);
}

설정 관리

코드를 재컴파일하지 않고도 설정을 조정할 수 있도록 외부화하세요:

// application.properties
comparison.output.format=HTML
comparison.max.retries=3
comparison.batch.size=100
comparison.parallel.threads=4

// In your code
@Value("${comparison.output.format:HTML}")
private String outputFormat;

@Value("${comparison.max.retries:3}")
private int maxRetries;

플랫폼 독립적인 경로 처리

// Use platform-independent path handling
Path sourcePath = Paths.get(sourceDirectory);
Path targetPath = Paths.get(targetDirectory);
Path outputPath = Paths.get(outputDirectory);

// Validate permissions before starting
if (!Files.isReadable(sourcePath)) {
    throw new IllegalStateException("Cannot read source directory: " + sourcePath);
}
if (!Files.isReadable(targetPath)) {
    throw new IllegalStateException("Cannot read target directory: " + targetPath);
}
if (!Files.isWritable(outputPath.getParent())) {
    throw new IllegalStateException("Cannot write to output directory: " + outputPath.getParent());
}

타임스탬프 무시 (필요 없는 경우)

CompareOptions options = new CompareOptions();
options.setDirectoryCompare(true);
// Configure to ignore timestamps and focus on content
// (exact options may vary - check API documentation)
options.setIgnoreWhitespaces(true);
options.setIgnoreFormatting(true);

일반적인 배포 문제 해결

개발 환경에서는 정상, 프로덕션에서는 실패

증상: 로컬에서는 정상 작동하지만 서버에서는 크래시.

근본 원인:

  • 대소문자 구분 차이(Windows vs Linux)
  • 더 엄격한 파일 시스템 권한
  • 하드코딩된 경로 구분자(/ vs \)

해결: 플랫폼 독립적인 경로 처리 섹션에서 소개한 PathFile.separator를 사용하세요.

결과가 일관되지 않음

증상: 동일한 비교를 두 번 실행했는데 서로 다른 결과가 나옴.

가능한 이유:

  • 실행 중 파일이 수정됨
  • 타임스탬프가 차이로 간주됨
  • 파일 시스템 메타데이터 차이

해결: CompareOptions에서 타임스탬프를 무시하고 실제 내용만 비교하도록 설정하세요(타임스탬프 무시 섹션 참고).

자주 묻는 질문

Q: 수백만 개 파일이 있는 디렉터리는 어떻게 처리하나요?
A: 배치 처리, JVM 힙 확대(-Xmx), 하위 디렉터리 병렬 비교를 결합합니다. 배치 처리 전략병렬 처리 섹션에 바로 사용할 수 있는 패턴이 제공됩니다.

Q: 서로 다른 서버에 있는 디렉터리를 비교할 수 있나요?
A: 가능합니다. 다만 네트워크 지연이 전체 실행 시간을 좌우합니다. 최적 성능을 위해 원격 디렉터리를 로컬에 복사하거나 충분한 I/O 대역폭을 가진 네트워크 공유를 마운트한 뒤 비교하세요.

Q: GroupDocs.Comparison이 지원하는 파일 형식은 무엇인가요?
A: DOC/DOCX, PDF, PPT/PPTX, XLS/XLSX, TXT, HTML 및 일반 이미지 형식을 포함한 다양한 포맷을 지원합니다. 최신 목록은 공식 문서를 참고하세요.

Q: CI/CD 파이프라인에 이 비교를 어떻게 통합하나요?
A: 비교 로직을 Maven/Gradle 플러그인이나 독립 실행형 JAR로 감싸서 Jenkins, GitHub Actions, Azure Pipelines 등에서 빌드 단계로 호출합니다. 로깅 및 모니터링 예제를 활용해 결과를 빌드 아티팩트로 저장하면 됩니다.

Q: HTML 보고서의 UI를 커스터마이징할 수 있나요?
A: 기본 HTML 템플릿은 고정되어 있지만, 생성된 파일에 CSS·JavaScript를 주입해 브랜드에 맞게 후처리할 수 있습니다.

결론

이제 groupdocs comparison java를 사용해 Java에서 강력한 디렉터리 비교를 구현할 수 있는 완전한 도구 모음이 준비되었습니다. 기본 설정부터 프로덕션 수준 성능 튜닝까지, 다음을 수행하는 방법을 배웠습니다:

  • GroupDocs.Comparison 설치 및 라이선스 적용
  • 간단한 디렉터리 비교 수행
  • 출력 포맷 커스터마이징, 파일 필터링, 대용량 데이터 처리
  • 메모리 사용 최적화 및 병렬 비교 실행
  • DevOps, 금융, 데이터 마이그레이션, 콘텐츠 관리 등 실제 시나리오 적용
  • 로깅, 재시도 로직, 외부 설정 관리 등 유지보수성 강화

성공의 열쇠는 단순하게 시작하고 결과를 검증한 뒤, 실제 필요에 따라 최적화를 단계적으로 적용하는 것입니다. 기본을 마스터하면 자동화된 빌드 파이프라인, 규정 준수 대시보드, 비기술 사용자를 위한 웹 UI 등에 이 기능을 손쉽게 삽입할 수 있습니다.

다음 단계

  • 작은 테스트 폴더에 샘플 코드를 실행해 출력 결과를 확인하세요
  • 더 큰 디렉터리로 확장하고 배치·병렬 처리를 실험해 보세요
  • 비교 단계를 CI/CD 워크플로에 통합하고 각 릴리즈마다 자동 보고서를 생성하도록 설정하세요

도움이 필요하신가요? GroupDocs 커뮤니티는 활발하고 응답이 빠릅니다. 공식 문서, 포럼을 확인하거나 API 관련 질문은 지원팀에 문의하세요.


최종 업데이트: 2025-12-20
테스트 환경: GroupDocs.Comparison 25.2 (Java)
작성자: GroupDocs