BSON 이해하기

2016.08.06 11:09

졸리운_곰 조회 수:38

BSON 이해하기

문제:

 

한 달 전 즈음, 자바스크립트 스터디를 하면서,
K과장님이 BSON을 쓰는 경우가 있었냐는 질문을 하셨더랬다.
당시에는 BSON이 Binary JSON의 약어라고만 알고 있었고,
실제로 써본 적도 없었기에 '잘 모른다'고 대답하고 말았다.

 

 

 

그리곤 잊고 있다가,
얼마 전에 사내 위키에서 'BSON으로 인코딩해서 보낸다'라는 문구를 만나게 돼서,
이 참에 자세히 한 번 살펴봤다.

 

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

 

 

BSON 스펙을 정의한 사이트와 자세한 설명은 아래 링크에서 확인할 수 있다.
 
 
간단히 정리해보면, 다음과 같다.
 
BSON 은 Binary JSON의 약어로, JSON 문서를 바이너리로 인코딩한 포맷이다.
최초에 몽고 DB에서 제안하였으며, 주로 JSON 형태의 데이터를 저장하거나 네트워크 전송하는 용도로 사용된다.
바이너리 데이터를 JSON 구조에 추가할 수 있다는 장점이 있다.
 
헌데, 스펙 페이지의 하단에 JSON을 BSON으로 변환한 예제가 있는데,
이게 잘 이해가 되지 않더라.

 

 
 
실제로 JSON을 BSON으로 컨버팅할 땐 라이브러리를 사용할테니 몰라도 큰 문제가 없겠지만,
그래도 좀 궁금해서 하나하나 천천히 살펴봤다.
 
이 과정이 잘 이해가 되지 않는 다른 분들도 있을 것 같아 메모해둔다.


해결책:
 

 

예제를 보기 전에 먼저, BSON은 리틀 엔디안 방식으로 작성한다는 것에 주의한다.
(즉, 하위 바이트를 앞쪽에 쓴다.)
 
스펙의 예제에 나와있는 
 
    {"hello": "world"}
 
를 BSON으로 나타내면 아래와 같다.
 
     \x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00
 
 
변환 과정을 설명하면 다음과 같다.
 
    1. BSON 도큐먼트를 정의한다.
 
    \x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00
 
    전달하려는 총 바이트의 크기를 int 32로 추가한다.
    여기서는 총 22바이트(\x16)인데, 리틀 엔디안 방식으로 전달해야 하기 때문에,
    하위 바이트인 \x16을 먼저 쓴다.
    도큐먼트의 마지막을 나타내는 바이트로 마지막에 \x00 을 추가한다.
 
 
    2. 데이터의 타입을 정의한다.
 
    \x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00
 
    키에 해당하는 데이터의 타입을 나타내는 코드를 추가한다.
    여기서는 "world"이고, UTF-8 string 이기 때문에 \x02를 추가했다.
 
 
    3. 키값을 정의한다.
 
    \x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00    
    
    키 값은 UTF-8 인코딩된 문자열과 문자열이 끝났음을 알려주는 \x00을 추가한다.
 
 
    4. 데이터를 정의한다.
 
    \x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00    
 
    string을 표기할 때에는 초기 4바이트에 종료 문자(\x00)을 포함한 문자열의 길이를 추가한다.
    여기서, 5바이트 크기인 "world"와 종료문자를 포함해 \x06을 길이로 추가했고,
    리틀 엔디안으로 표기해야하기 때문에 "\x06\x00\x00\x00" 와 같이 작성했다.
 
 
    5. 문서의 마지막임을 알린다.
 
    \x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00
 
    1번에 설명했던 것처럼, BSON 도큐먼트가 종료되었음을 알리는 종료 문자를 마지막에 추가한다.
 
 
 
 
다른 예제로, 배열을 포함한 문서의 변환 과정을 설명하면 다음과 같다.
 
    {
      "BSON": [
       "awesome", 5.05, 1986
      ]
    }
 
    \x31\x00\x00\x00\x04BSON\x00
    \x26\x00\x00\x00\x020\x00\x08\x00\x00\x00awesome\x00\x01
    1\x00\x33\x33\x33\x33\x33\x33\x14\x40\x102\x00\xc2\x07\x00\x00\x00\x00
 
