2025년 1월 13일 작성

ksqlDB Value Format - Data 직렬화 방식

ksqlDB의 Value Format을 설정하여, Data를 직렬화하고 역직렬화하는 방식을 결정할 수 있습니다.

Value Format : ksqlDB에서 Data를 직렬화하고 역직렬화하는 방식

  • ksqlDB의 Value format은 data가 어떻게 저장/전송/처리되는지를 결정하는 설정입니다.
  • value format은 크게 JSON, AVRO, PROTOBUF로 나뉩니다.
    • JSON, AVRO, PROTOBUF 모두 ksqlDB에 종속된 것이 아닌, 별개의 data 처리 format/system입니다.
    • ksqlDB에서 지원하는 data 형식이 JSON, AVRO, PROTOBUF일 뿐입니다.
특징 JSON AVRO PROTOBUF
개발사 - Apache Google
형식 Text Binary Binary
가독성 매우 높음 낮음 낮음
Schema Registry 불필요 필수 필수
Data 크기 작음 매우 작음
설정 복잡도 낮음 중간 높음
Schema 관리 수동 자동화 자동화
Type 검증 느슨함 엄격함 매우 엄격함
성능 낮음 높음 매우 높음
학습 곡선 낮음 중간 높음
Code 생성 미지원 지원 강력 지원
주요 장점 직관적, 설정 간단, 유연한 구조, 범용성 자동 schema 관리, version 관리, 호환성 check, 우수한 성능 최고 성능, 최소 data 크기, 다양한 언어 지원, 엄격한 type check
주요 단점 큰 용량, 수동 schema 관리, 낮은 성능, parsing overhead registry server 필수, 복잡한 초기 설정, 운영 비용, 낮은 가독성 복잡한 설정/관리, 가파른 학습 곡선, registry 필수, 낮은 가독성
권장 사용 환경 개발/Test 환경, 잦은 구조 변경, 소규모 data 운영 환경, 체계적 schema 관리, 대용량 data 극도의 성능 필요, 다중 언어 환경, 대규모 data
  • ksqlDB에서 Value Format은 Stream과 Table에 대해 지정할 수 있습니다.
    • CREATE STREAM 또는 CREATE TABLE 문의 WITH 절에서 VALUE_FORMAT 속성에 'JSON', 'AVRO', 'PROTOBUF' 중 하나를 지정하면 됩니다.
-- Stream 생성 시
CREATE STREAM stream_name (
    field1 INTEGER,
    field2 STRING
) WITH (
    KAFKA_TOPIC = 'topic_name',
    VALUE_FORMAT = 'JSON'    -- 또는 'AVRO', 'PROTOBUF'
);

-- Table 생성 시
CREATE TABLE table_name (
    field1 INTEGER,
    field2 STRING
) WITH (
    KAFKA_TOPIC = 'topic_name',
    VALUE_FORMAT = 'JSON'    -- 또는 'AVRO', 'PROTOBUF'
);

JSON (JavaScript Object Notation)

  • JSON은 key-value 쌍으로 이루어진 text 기반의 data format입니다.
{
  "string_value": "Hello World",
  "number_value": 42,
  "boolean_value": true,
  "null_value": null,
  "array_value": [1, 2, 3],
  "object_value": {
    "nested": "value"
  }
}

JSON의 특징

  • data가 text 형식으로 저장됩니다.
  • 중괄호({})로 객체를 표현하고, 대괄호([])로 배열을 표현합니다.
  • key는 반드시 문자열이어야 합니다.
  • 값은 문자열, 숫자, 객체, 배열, boolean, null이 가능합니다.

JSON의 장점

  • 사람이 읽고 쓰기 쉽습니다.
    • text editor로 직접 내용 확인이 가능합니다.
    • debugging이 용이합니다.
  • 설정이 매우 간단합니다.
    • schema registry가 필요하지 않습니다.
    • 추가 service 구성이 불필요합니다.
  • 유연한 schema 변경이 가능합니다.
    • field 추가/삭제가 자유롭습니다.
    • 하위 호환성 걱정이 없습니다.
  • 개발 도구 지원이 풍부합니다.
    • 대부분의 programming 언어에서 기본 지원합니다.
    • 다양한 JSON 처리 library가 존재합니다.

JSON의 단점

  • data 용량이 큽니다.
    • 모든 field명이 문자열로 반복 저장됩니다.
    • 공백, 따옴표 등 부가적인 문자가 포함됩니다.
  • schema 관리가 어렵습니다.
    • 명시적인 schema 정의가 없습니다.
    • version 관리가 수동으로 이루어져야 합니다.
    • type 불일치 문제가 runtime에 발견됩니다.
  • 성능상의 제약이 있습니다.
    • 매번 parsing 작업이 필요합니다.
    • 대량의 data 처리 시 CPU 사용량이 증가합니다.
  • data 정합성 검증이 어렵습니다.
    • 필수 field check가 runtime에 이루어집니다.
    • type 검증이 느슨합니다.

AVRO (Apache Avro)

  • AVRO는 compact한 직렬화와 풍부한 data 구조를 제공하는 format입니다.
{
  "type": "record",
  "name": "Example",
  "fields": [
    {"name": "string_value", "type": "string"},
    {"name": "number_value", "type": "int"},
    {"name": "boolean_value", "type": "boolean"},
    {"name": "array_value", "type": {"type": "array", "items": "int"}},
    {"name": "object_value", "type": {
      "type": "record",
      "name": "NestedObject",
      "fields": [
        {"name": "nested", "type": "string"}
      ]
    }}
  ]
}

