티스토리 뷰
728x90
핵심 요약
카프카 프로듀서·컨슈머가 주고받는 메시지는 직렬화 형식(String → 바이트·JSON → 텍스트·Avro → 바이너리+스키마)에 따라 네트워크 대역폭·처리 지연·스키마 진화 난이도가 크게 달라집니다. 간단-가벼운 String, 범용·가독성 높은 JSON, 성능과 스키마 관리에 강력한 Avro + Schema Registry를 비교하고, Avro 연동 절차를 단계별로 안내합니다.
1. 카프카 직렬화가 중요한 이유
프로듀서는 객체를 byte[]로 변환(serialize)한 뒤 브로커에 전송하고, 컨슈머는 역직렬화(deserialize)로 애플리케이션 객체를 복원합니다. 형식별 페이로드 크기·CPU 소모·스키마 검증 차이가 파이프라인 전체 성능과 안정성을 좌우합니다.
2. StringSerializer – 가장 단순한 선택
- 작동 원리: UTF-8(기본)로 문자열을 바이트 배열에 바로 인코딩합니다.
- 장점
- 설정이 거의 필요 없고 디버깅이 쉽습니다.
- 스키마-레지스트리 등 외부 서비스가 필요 없습니다.
- 단점
- 구조적 데이터(필드·타입)가 없어 계약 위반을 잡아내지 못합니다.
- 텍스트 기반이라 바이너리보다 메시지 크기·역직렬화 CPU가 큽니다.
- 대표 사용처: 로그·이벤트 키 등 단일 필드 텍스트, 빠른 PoC.
3. JSON 직렬화 – 호환성과 가독성
3-1. 일반 JSON
- 장점: 언어·플랫폼 무관, 사람이 읽을 수 있어 디버깅이 편리.
- 단점: 구조(스키마) 변동 시 호환성 관리가 코드 책임이며, 텍스트라 페이로드가 커서 네트워크 비용 증가.
3-2. JSON Schema + Schema Registry
- Confluent JSON Serializer는 메시지에 스키마 ID(magic byte+4byte)만 붙이고 실제 스키마는 레지스트리에 저장해 오버헤드를 최소화합니다.
- 자동 등록·호환성 검사(BACKWARD/FORWARD) 지원으로 스키마 진화를 안전하게 수행할 수 있습니다.
4. Avro 직렬화 – 성능과 스키마 진화의 균형
4-1. 특징
- 바이너리 인코딩으로 JSON 대비 2~10배 작은 크기·더 빠른 역직렬화 성능을 보입니다.
- 스키마가 필수라 타입 안전·필드 순서·디폴트 값 등 엄격한 계약을 보장합니다.
- Confluent Avro Serializer는 메시지 앞에 magic byte+schema ID를 추가해 스키마를 전송하지 않고도 역직렬화합니다.
4-2. 장점
- 크기·처리 속도: 텍스트 구분자·공백이 없어 네트워크 효율 우수.
- 스키마 호환성 레벨(BACKWARD/FORWARD/FULL)을 설정해 안전하게 필드 추가·변경 가능.
4-3. 단점
- 바이너리라 사후 디버깅 시 스키마 없이는 내용 확인이 어렵습니다.
- Schema Registry 의존성으로 운영 복잡도가 증가합니다.
5. 형식별 비교 표
항목 String JSON / JSON Schema Avro + Schema Registry
| 메시지 크기 | 큼(텍스트) | 큼(텍스트) | 작음(바이너리) |
| 직렬화 속도 | 빠름 | 중간 | 빠름 |
| 스키마 강제 | 없음 | JSON Schema 사용 시 가능 | 항상(진화 정책) |
| 개발 편의 | 최고 | 높음 | 중간 |
| 언어 호환 | 모든 언어 | 모든 언어 | 모든 언어(공식 Avro SDK) |
| 대표 사례 | 단일 키·로그 | 마이크로서비스 DTO | 이벤트 소싱·DW 파이프라인 |
6. 직렬화 형식 선택 가이드
- 단순 로그·키 → String (운영 비용 최소).
- REST-like 메시지, 인간 가독성 우선 → JSON.
- 데이터 레이크, DW 적재, 엄격 계약·고성능 → Avro + Schema Registry.
- 멀티팀·다중 언어 환경에서는 스키마 기반(Avro/JSON Schema)으로 중앙화해 충돌을 예방합니다.
7. Avro + Schema Registry 실전 연동
# producer.properties
bootstrap.servers=localhost:9092
key.serializer=org.apache.kafka.common.serialization.StringSerializer
value.serializer=io.confluent.kafka.serializers.KafkaAvroSerializer
schema.registry.url=http://localhost:8081
ProducerRecord<String, User> rec =
new ProducerRecord<>("users",
new User(1, "sangjin", "premium"));
producer.send(rec);
- Schema Registry 기동: confluent local services schema-registry start.
- 스키마 작성(User.avsc) 후 처음 전송 시 자동 등록 → Schema ID 부여.
- 컨슈머는 KafkaAvroDeserializer + schema.registry.url 로 동일 Schema ID를 조회해 역직렬화합니다.
- 스키마 변경 시 호환성 레벨 따라 등록 여부가 자동 검증·차단됩니다.
8. 결론 및 팁
- 개발 초기엔 JSON/String으로 빠르게 시작하고, 계약 안정·처리량이 필요해지면 Avro + Schema Registry로 전환하는 전략이 현실적입니다.
- Schema Registry는 REST API이므로 CI/CD 파이프라인에 스키마 등록·검증 단계를 넣어 데이터 품질 사고를 미리 차단하세요.
- Avro라도 Logical Type(decimal, timestamp-micros 등)을 사용하면 DW·SQL 호환성이 크게 향상됩니다 .
728x90
'개발 인프라 > 카프카' 카테고리의 다른 글
| 카프카 컨슈머, 안전한 오프셋 관리를 위한 수동 커밋 전략 (1) | 2025.05.23 |
|---|---|
| 카프카 프로듀서, 메시지 전송 보장 레벨(acks) (1) | 2025.05.23 |
| 주키퍼(ZooKeeper)는 이제 안녕? KRaft 모드 알아보기 (0) | 2025.05.22 |
| 카프카 토픽과 파티션, 왜 중요할까? (1) | 2025.05.21 |
| 카프카 컨슈머(Consumer)와 컨슈머 그룹 파헤치기 (1) | 2025.05.16 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- unreal engjin
- JAVA 프로그래밍
- Claude Agent SDK
- AI 에이전트
- RESTfull
- Heap Area
- 일급 객체
- method Area
- First-class citizen
- 언리얼엔진
- JVM
- generated_body()
- Java
- 스브링부트
- 타입 안전성
- cqrs
- 디자인패턴
- Subagent
- 코프링
- MCP
- 코틀린
- vite
- springai
- redis
- 자바
- 카프카 개념
- model context protocol
- 언리얼엔진5
- Stack Area
- ai통합
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
글 보관함
