MongoDB의 BSON에 대해 아시나요?

윤학·2023년 4월 1일
0

MongoDB

목록 보기
1/4
post-thumbnail

MongoDB를 Nest에서 사용해보면서 MongoDB는 내부적으로 BSON형식으로 데이터를 저장하는데 어떻게 우린 신경쓰지 않고 JSON형식으로 데이터를 다룰 수 있는지 간단하게 정리해보고자 한다.

BSON? JSON?

우리가 MongoDB Shell 혹은 애플리케이션에서 코드로 MongoDB 데이터베이스에 작업을 할 때 데이터를 보면 JSON 구조이다.

하지만 MongoDB는 하나의 레코드인 documentBSON형식으로 저장하고 가져오는데...

일단 BSON이 뭘까?

{"hello": "world"} →
\x16\x00\x00\x00           // total document size
\x02                       // 0x02 = type String
hello\x00                  // field name
\x06\x00\x00\x00world\x00  // field value
\x00                       // 0x00 = type EOO ('end of object')

"Binary JSON"의 약자로 바이너리 타입의 JSON 형식을 말하고 BSON은 기계어로 변환되기 때문에 사람이 읽기 위해선 다시 디코딩 과정을 거쳐야 한다.

JSON에서 지원하지 않는 날짜나 바이너리 타입등을 추가적으로 지원하며 MongoDB의 ObjectID 타입 역시 포함된다.

또한 BSON의 구조가 위와 같이 타입이나 길이 정보를 인코딩해 추가하여 저장하기 때문에 JSON에 비해 빠르게 탐색할 수 있다고 한다.

그럼 저장할 때 직접 BSON 형식으로 변환해줘야 하나요?

아니다. 저장할 때나 불러온 결과는 항상 JSON 형식을 띄고 있는데 왜 그런지를 알려면 Driver라는 놈을 알아야 한다.

MongoDB에서는 각 언어마다 Driver가 존재하고 이 친구의 역할은 우리가 각자에 맞는 언어로 작성한 애플리케이션과 MongoDB간 상호작용 할 수 있게 해주는 것이다.

위의 그림은 사용자로부터 MongoDB의 데이터베이스에 접근하기까지 흐름을 나타낸 그림으로 다음 상황을 가정해보자.

  1. Node로 작성된 서버에 document 조회 요청이 사용자로부터 왔다.

  2. 그럼 난 Node Driver가 제공하는 방법을 통해 조회 코드를 작성한다.

  3. 해당 조회 쿼리를 MongoDB가 알아들을 수 있도록 Driver가 전달하면서 데이터도 BSON 형식으로 직렬화 시킨다.

  4. BSON 형식으로 이루어진 데이터들 중 일치하는 데이터를 찾아 반환한다.

  5. Driver는 BSON 형식으로 된 데이터를 우리가 읽을 수 있는 JSON 형식으로 변환해준다.

이런 Driver의 역할 때문에 우리는 MongoDB에 대해서 BSON이 뭔지 신경쓰지 않고 데이터를 JSON 형식으로 사용할 수 있었던 것이고

MongoDB와 내 서버간 통신을 할 때도 바이너리 형태로 주고 받을 수 있어 데이터 교환시 성능이나 크기면에서 우수했던 것이다.

하지만! 하나의 BSON document가 너무 많은 메모리와 대역폭을 사용하지 않도록 크기를 16MB로 제한하고 있다.

그럼에도 큰 데이터를 하나의 document에 저장하고 싶다면 파일을 부분별로 별도의 document로 저장할 수 있는 GridFS를 참고하면 될 것같다.

참고

JSON and BSON
이미지 출처 https://www.geeksforgeeks.org/how-mongodb-works/

profile
해결한 문제는 그때 기록하자

0개의 댓글