[java] Java와 Apache Avro를 사용한 실시간 데이터 스트리밍

이번 포스트에서는 Java와 Apache Avro를 사용하여 실시간 데이터 스트리밍을 구현하는 방법을 알아보겠습니다.

1. Apache Avro 소개

Apache Avro는 데이터 직렬화 시스템으로서, 다양한 언어와 플랫폼 간 데이터의 교환을 위한 형식을 제공합니다. Avro는 스키마를 사용하여 데이터의 구조를 정의하고 이를 이용하여 데이터를 직렬화하고 역직렬화합니다. Avro 스키마는 JSON 형식으로 정의되며, 스키마의 장점은 데이터의 구조 변화에 유연하게 대처할 수 있다는 점입니다.

2. 데이터 스트리밍 구현 방법

2.1. Maven 의존성 추가

먼저 Maven 프로젝트에 Avro의존성을 추가해야 합니다. pom.xml 파일에 다음과 같이 의존성을 추가합니다.

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

2.2. Avro 스키마 정의

데이터를 직렬화하고 역직렬화하기 위해서는 Avro 스키마를 먼저 정의해야 합니다. 스키마는 JSON 형식의 파일로 작성됩니다. 아래는 예시로 사용할 Person 데이터의 스키마입니다.

{
  "namespace": "example.avro",
  "type": "record",
  "name": "Person",
  "fields": [
    {"name": "name", "type": "string"},
    {"name": "age", "type": "int"}
  ]
}

2.3. 데이터 직렬화

Avro 스키마를 이용하여 데이터를 직렬화하는 방법은 다음과 같습니다.

import org.apache.avro.Schema;
import org.apache.avro.generic.GenericData;
import org.apache.avro.generic.GenericRecord;
import org.apache.avro.io.DatumWriter;
import org.apache.avro.io.Encoder;
import org.apache.avro.io.EncoderFactory;
import org.apache.avro.reflect.ReflectDatumWriter;

...

// Avro 스키마 로드
Schema schema = new Schema.Parser().parse(new File("Person.avsc"));

// 직렬화할 데이터 생성
GenericRecord person = new GenericData.Record(schema);
person.put("name", "John");
person.put("age", 30);

// 데이터를 이진 형식으로 직렬화
DatumWriter<GenericRecord> writer = new ReflectDatumWriter<>(schema);
ByteArrayOutputStream out = new ByteArrayOutputStream();
Encoder encoder = EncoderFactory.get().binaryEncoder(out, null);
writer.write(person, encoder);
encoder.flush();
byte[] serializedData = out.toByteArray();

2.4. 데이터 역직렬화

이진 형식으로 직렬화된 데이터를 역직렬화하는 방법은 다음과 같습니다.

import org.apache.avro.io.BinaryDecoder;
import org.apache.avro.io.DecoderFactory;
import org.apache.avro.reflect.ReflectDatumReader;

...

// Avro 스키마 로드
Schema schema = new Schema.Parser().parse(new File("Person.avsc"));

// 역직렬화할 데이터 생성
BinaryDecoder decoder = DecoderFactory.get().binaryDecoder(serializedData, null);
ReflectDatumReader<GenericRecord> reader = new ReflectDatumReader<>(schema);
GenericRecord person = reader.read(null, decoder);

// 데이터 접근
String name = (String) person.get("name");
int age = (int) person.get("age");

참고 자료

위의 코드와 방법을 참고하여 Java와 Apache Avro를 사용하여 실시간 데이터 스트리밍을 구현해 보세요. Avro의 유연한 스키마 정의와 직렬화/역직렬화 기능을 활용하여 데이터의 구조 변화에 유연하게 대응할 수 있습니다.