순서대로 읽어보면 아래와 같다.
 
 
    \x31\x00\x00\x00\x04BSON\x00
    \x26\x00\x00\x00\x020\x00\x08\x00\x00\x00awesome\x00\x01
    1\x00\x33\x33\x33\x33\x33\x33\x14\x40\x102\x00\xc2\x07\x00\x00\x00\x00
 
 
    총 길이 49바이트의 BSON 문서이고,
 
 
    \x31\x00\x00\x00\x04BSON\x00
    \x26\x00\x00\x00\x020\x00\x08\x00\x00\x00awesome\x00\x01
    1\x00\x33\x33\x33\x33\x33\x33\x14\x40\x102\x00\xc2\x07\x00\x00\x00\x00
 
    데이터는 Array 타입이고,
 
 
    \x31\x00\x00\x00\x04BSON\x00
    \x26\x00\x00\x00\x020\x00\x08\x00\x00\x00awesome\x00\x01
    1\x00\x33\x33\x33\x33\x33\x33\x14\x40\x102\x00\xc2\x07\x00\x00\x00\x00
 
    키 값은 BSON!
 
 
    \x31\x00\x00\x00\x04BSON\x00
    \x26\x00\x00\x00\x020\x00\x08\x00\x00\x00awesome\x00\x01
    1\x00\x33\x33\x33\x33\x33\x33\x14\x40\x102\x00\xc2\x07\x00\x00\x00\x00
 
    BSON에서 Array는 인덱스를 키로 갖는 문서와 동일하게 취급한다.
    따라서, 위의 예제에서의
 
        [ "awesome", 5.05, 1985 ]
 
    는 아래와 같은 도큐먼트라 생각하고 변환하면 된다.
 
        { "0": "awesome", "1": 5.05, "2": 1985 } 
 
    문서의 처음은 Array 데이터의 총 길이인 38바이트를 리틀 엔디안으로 표기한 \x26\x00\x00\x00 이다.
 
 
    \x31\x00\x00\x00\x04BSON\x00
    \x26\x00\x00\x00\x020\x00\x08\x00\x00\x00awesome\x00\x01
    1\x00\x33\x33\x33\x33\x33\x33\x14\x40\x102\x00\xc2\x07\x00\x00\x00\x00
 
    첫 번째 키에 해당하는 데이터의 타입은 string이다.
 
 
    \x31\x00\x00\x00\x04BSON\x00
    \x26\x00\x00\x00\x020\x00\x08\x00\x00\x00awesome\x00\x01
    1\x00\x33\x33\x33\x33\x33\x33\x14\x40\x102\x00\xc2\x07\x00\x00\x00\x00
 
    키 값은 0이고,
 
 
    \x31\x00\x00\x00\x04BSON\x00
    \x26\x00\x00\x00\x020\x00\x08\x00\x00\x00awesome\x00\x01
    1\x00\x33\x33\x33\x33\x33\x33\x14\x40\x102\x00\xc2\x07\x00\x00\x00\x00
 
    데이터의 크기는 종료 문자를 포함해 8바이트이다.
 
 
    \x31\x00\x00\x00\x04BSON\x00
    \x26\x00\x00\x00\x020\x00\x08\x00\x00\x00awesome\x00\x01
    1\x00\x33\x33\x33\x33\x33\x33\x14\x40\x102\x00\xc2\x07\x00\x00\x00\x00
 
    문자열의 값은 awesome
 
 
    \x31\x00\x00\x00\x04BSON\x00
    \x26\x00\x00\x00\x020\x00\x08\x00\x00\x00awesome\x00\x01
    1\x00\x33\x33\x33\x33\x33\x33\x14\x40\x102\x00\xc2\x07\x00\x00\x00\x00
 
    두 번째 데이터는 double 타입의 숫자이고,
 
 
    \x31\x00\x00\x00\x04BSON\x00
    \x26\x00\x00\x00\x020\x00\x08\x00\x00\x00awesome\x00\x01
    1\x00\x33\x33\x33\x33\x33\x33\x14\x40\x102\x00\xc2\x07\x00\x00\x00\x00
 
    키 값은 "1"이다.
 
 
    \x31\x00\x00\x00\x04BSON\x00
    \x26\x00\x00\x00\x020\x00\x08\x00\x00\x00awesome\x00\x01
    1\x00\x33\x33\x33\x33\x33\x33\x14\x40\x102\x00\xc2\x07\x00\x00\x00\x00
 
    BSON에서 double은 IEEE 754의 기준에 따라 8바이트로 표기한다.
    (5.05를 바이너리 데이터로 전환하는 게 잘 되지 않네요.-_- 과정을 아시는 분은 좀 알려주세요~~)
 
 
    \x31\x00\x00\x00\x04BSON\x00
    \x26\x00\x00\x00\x020\x00\x08\x00\x00\x00awesome\x00\x01
    1\x00\x33\x33\x33\x33\x33\x33\x14\x40\x102\x00\xc2\x07\x00\x00\x00\x00
 
    세 번째 데이터는 4바이트 크기의 정수이다.
 
 
    \x31\x00\x00\x00\x04BSON\x00
    \x26\x00\x00\x00\x020\x00\x08\x00\x00\x00awesome\x00\x01
    1\x00\x33\x33\x33\x33\x33\x33\x14\x40\x102\x00\xc2\x07\x00\x00\x00\x00
 
    키 값은 "2"이고,
 
 
    \x31\x00\x00\x00\x04BSON\x00
    \x26\x00\x00\x00\x020\x00\x08\x00\x00\x00awesome\x00\x01
    1\x00\x33\x33\x33\x33\x33\x33\x14\x40\x102\x00\xc2\x07\x00\x00\x00\x00
 
    1986을 4바이트로 표기한다.
 
 
    \x31\x00\x00\x00\x04BSON\x00
    \x26\x00\x00\x00\x020\x00\x08\x00\x00\x00awesome\x00\x01
    1\x00\x33\x33\x33\x33\x33\x33\x14\x40\x102\x00\xc2\x07\x00\x00\x00\x00
 
    Array를 포함한 문서가 종료되었음을 알리고,
 
 
    \x31\x00\x00\x00\x04BSON\x00
    \x26\x00\x00\x00\x020\x00\x08\x00\x00\x00awesome\x00\x01
    1\x00\x33\x33\x33\x33\x33\x33\x14\x40\x102\x00\xc2\x07\x00\x00\x00\x00
 
    전체 데이터가 종료된 것을 알린다.
 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
