[java] Java에서 Avro 스키마 직접 작성 vs 코드 생성 사용 방법

Avro는 데이터 직렬화 및 RPC 프레임워크로 널리 사용되는 Apache 프로젝트입니다. Avro를 사용하여 데이터를 직렬화하려면 먼저 스키마를 작성해야 합니다. Java에서 Avro 스키마를 작성하는 방법에는 직접 작성하는 방법과 코드를 생성하여 작성하는 방법이 있습니다. 이번 블로그에서는 이 두 가지 방법을 비교하고 언제 어떤 방법을 사용해야 하는지 알아보겠습니다.

직접 스키마 작성

Avro 스키마는 JSON 형태로 작성됩니다. 직접 스키마를 작성하려면 다음과 같은 단계를 따르면 됩니다.

  1. 적절한 텍스트 에디터를 엽니다.
  2. 스키마의 필드와 각 필드의 데이터 타입을 정의합니다.
    • 예를 들면, 아래와 같은 형태로 작성할 수 있습니다.
     {
       "type": "record",
       "name": "User",
       "fields": [
         {"name": "id", "type": "int"},
         {"name": "name", "type": "string"},
         {"name": "email", "type": "string"}
       ]
     }
    
  3. 스키마를 파일로 저장합니다(예: user.avsc).

직접 스키마를 작성하는 방법은 간단하고 직관적이지만, 스키마가 복잡해지면 작성하기 힘들어질 수 있습니다.

코드 생성 사용

Avro는 스키마를 기반으로 코드를 생성하는 기능을 제공합니다. 이를 사용하면 스키마를 작성하는 대신 코드를 통해 스키마를 생성할 수 있습니다.

  1. 먼저 Avro 컴파일러를 프로젝트에 추가해야 합니다. 일반적으로 Maven이나 Gradle을 사용하여 의존성에 추가합니다.
  2. 코드 생성을 위한 Avro 스키마 파일을 작성합니다. 위에서 언급한 직접 작성 방법과 동일한 형식으로 작성합니다.
  3. 스키마 파일을 .avsc로 저장합니다(예: user.avsc).
  4. 컴파일 명령을 실행하여 코드를 생성합니다. Maven을 사용한다면 다음과 같이 작성된 플러그인을 추가하고 빌드 명령어를 실행하면 됩니다.
<plugin>
  <groupId>org.apache.avro</groupId>
  <artifactId>avro-maven-plugin</artifactId>
  <version>1.10.2</version>
  <executions>
    <execution>
      <phase>generate-sources</phase>
      <goals>
        <goal>schema</goal>
        <goal>idl-protocol</goal>
      </goals>
      <configuration>
        <sourceDirectory>${project.basedir}</sourceDirectory>
        <outputDirectory>${project.build.directory}/generated-sources</outputDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>

코드 생성을 사용하면 스키마를 직접 작성하는 번거로움을 피할 수 있으며, 자동으로 데이터를 직렬화 및 역직렬화하는 Java 클래스를 생성할 수 있습니다.

스키마 작성 방법 선택

스키마 작성 방법을 선택할 때는 프로젝트의 요구 사항과 복잡성을 고려해야 합니다. 스키마가 단순하고 작성해야 할 필드가 적다면 직접 작성하는 것이 편리할 수 있습니다. 하지만 스키마가 복잡하고 필드가 많다면 코드 생성을 사용하는 것이 더 효율적일 수 있습니다. 코드 생성은 스키마 간의 종속성을 관리하고, 컴파일 시간에 오류를 확인할 수 있는 장점이 있습니다.

참고 자료