본문 바로가기

Backend/Database concept

[DB] 부호화와 발전

어플리케이션은 시간이 지남에 따라 변한다. 데이터 타입이나 스키마가 변경되어도 시스템은 원할하게 실행되어야 한다. 이를 위해선 양방향으로 호환성을 유지해야 한다. 

 

하위 호환성 

새로운 코드는 예전 코드가 기록한 데이터를 읽을 수 있어야 한다. 

 

상위 호환성 

예전 코드는 새로운 코드가 기록한 데이터를 읽을 수 있어야 한다. 

 

JSON, XML, 프로토콜 버퍼(Protocol Buffers), 스리프트(Thrift), 아브로(Avro)를 비롯해서 데이터 부호화를 위한 다양한 형식들을 알아보자. 후에, 어떻게 스키마를 변경하고 예전 버전과 새로운 버전의 데이터와 코드가 공존하는 시스템을 어떻게 지원하는지를 알아보자. 

 

데이터 부호화 (Data encoding)

인메모리에서 바이트열로의 전환 (직렬화나 마샬링이라고도 함)라고 하며, 그 반대를 복호화 decoding(파싱, 역직렬화, 언마샬링) 라고 한다.

 

JSON, XML

JSON과 XML은 텍스트 기반의 형식으로 가독성이 좋고, 사람이 읽고 쓰기에 용이하다. 하지만 데이터 크기가 크고 복잡한 데이터를 다루기에는 한계가 있다. 

Protocol Buffer, Thrift

스리프트는 부호화할 데이터를 위한 스키마가 필요하다. 스리프트 인터페이스 정의 언어(interface definition language, IDL)로 스키마를 기술해야 한다.

 

struct Person{
    1: required string       userName,
    2: optional i64	   favoriteNumber,
    3: optional list<string> interests
}

 

 

스리프트는 스키마 정의를 사용해 코드를 생성하는 도구가 있다. 이 도구는 다양한 프로그래밍 언어로 스키마를 구현한 클래스를 생성한다. 어플리케이션 코드는 생성된 코드를 호출해 스키마의 레코드를 부호화하고 복호화할 수 있다. 

 

스리프트는 바이너리 프로토콜(binary protocal)과 컴팩트프로토콜(compact protocol)이라는 두 가지 다른 이진 부호화 형식이 있다. 아래는 컴팩트 프로토콜을 이용한 부호화 예제이다. 

 

 

가장 큰 차이점은 필드 이름 (username, favoriteNumber, interests)이 없다. 대신 부호화된 데이터는 숫자(1,2,3)과 같은 필드 태그를 포함한다. 

 

어떻게 스키마의 발전에 대처하는지

-상위 호환성 측면

 

부호화된 레코드는 부호화된 필드의 연결일 뿐이다. 

필드에 새로운 태그 번호를 부여하는 방식으로 스키마에 새로운 필드를 추가할 수 있다. 

 

-하위 호환성 측면

 

태그 번호가 계속 같은 의미를 가지고 있기 때문에 새로운 코드가 예전 데이터를 항상 읽을 수 있다. 

하위 호환성을 유지하기 위해 새로운 필드를 추가할 경우, optional로 하거나 기본값을 가져야 한다. 

optional 필드만 삭제할 수 있다. (required 필드는 결코 삭제할 수 없다.) 

'Backend > Database concept' 카테고리의 다른 글

[DB] 분산 데이터 - 복제  (0) 2024.02.02
[DB] 데이터 플로  (0) 2024.01.30
[DB] OLTP, OLAP, Data Warehouse  (1) 2024.01.21
[DB] B tree  (0) 2024.01.16
[DB] Log structured 저장소  (1) 2024.01.11