『DDIA 4장. 부호화와 발전』
- 애플리케이션은 시간이 지남에 따라 변한다.
- 데이터 타입이나 스키마가 변경될 때 애플리케이션 코드 변경이 발생한다.
- 시스템이 원할하게 실행되게 하려면 양방향으로 하위 호환성을 유지해야 한다.
데이터 부호화 형식
- 데이터를 파일에 쓰거나 네트워크로 전송하려면 바이트열 형태로 부호화해야 한다.
- 포인터는 다른 프로세스가 이해할 수 없으므로 바이트열은 보통 메모리에서 사용하는 데이터 구조와는 상당히 다르다.
- 인메모리 표현에서 바이트열로의 전환을 부호화, 직렬화, 마샬링이라고 한다. 그 반대를 복호화, 파싱, 역직렬화, 언마샬링라고 한다.
- 프로그래밍 언어가 내부적으로 지원하는 부호화 형식은 심각한 문제점이 많다:
- 다른 언어에서 데이터를 읽기 어렵다.
- 동일한 객체 유형의 데이터를 복호화하려면 임의의 클래스를 인스턴스화할 수 있어야 하는데, 이는 보안 문제가 될 수 있다.
- 데이터 버전 관리와 효율성을 부차적 문제로 여기게 된다.
JSON과 XML, 이진 변형
- JSON과 XML은 많은 언어에서 읽고 쓸 수 있는 표준화된 부호화 형식이다.
- JSON, XML, CSV는 어느 정도 사람이 읽을 수 있다. 아래와 같은 결점이 있기는 하지만 다양한 용도에 사용하기 충분하다.
- XML, CSV는 수와 숫자로 이뤄진 문자열을 구분할 수 없다. JSON은 문자열과 수를 구분하지만 정수와 부동소수점 수를 구분하지 않는다.
- JSON과 XML은 유니코드 문자열을 잘 이애하지만, 이진 문자열(부호화가 없는 바이트열)을 지원하지 않는다.
- 이진 형식은 다른 부호화 형식에 비해 작고 효율적이다.
- 사람들이 동의만 한다면 얼마나 읽기 쉽고 효율적인 형식인지는 대개 중요하지 않다.
- 무엇이든 다른 조직의 동의를 얻는 어려움은 대부분의 다른 문제보다 더 크다.
스리프트와 프로토콜 버퍼
- 아파치 스리프트(apache thrift)와 프로토콜 버퍼(protocol buffers)는 같은 원리를 기반으로 한 이진 부호화 라이브러리다.
- 스리프트와 프로토콜 버퍼 둘 다 부호화할 데이터를 위한 스키마가 필요하다.
- 새로운 버전의 스키마에 기본값이 없는 필드를 추가하면 새로운 읽기는 예전 쓰기가 기록한 데이터를 읽을 수 없어 하휘호환성이 깨진다.
- 기본값이 없는 필드를 삭제하면 예전 읽기는 새로운 쓰기가 기록한 데이터를 읽을 수 없어 상위호환성이 깨진다.
데이터플로 모드
- 데이터플로는 매우 추상적인 개념이며, 하나의 프로세스에서 다른 프로세스로 데이터를 전달하는 방법은 아주 많다.
- 네트워크를 통해 통신해야 하는 프로세스가 있을 때는 일반적으로 클라이언트와 서버를 배치한다.
- 서버 자체가 다른 서비스의 클라이언트가 되기도 한다. 이런 접근 방식은 대용량 애플리케이션 기능 영역을 소규모 서비스로 나누는 데 사용한다.
- 이런 개발 방식을 전통적으로 서비스 지향 설계(Service-Oriented Architecture, SOA)라고 불렀다.
- SOA를 개선한 것이 마이크로서비스 설계(MicroService Architecture, MSA)다.
- 웹 서비스에서 대중적인 두 가지 방법은 REST와 SOAP이다.
- REST는 프로토콜이 아니라 HTTP의 원칙을 토대로 한 설계 철학이다.
- SOAP은 네트워크 API 요청을 위한 XML 기반 프로토콜이다.
- 원격 프로시저 호출(Remote Procedure Call, RPC)는 원격 네트워크 서비스 요청을 같은 프로세스 안에서 특정 프로그래밍 언어의 함수를 호출하는 듯 사용할 수 있도록 해준다.
- RPC는 편리한 것 같지만 근본적인 결함이 있다:
- 로컬 함수 호출은 결과를 반환하거나, 반환하지 않거나, 예외를 일으킬 수 있다. 반면 네트워크 요청으로 타임아웃이 일어나면 무슨 일이 일어났는지 알기 어렵다.
- 실패한 네트워크 요청을 다시 시도할 때 요청이 실제로는 처리되고, 응답만 유실될 수 있다.
- 네트워크 요청은 함수 호출보다 훨씬 느리다. 네트워크가 혼잡하면 같은 작업에도 시간이 더 걸릴 수 있다.
- 로컬 함수와 다르게 네트워크 요청을 위해서는 부호화가 필요하다.
이 문서를 인용한 문서
- 『데이터 중심 어플리케이션 설계(DDIA)』
-
4장. 부호화와 발전
-