일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- schema registry
- Slick
- enablekafkastreams
- kafka streams
- Elk
- scala
- Spring
- spring-kafka
- kafkastream
- 플레이 프레임워크
- kafka interactive query
- RabbitMQ
- avo
- gradle
- aws
- confluent
- Elasticsearch
- scala 2.10
- reactive
- 한빛미디어
- kafkastreams
- statestore
- spring-cloud-stream
- play framework
- coursera
- Kafka
- springboot
- Logstash
- 카프카
- spring-batch
- Today
- Total
b
Avro GenericRecord,SpecificRecord 본문
GenericRecord
{
"type": "record",
"namespace": "com.example",
"name": "user",
"fields": [
{
"name": "name",
"type": "string"
}
]
}다시피
GenericRecordBuilder builder = new GenericRecordBuilder(schemaString);
builder.set("name", "bistros");
GenericData.Record bistros = builder.build();
System.out.println(bistros);
System.out.println(bistros.getSchema());
// {"name": "bistros"}
// {"type":"record","name":"user","namespace":"com.example", "fields":[{"name":"name","type":"string"}]}
보시다시피 GenericRecordBuilder set(String fieldName, Object value) 를 통해서 값을 셋팅하기 때문에 불안하다.
SpecificRecord
하지만 SpecificRecord는 좀 다르다. avro schema를 기반으로 maven/gradle 플러기인으로 resources를 생성해보면 extends org.apache.avro.specific.SpecificRecordBase 를 통해서 똑같이 GenericData를 상속하고 있지만 6개 필드를 가진 Avro Schema 파일에서 약 550라인의 Class파일이생성된다. getter/setter/builder 등이 구현되어 있다.
요약)
Gradle Plugin을 이용해서 Class 파일을 만들어야 하지만 SpecificRecord를 사용하는 게 당연하다.
사족)
Confluent의 Kafka-Avro-Serializer는 default로 generic type을 읽고 쓰게 되어 있다.
properties.setProperty("specific.avro.reader", "true");
을 통해서 specific 모드를 활성화 해야 하고, 이것을 활성화 하면 내부적으로 사용하는 DatumReader를 SpecificDatumReader 으로 셋팅하다.
추가적으로 Streams 모드를 위해서는 아예 GenericAvroSerde, SpecificAvroSerde 2개의 Serde를 따로 제공해주고 있다.