Avro란 Apache에서 만든 데이터 직렬화 시스템으로써, 다량의 데이터를 효율적으로 저장하고 관리하기 위한 개방형 데이터 직렬화 프레임워크이다.
Avro는 JSON 스키마를 동봉한 상태로 데이터를 직렬화하기 때문에, 읽을 때 별도의 스키마 사전 지식 없이도 데이터를 해석할 수 있습니다
{
"namespace": "example.avro",
"type": "record",
"name": "User",
"fields": [
{ "name": "name", "type": "string" },
{ "name": "favorite_number", "type": ["null","int"], "default": null },
{ "name": "favorite_color", "type": ["null","string"], "default": null }
]
}
name : 스키마의 이름으로 필수 요소이다.(String 형태를 가진다.)namespace : 패키지의 이름으로 선택요소이다.(String 형태를 가진다.)doc : 스키마의 설명으로 선택요소이다(String 형태를 가진다.)aliases : 이 레코드에 대한 대체 이름으로 선택요소이다.(String List 형태를 가진다.)fields : 이 레코드의 대한 스키마 포멧으로 필드 리스트를 나열한다. 필수요소로써 (String 리스트를 가진다.)fields의 하위 데이터name : 해당 필드의 이름으로 필수 요소이다(String 형태를 가진다.)doc : 필드에 대한 설명으로 선택요소이다(String 형태를 가진다.)type : 필드의 타입, 타입 스키마를 여러개 넣을 수 있다. 필수요소이다default : 필드가 안 들어왔을 때 들어갈 기본값, 선택값이다. (type에 따라 타입은 다르다)order: 필드 비교 시 사용할 정렬 기준을 정의합니다.ascending (기본), descending, ignore 중 하나를 설정할 수 있다.함께 사용하면 중앙에서 스키마를 관리하고, 스키마 버전 간 호환성을 체계적으로 통제할 수 있다.
Writer Schema와 Reader Schema를 서로 다르게 정의해도, Avro 런타임이 자동으로 필드 추가, 제거, 타입 변환 등을 해결해 줍니다. 전방 및 후방 호환성을 지원한다.
스키마 호환성(Compatibility Mode)은 BACKWARD, FORWARD, FULL, NONE 등을 설정할 수 있습니다.
일반적으로 Kafka 환경에서는 Subject별로 스키마를 버전 관리하며, 각 Producer/Consumer는 스키마 ID를 통해 참조합니다.
호환되지 않는 변경(예: 필드 타입 변경, 필수 필드 추가)은 런타임 예외를 유발할 수 있으므로 관리 전략이 필요합니다.