[java] SnakeYAML을 사용하여 YAML 파일 병합하기

이번 포스트에서는 Java에서 SnakeYAML 라이브러리를 사용하여 YAML 파일을 병합하는 방법에 대해 알아보겠습니다. YAML 파일은 사용자가 읽고 쓰기 쉬운 형식으로 데이터를 저장하는 데 사용되며, 복잡한 구조를 가질 수 있습니다. 때로는 여러 YAML 파일을 병합하여 단일 파일로 합치는 작업이 필요할 수 있습니다. 여기서는 SnakeYAML을 사용하여 이런 작업을 수행하는 방법을 알아보겠습니다.

SnakeYAML이란?

SnakeYAML은 YAML 데이터를 Java 객체로 변환하고, Java 객체를 YAML로 시리얼라이즈할 수 있는 Java 라이브러리입니다. 이 라이브러리는 YAML 1.1 명세를 준수하며, 빠르고 유연한 기능을 제공합니다.

SnakeYAML 설치

먼저 Maven을 사용하는 경우, pom.xml 파일에 다음 의존성을 추가합니다:

<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
    <version>1.27</version>
</dependency>

Gradle을 사용할 경우, build.gradle 파일에 다음 의존성을 추가합니다:

implementation 'org.yaml:snakeyaml:1.27'

의존성을 추가한 후, 프로젝트를 빌드하면 SnakeYAML 라이브러리가 프로젝트에 추가됩니다.

YAML 파일 병합하기

이제 SnakeYAML을 사용하여 YAML 파일을 병합해보겠습니다. 아래는 두 개의 YAML 파일을 병합하는 예제입니다.

import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.nodes.Tag;
import org.yaml.snakeyaml.representer.Representer;

import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.LinkedHashMap;
import java.util.Map;

public class YamlMergeExample {

    public static void main(String[] args) {
        // 병합할 YAML 파일 경로
        String filePath1 = "path/to/file1.yaml";
        String filePath2 = "path/to/file2.yaml";

        // YAML 파일을 읽어와 Map 객체로 변환
        Map<String, Object> yaml1 = readYamlFile(filePath1);
        Map<String, Object> yaml2 = readYamlFile(filePath2);

        // YAML 파일 병합
        Map<String, Object> mergedYaml = mergeYamlFiles(yaml1, yaml2);

        // 병합 결과를 새로운 YAML 파일로 저장
        String mergedFilePath = "merged.yaml";
        saveYamlFile(mergedFilePath, mergedYaml);

        System.out.println("YAML 파일 병합이 완료되었습니다.");
    }

    private static Map<String, Object> readYamlFile(String filePath) {
        try {
            byte[] bytes = Files.readAllBytes(Paths.get(filePath));
            Yaml yaml = new Yaml();
            return yaml.load(bytes);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    private static Map<String, Object> mergeYamlFiles(Map<String, Object> yaml1, Map<String, Object> yaml2) {
        Map<String, Object> mergedYaml = new LinkedHashMap<>();
        mergedYaml.putAll(yaml1);
        mergedYaml.putAll(yaml2);
        return mergedYaml;
    }

    private static void saveYamlFile(String filePath, Map<String, Object> yamlData) {
        try {
            Representer representer = new Representer();
            representer.addClassTag(yamlData.getClass(), Tag.MAP);
            DumperOptions options = new DumperOptions();
            options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
            Yaml yaml = new Yaml(representer, options);
            FileWriter writer = new FileWriter(filePath);
            yaml.dump(yamlData, writer);
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

위의 예제에서는 readYamlFile 메서드를 사용하여 YAML 파일을 읽어와 Map 객체로 변환하고, mergeYamlFiles 메서드를 사용하여 두 개의 YAML 파일을 병합합니다. 그리고 saveYamlFile 메서드를 사용하여 병합된 결과를 새로운 YAML 파일로 저장합니다.

병합된 YAML 파일은 merged.yaml로 저장되며, 필요에 따라 경로와 파일명을 수정할 수 있습니다.

결론

Java에서 YAML 파일을 병합하는 작업은 때로는 필수일 수 있습니다. SnakeYAML을 사용하면 간단하게 YAML 파일을 읽고 병합할 수 있습니다. 이 포스트에서는 SnakeYAML을 사용하여 YAML 파일을 병합하는 방법을 예제로 살펴보았습니다.