1195 [ 一日30分 인생승리의 학습법] VBA Web Scraping: How Can VBA Be Used To Scrape Website Data? file 졸리운_곰 2024.04.13 3
1194 [ 一日30分 인생승리의 학습법] 윈도우 실행파일 구조(PE파일) file 졸리운_곰 2024.03.31 3
1193 [ 一日30分 인생승리의 학습법] [Analysis] PE(Portable Executable) 파일 포맷 공부 file 졸리운_곰 2024.03.31 3
1192 [ 一日30分 인생승리의 학습법] 성공하는 메타버스의 3가지 조건 file 졸리운_곰 2024.03.30 7
1191 [ 一日30分 인생승리의 학습법] REST, REST API, RESTful 과 HATEOAS file 졸리운_곰 2024.03.10 9
1190 [ 一日30分 인생승리의 학습법] 렌더링 삼형제 CSR, SSR, SSG 이해하기 file 졸리운_곰 2024.03.10 2
1189 [ 一日30分 인생승리의 학습법] 엑셀 VBA에서 셀레니움 사용을 위한 Selenium Basic 설치 file 졸리운_곰 2024.02.23 11
1188 [ 一日30分 인생승리의 학습법]500 Lines or Less Blockcode: A Visual Programming Toolkit : 500줄 이하의 블록코드: 시각적 프로그래밍 툴킷 졸리운_곰 2024.02.12 4
1187 [ 一日30分 인생승리의 학습법] 구글 클라이언트(앱) 아이디를 발급받으려면 어떻게 해야 하나요? 졸리운_곰 2024.01.28 3
1186 [ 一日30分 인생승리의 학습법] 빅뱅 프로젝트를 성공적으로 오픈하기 위한 팁 졸리운_곰 2023.12.27 16
1185 [ 一日30分 인생승리의 학습법]“빅뱅 전환보다 단계적 전환 방식이 이상적 애자일팀과 협업 쉽게 체질 개선을” file 졸리운_곰 2023.12.27 12
1184 [ 一日30分 인생승리의 학습법] Big-bang / phased 접근 file 졸리운_곰 2023.12.27 3
1183 [ 一日30分 인생승리의 학습법] CodeDragon 메뉴 데이터 전환의 개념 이해 - 데이터 전환의 개념, 데이터 전환방식, 데이터 전환방식 및 장단점 비교, 데이터전환 이후 검토해야 할 사항 졸리운_곰 2023.12.27 5
1182 [ 一日30分 인생승리의 학습법] 블록체인과 IPFS를 이용한 안전한 데이터 공유 플랫폼 - 분쟁 해결 시스템 file 졸리운_곰 2023.12.27 6
1181 [ 一日30分 인생승리의 학습법] 블록체인과 IPFS를 이용한 안전한 데이터 공유 플랫폼 - 개념과 리뷰 시스템 file 졸리운_곰 2023.12.27 4
1180 [ 一日30分 인생승리의 학습법] 소켓 CLOSE_WAIT 발생 현상 및 처리 방안 file 졸리운_곰 2023.12.03 7
1179 [ 一日30分 인생승리의 학습법] robots 설정하기 졸리운_곰 2023.12.03 3
1178 [ 一日30分 인생승리의 학습법] A Tutorial and Elementary Trajectory Model for the Differential Steering System of Robot Wheel Actuators : 로봇 휠 액츄에이터의 차동 조향 시스템에 대한 튜토리얼 및 기본 궤적 모델 file 졸리운_곰 2023.11.29 6
1177 [ 一日30分 인생승리의 학습법] Streamline Your MLOps Journey with CodeProject.AI Server : CodeProject.AI 서버로 MLOps 여정을 간소화하세요 file 졸리운_곰 2023.11.25 2
1176 [ 一日30分 인생승리의 학습법] Comparing Self-Hosted AI Servers: A Guide for Developers / : 자체 호스팅 AI 서버 비교: 개발자를 위한 가이드 file 졸리운_곰 2023.11.25 10
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED