Open MinJunKweon opened 8 months ago
공간이 절약되면서 얻는 효율성(저장공간 확보 & 전송/파싱 속도 등)
과 사람의 가독성
중에서 어느 것을 중요시하는지 생각해보자아브로
라고 읽는구나. 찾아보니 외국에선 보통 아브로
라고 읽는다고 함. 우린 에이브로
라고 읽음.스키마레지스트리
를 사용한다서비스 API의 버전 간 호환
-> API spec 어떻게 관리하는지? 우린 api spec을 등록해두는 곳이 따로 있음. 여기에 Swagger 파일 올림
끄적끄적
Snowflake는 64bit Unsigned 정수로 나타내는데, 대충 57bit 넘어가는 숫자는 JS에서 overflow가 발생함
Snowflake에서는 그래서
id_str
라는 id용 문자열을 따로 두는 중 (링크 - https://groups.google.com/g/twitter-development-talk/c/ahbvo3VTIYI)정리
### Serialization이 필요한 이유 - 인메모리 상의 바이트를 그대로 파일이나 네트워크 통신에 사용하기 어렵기 때문 - e.g.) 포인터나 레퍼런스 같은 경우는 인메모리 상에서만 사용 가능하기 때문에 파일이나 네트워크 통신에서 사용하기 위해 변환 과정이 필요하다. ⇒ 부호화(Serialization) ### 프로그램 내장 Serialization을 쓰지 않는 걸 권장하는 이유 - 많은 프로그래밍 언어에서 직렬화/역직렬화 라이브러리를 내장하고 있음 - Java의 `java.io.Serializable`, Python의 `pickle`, Ruby의 `Marshal` - 하지만, 모종의 이유로 쓰지 않는 것을 권장함 - **너무 프로그래밍 언어에 종속적인 부호화는 다른 프로그램과의 호환성이 떨어질 수 있음** ⇒ 향후 마이그레이션이 어려울 수 있음. 또는 다른 프로그래밍 언어와 통신에 사용하기 어려움 - **보안 이슈가 발생할 수 있음** ⇒ 공격자가 임의의 바이트열을 복호화하여 인스턴스를 만들 수 있고, 원격 코드 실행이 이루어질 수 있음 - **데이터 버전 관리가 어려움** ⇒ 데이터 버전 관리에 대해 고려가 안되고 설계되었을 수 있음 - **효율성이 떨어질 수 있음** ⇒ CPU나 메모리 자원을 많이 사용할 수 있음 ## 많이 사용되고 있는 Serialization 방식 - JSON, XML, CSV 포맷이 보통 표준화되어 사용됨 - 각 데이터 포맷들은 각자 장단점을 가지고 있고, 문제점을 해결하기 위해 파생되는 직렬화 방식이 많음 - 이 포맷들의 대표적인 문제점 - **Number를 변환하는 과정에 많은 애매함이 있음** ⇒ 문자열과 구분하기 어렵거나 정수, 부동소수점을 구분하지 않는다거나 - **큰 수를 다룰 때 부정확 할 수 있음** ⇒ 부동소수점이나 큰 수를 표현하는 방식이 달라서 정확도가 떨어질 수 있음 - Twitter에서는 트윗 ID를 64bit unsigned bit로 표현하는데, 이 숫자를 역직렬화할 때 오버플로우가 발생하는 언어들이 몇개 있음 (e.g. JavaScript) - 트위터는 이 문제를 해결하기 위해 ID를 문자열로 만들어서 별개 필드로 넘겨줌 - **바이너리 직렬화에 대한 지원이 부족함** ⇒ 바이너리를 전송하려면 Base64 같이 Printable Character로 변환해서 전송해야함. 이는 크기가 33% 증가하는 오버헤드가 발생함 - **CSV는 스키마가 없고 로우와 컬럼의 의미를 파악해서 역직렬화하는 부분은 전부 애플리케이션의 책임** ⇒ 이스케이핑 규칙 같은 것들도 파서에서 지원을 안할 수 있음 ## 이진 부호화(Binary Serialization) - JSON, XML과 다르게 별개로 여러가지 이진 부호화 방식이 있음 - 사람이 알아보기 어렵다는 단점이 있지만, 그만큼 효율적으로 크기를 줄일 수 있음 ### Thrift와 Protocol Buffers - 둘다 메시지에 대한 스키마를 정의해야함 - 스키마 정의 언어는 IDL(Interface Definition Language)라고 부름 - https://en.wikipedia.org/wiki/Interface_description_language ```protobuf // Thift struct Person { 1: required string userName, 2: optional i64 favoriteNumber, 3: optional list