AVRO의 특징

  • schema가 JSON으로 정의됩니다.
  • data는 binary 형식으로 저장됩니다.
  • schema version 관리를 지원합니다.
  • 동적/정적 type binding이 모두 가능합니다.

AVRO의 장점

  • 효율적인 data 저장이 가능합니다.
    • schema를 별도로 관리하여 중복을 제거합니다.
    • binary 형식으로 저장하여 용량이 작습니다.
    • field 이름을 index로 대체하여 저장합니다.
  • 체계적인 schema 관리를 제공합니다.
    • schema registry를 통한 중앙 관리가 가능합니다.
    • schema version 간 호환성을 자동으로 확인합니다.
    • schema 변경 이력을 추적할 수 있습니다.
  • data type 안정성이 보장됩니다.
    • compile 시점에 type check가 가능합니다.
    • 필수 field 누락을 사전에 방지합니다.
    • 잘못된 data 형식을 즉시 발견할 수 있습니다.
  • 성능이 우수합니다.
    • 직렬화/역직렬화 속도가 빠릅니다.
    • schema caching으로 반복 작업을 최소화합니다.
    • network 대역폭 사용이 효율적입니다.

AVRO의 단점

  • 초기 설정이 복잡합니다.
    • schema registry server 구축이 필요합니다.
    • schema 정의 file을 관리해야 합니다.
    • 개발자들의 추가 학습이 필요합니다.
  • 운영 부담이 있습니다.
    • schema registry server를 관리해야 합니다.
    • schema 변경 시 호환성 검토가 필요합니다.
    • version 관리에 주의가 필요합니다.
  • debugging이 어렵습니다.
    • binary data를 직접 읽을 수 없습니다.
    • 전용 도구가 필요합니다.
    • log 분석이 JSON보다 복잡합니다.

PROTOBUF (Protocol Buffers)

  • PROTOBUF는 Google이 개발한 언어 중립적인 data 직렬화 format입니다.
// Protocol Buffer
message Example {
  string string_value = 1;
  int32 number_value = 2;
  bool boolean_value = 3;
  repeated int32 array_value = 4;
  message NestedObject {
    string nested = 1;
  }
  NestedObject object_value = 5;
}

PROTOBUF의 특징

  • .proto file에 schema를 정의합니다.
  • binary 형식으로 data를 저장합니다.
  • 자동화된 code 생성을 지원합니다.
  • IDL(Interface Definition Language)을 제공합니다.

PROTOBUF의 장점

  • data 크기가 가장 작습니다.
    • 최적화된 encoding 방식을 사용합니다.
    • field 번호로 식별자를 대체합니다.
    • 불필요한 metadata를 제거합니다.
  • 다양한 programming 언어를 지원합니다.
    • 언어별 native code를 생성합니다.
    • RPC(Remote Procedure Call) 지원이 내장되어 있습니다.
    • cross platform 호환성이 우수합니다.
  • 성능이 매우 우수합니다.
    • parsing overhead가 최소화됩니다.
    • memory 사용이 효율적입니다.
    • network 전송이 빠릅니다.

PROTOBUF의 단점

  • 설정이 가장 복잡합니다.
    • .proto file 작성이 필요합니다.
    • code 생성 단계가 build 과정에 포함되어야 합니다.
    • schema registry 구성이 필요합니다.
  • 학습 곡선이 가파릅니다.
    • Proto3 문법을 익혀야 합니다.
    • code 생성 도구 사용법을 알아야 합니다.
    • version 관리 전략을 수립해야 합니다.
  • data 확인이 어렵습니다.
    • binary 형식이라 직접 읽을 수 없습니다.
    • debugging 도구가 제한적입니다.
    • logging과 monitoring이 복잡합니다.

Value Format 선택 기준

  • JSON은 빠른 개발과 간단한 운영이 필요한 소규모 project에, AVRO는 안정적인 production 환경의 대용량 data 처리에, PROTOBUF는 극도의 성능과 type 안정성이 필요한 대규모 다중 언어 system에 적합합니다.

JSON을 선택해야 하는 경우

  • 빠른 prototyping이 필요한 경우.
  • 개발/Test 환경을 구축하는 경우.
  • data 구조가 자주 변경되는 경우.
  • 운영 복잡도를 최소화하고 싶은 경우.
  • debugging과 data 확인이 빈번한 경우.
  • 소규모 data를 처리하는 경우.

AVRO를 선택해야 하는 경우

  • production 환경에서 운영하는 경우.
  • 대용량 data를 처리하는 경우.
  • schema 변경 관리가 중요한 경우.
  • data 정합성이 중요한 경우.
  • network 대역폭을 최적화해야 하는 경우.
  • 장기적인 data 호환성이 필요한 경우.

PROTOBUF를 선택해야 하는 경우

  • 극도의 성능 최적화가 필요한 경우.
  • 다양한 언어로 된 service가 연동되는 경우.
  • RPC 기능이 필요한 경우.
  • 매우 큰 규모의 system을 구축하는 경우.
  • data 크기를 최소화해야 하는 경우.
  • 강력한 type 안정성이 요구되는 경우.

목차