본문 바로가기

인프라,데이터

데이터 중심 애플리케이션 설계 4장 정리

부호화와 발전

 

관계형 데이터베이스
일반적으로 모든 데이터베이스의 모든 데이터가 하나의 스키마를 따른다고 가정한다.

읽기 스키마(스키마리스) 데이터베이스
스키마를 강요하지 않으므로 다른 시점에 쓰여진 이전 데이터 타입과 새로운 데이터 타입이 섞여 포함될 수 있다.

 

데이터 구조

  • object, struct(구조체), list, array, hash table, tree 등
  • CPU에서 효율적으로 접근하고 조작할 수 있게 (보통은 포인터를 이용해) 최적화된다.

 

부호화

  • 인메모리 표현 -> 바이트열(ex : JSON 문서)로의 전환 - 직렬화, 마샬링이라고 함
    • 파이썬의 pickle, 루비의 Marchal
  • 바이트열 -> 인메모리 표현 : 복호화 - 파싱, 역직렬화, 언마샬링이라고도 함
  • 보통 특정 프로그래밍 언어와 묶여 있어 다른 언어에서 데이터를 읽기는 매우 어렵다. 
  • 자바의 내장 직렬화는 성능이 좋지 않고 비대해지는 부호화로 유명하다.

 

JSON과 XML, 이진 변형

JSON 

  • 자바스크립트의 일부이기 때문에 웹 브라우저에 내장된 지원, XML 대비 단순함
  • 하지만 이진 형식과 비교하면 많은 공간 사용
    -> JSON, BSON, BISON, XML 용으로 사용 가능한 다양한 이진 부호화의 개발로 이어짐

 

부호화된 데이터는 숫자 1,2,3과 같은 필드 태그를 포함

 

이진 스키마 기반 형식

  • 스리프트, 프로토콜 버퍼, 아브로

 

스키마

스키마 발전 : 스키마는 필연적으로 시간이 지남에 따라 변함

 

쓰기 스키마와 읽기 스키마

쓰기 스키마 

  • 스키마를 애플리케이션에 포함하고, 스키마로 데이터를 부호화함

 

읽기 스키마

  • 파일이나 데이터베이스/네트워크 등에서 읽은 데이터를 복호화

 

스키마의 장점

  • 자체한 유효성 검사 규칙을 지원
  • 스키마를 기반으로 한 이진 부호화의 장점
    • 필드 이름을 생략할 수 있기 때문에 크기가 훨씬 작을 수 있다.
    • 복호화를 할 때 스키마가 필요하기 때문에 스키마가 최신 상태인지를 확신할 수 있다.
  • 스키마 변경이 적용되기 전에 상위 호환성과 하위 호환성을 확인할 수 있다.
  • 컴파일 시점에 타입 체크를 할 수 있다. (정적 타입 프로그래밍 언어 사용의 경우)

 

마이그레이션

  • 데이터를 새로운 스키마로 다시 기록하는 작업
  • 대용량 데이터셋 대상으로는 값비싼 작업이기 때문에 대부분의 데이터베이스에서 가능하면 이런 상황을 피함
    • 대부분의 관계형 데이터베이스는 기존 데이터를 다시 기록하지 않고 null을 기본값으로 갖는 새로운 칼럼을 추가하는 간단한 스키마 변경을 허용

메시지 브로커 (메시지 큐)

  • 메시지를 직접 네트워크 연결로 전송하지 않고 임시로 메시지를 저장
  • 수신자가 사용 불가능하거나 과부하 상태라면 버퍼처럼 동작할 수 있음 -> 시스템 안정성 향상
  • 죽었던 프로세스에 메시지를 다시 전달할 수 있기 때문에 메시지 유실을 방지
  • 하나의 메시지를 여러 수신자로 전송할 수 있음
  • 논리적으로 송신자를 수신자로 분리
  • 메시지에 대한 응답을 기대하지 않는 비동기 통신 (메시지를 보낸 다음 잊는다)
  • RabbitMQ, Apache Kafka 등

 

큐와 버퍼의 차이

  • 버퍼 : 그릇같은 것
  • 큐 : 통로 

 


버퍼와 큐, 메시지 브로커의 차이가 나에겐 헷갈리는 점이었는데 그 부분을 구분할 수 있게 되어 좋았던 장이다.

그거 말고는 앞부분의 부호화 복호화 부분이 난해했다... 2회독 해도 좀 난해하다...