[java] Java와 Apache Avro를 이용한 데이터 직렬화

Avro Logo

Apache Avro는 데이터 직렬화 및 원격 프로시저 호출(RPC) 프레임워크로서, 이용자가 정의한 데이터 스키마를 사용하여 데이터를 직렬화하고 역직렬화할 수 있도록 도와줍니다. 특히, Java에서 Apache Avro를 사용하면 손쉽게 복잡한 데이터 구조를 다룰 수 있습니다.

Avro 설치

Apache Avro를 Java에서 사용하기 위해서는 먼저 라이브러리를 추가해야 합니다. Maven을 사용한다면 pom.xml 파일에 다음 종속성을 추가해주세요:

<dependencies>
  <dependency>
    <groupId>org.apache.avro</groupId>
    <artifactId>avro</artifactId>
    <version>1.10.2</version>
  </dependency>
</dependencies>

Gradle을 사용한다면 build.gradle 파일에 다음 의존성을 추가해주세요:

dependencies {
    implementation 'org.apache.avro:avro:1.10.2'
}

이후 빌드 도구를 사용하여 종속성을 해결하면 Apache Avro를 사용할 수 있습니다.

데이터 스키마 정의

Apache Avro를 사용하여 데이터를 직렬화하기 위해서는 먼저 데이터 스키마를 정의해야 합니다. 아래는 예제로 사용될 User 클래스의 데이터 스키마입니다:

{
  "type": "record",
  "name": "User",
  "fields": [
    {"name": "name", "type": "string"},
    {"name": "age", "type": "int"},
    {"name": "email", "type": "string"}
  ]
}

위 스키마는 문자열 타입의 name, 정수 타입의 age, 그리고 문자열 타입의 email을 갖는 User 레코드를 정의합니다.

데이터 직렬화 및 역직렬화

Apache Avro를 이용하여 데이터를 직렬화하고 역직렬화하는 방법은 다음과 같습니다:

import org.apache.avro.Schema;
import org.apache.avro.generic.GenericData;
import org.apache.avro.generic.GenericRecord;
import org.apache.avro.io.DatumReader;
import org.apache.avro.io.DatumWriter;
import org.apache.avro.io.Encoder;
import org.apache.avro.io.EncoderFactory;
import org.apache.avro.io.Decoder;
import org.apache.avro.io.DecoderFactory;

Schema schema = new Schema.Parser().parse("user.avsc");

GenericRecord userRecord = new GenericData.Record(schema);
userRecord.put("name", "John Doe");
userRecord.put("age", 30);
userRecord.put("email", "johndoe@example.com");

DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<>(schema);
Encoder encoder = EncoderFactory.get().binaryEncoder(System.out, null);

datumWriter.write(userRecord, encoder);
encoder.flush();

byte[] serializedData = outputStream.toByteArray();

DatumReader<GenericRecord> datumReader = new GenericDatumReader<>(schema);
Decoder decoder = DecoderFactory.get().binaryDecoder(serializedData, null);

GenericRecord deserializedUser = datumReader.read(null, decoder);

System.out.println(deserializedUser.get("name"));
System.out.println(deserializedUser.get("age"));
System.out.println(deserializedUser.get("email"));

위 예제 코드는 user.avsc 파일에서 데이터 스키마를 파싱하고, GenericRecord를 생성하여 필드 값을 설정합니다. 그 후, 데이터를 직렬화하고 역직렬화하여 필드 값을 읽어옵니다.

결론

Apache Avro를 이용하여 Java에서 데이터 직렬화를 수행하는 방법을 살펴보았습니다. Avro를 사용하면 데이터를 구조화하고 손쉽게 직렬화 및 역직렬화할 수 있습니다. 또한, 데이터 스키마를 이용하면 응용 프로그램 간에 데이터를 안정적으로 교환할 수 있도록 도와줍니다.

더 많은 자세한 내용은 Apache Avro 공식 문서를 참조해주세요.