JSON은 여러 애플리케이션과 기술 스택에서 널리 사용되는 데이터 교환 형식입니다. JSON의 바이너리 표현인 BSON은 주로 효율적인 저장 및 데이터 탐색을 위해 MongoDB에서 내부적으로 사용됩니다.
목차
JSON(JavaScript Object Notation)은 사람이 읽을 수 있는 데이터 교환 형식으로, 2000년대 초반에 도입되었습니다. JSON은 JavaScript 프로그래밍 언어 표준의 하위 집합을 기반으로 하지만 완전히 언어에 구애받지 않습니다.
JSON objects는 string 키가 value(숫자, string, 불리언, 배열, 빈 값(null), 또는 다른 객체일 수 있음)에 매핑되는 연관 컨테이너입니다. JavaScript의 객체, Python의 딕셔너리, Java 및 C #의 해시 테이블, C++의 연관 배열 등 거의 모든 프로그래밍 언어가 이러한 추상 데이터 구조를 지원합니다.
JSON 객체는 사람이 읽을 수 있는 형식으로 구성되어 있으며 애플리케이션에서도 쉽게 읽을 수 있습니다.
{
"_id": 1,
"name": { "first" : "John", "last" : "Backus" },
"contribs": [ "Fortran", "ALGOL", "Backus-Naur Form", "FP" ],
"awards": [
{
"award": "W.W. McDowell Award",
"year": 1967,
"by": "IEEE Computer Society"
}, {
"award": "Draper Prize",
"year": 1993,
"by": "National Academy of Engineering"
}
]
}
JSON 파일은 쉼표로 구분된 키-값 쌍으로 구성되며 키와 값 쌍은 콜론(:)을 사용하여 표시됩니다. JSON 객체(문서)는 중괄호로 시작하여 중괄호로 끝납니다. 지원되는 어떤 데이터 유형도 사용할 수 있습니다. 위의 예시에서는 string(큰따옴표), 숫자, 배열(대괄호 내부)을 보여 줍니다.
JavaScript가 웹 개발을 위한 주요 언어가 되면서 JSON은 독자적인 생명력을 갖기 시작했습니다. JSON은 사람과 기계가 모두 읽을 수 있고 다른 언어로 지원을 구현하기가 비교적 간단하다는 점에서 웹 페이지를 넘어 모든 소프트웨어로 빠르게 확산되었습니다.
오늘날 JSON은 다양한 경우에 나타납니다.
MongoDB는 처음부터 뛰어난 개발 경험을 제공하는 데 중점을 둔 데이터베이스로 설계되었습니다. JSON이 가진 보편성 덕분에 MongoDB의 문서 데이터 모델에서 데이터 구조를 표현하는 데 있어 확실한 선택지가 되었습니다.
MEAN과 MERN과 같은 기술 스택을 사용하면 애플리케이션을 더 손쉽게 구축할 수 있습니다. 개발자는 처음부터 끝까지 단일 프로그래밍 언어(JavaScript)를 사용할 수 있기 때문입니다.
그러나 JSON의 몇 가지 문제점으로 인해 데이터베이스 내부에서 사용하기에 바람직하지 않은 경우가 발생하기도 합니다.
JSON은 제한된 수의 기본 데이터 유형만 지원합니다. 특히 JSON은 날짜/시간 및 바이너리 데이터에 대한 지원이 부족합니다.
JSON 객체와 속성은 고정된 길이가 아니기 때문에 탐색 속도가 느립니다.
JSON은 메타데이터와 유형 정보를 제공하지 않으므로 문서를 조회하는 데 시간이 더 오래 걸립니다.
MongoDB가 JSON을 우선시하면서도 여전히 고성능의 범용성을 갖도록 하려는 목적에서, BSON은 그 격차를 메우도록 개발되었습니다. BSON은 속도, 공간, 효율성에 최적화된 데이터를 JSON 문서로 저장하는 바이너리 표현을 말합니다. 접근 방식 측면에서 프로토콜 버퍼 또는 Thrift와 같은 다른 바이너리 교환 형식과 다르지 않습니다.
BSON은 'Binary JSON(바이너리 JSON)' 의 약자로, 이러한 이름에서 개발 목적을 읽을 수 있습니다. BSON 파일은 해당 JSON 파일의 바이너리 표현입니다. BSON의 바이너리 인코딩 직렬화 형식은 유형 및 길이 정보도 인코딩하므로 JSON에 비해 훨씬 빠르게 탐색이 가능합니다.
BSON은 날짜 및 바이너리 데이터와 같은 몇 가지 추가 데이터 유형(JSON 네이티브가 아님)을 추가하는데, 이러한 유형이 없었다면 MongoDB는 중요한 지원을 받지 못했을 것입니다.
다음은 JSON 객체와 해당 바이너리 JSON 표현의 몇 가지 예시입니다.
{"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')
{"BSON": ["awesome", 5.05, 1986]} →
\x31\x00\x00\x00
\x04BSON\x00
\x26\x00\x00\x00
\x02\x30\x00\x08\x00\x00\x00awesome\x00
\x01\x31\x00\x33\x33\x33\x33\x33\x33\x14\x40
\x10\x32\x00\xc2\x07\x00\x00
\x00
\x00
BSON 문법은 BSON 사양에서 자세히 알아보세요.
MongoDB는 내부적으로, 그리고 네트워크를 통해 BSON 형식으로 데이터를 저장합니다. JSON으로 표현할 수 있는 모든 것은 기본적으로 MongoDB에 저장할 수 있으며, JSON으로도 쉽게 조회할 수 있습니다.
자주 사용하는 프로그래밍 언어에 MongoDB 드라이버를 사용하는 경우 해당 언어의 네이티브 데이터 구조를 사용합니다. 애플리케이션에서는 네이티브 데이터 구조(예: JavaScript 객체, POJO)를 JSON으로 변환해야 합니다. MongoDB 드라이버는 데이터베이스를 쿼리할 때 데이터를 JSON에서 BSON으로, BSON에서 JSON으로 변환합니다.
JSON을 문자열로 인코딩된 값이나 바이너리로 인코딩된 BLOB으로 저장하는 시스템과 달리, MongoDB는 BSON을 사용해 웹에서 가장 널리 사용되는 데이터 형식 위에 강력한 인덱싱 및 쿼리 기능을 제공합니다.
예를 들어 MongoDB를 사용하면 개발자가 JSON/BSON 문서 내의 특정 키를 사용하여 객체를 쿼리하고 조작할 수 있습니다. 심지어 레코드 깊숙이 있는 여러 계층의 중첩 문서에서도 가능합니다. 또 동일한 키와 값에 고성능 인덱스를 생성할 수도 있습니다.
첫째, BSON 파일에는 기본적으로 순수 JSON으로 표현할 수 없는 날짜/시간 또는 바이너리 객체가 포함될 수 있습니다.
둘째, 각 프로그래밍 언어에는 고유한 객체 시맨틱이 있습니다. 예를 들어 JSON 객체는 키가 정렬되어 있는 반면, Python 딕셔너리(JavaScript 객체와 유사한 네이티브 데이터 구조)는 키가 정렬되어 있지 않으며, 숫자 데이터 유형과 string 데이터 유형 간의 차이도 나타날 수 있습니다. 셋째, BSON은 JSON에 내장되지 않은 다양한 숫자 유형을 지원하며, 많은 언어가 이를 다르게 표현합니다.
EJSON 또는 확장 JSON은 MongoDB에서 BSON 값을 표현하는 JSON 호환 방식입니다. JSON은 BSON이 지원하는 유형의 하위 집합만 지원하므로, MongoDB는 JSON 형식에 표준 모드와 완화 모드라는 특정 확장 기능을 추가합니다. MongoDB는 EJSON을 위한 serialize, deserialize, parse, stringify와 같은 메서드를 제공합니다.
애플리케이션이 shell, API 또는 MongoDB Atlas를 사용하여 MongoDB에 데이터를 쓰거나 업데이트하면 해당 데이터는 MongoDB 드라이버에 의해 BSON 형식으로 구문 분석됩니다. 구문 분석에는 JavaScript 객체 또는 JSON 구조를 식별 및 해석하고, 각 필드를 올바른 BSON 데이터 유형에 매핑하고, 값을 변환하는 작업이 포함됩니다. 애플리케이션이 MongoDB에서 데이터를 요청하면 드라이버는 서버를 통해 데이터를 전송하기 전에 데이터를 JSON string으로 변환합니다.
드라이버 문서를 통해 자신의 언어로 MongoDB BSON 지원 데이터에 가장 잘 액세스하는 방법을 이해했는지 확인하세요.
JSON | BSON | |
---|---|---|
Encoding | UTF-8 string | Binary |
Data Support | String, boolean, number, array, object, null | String, boolean, number (integer, float, long, decimal128...), array, null, date, BinData |
Readability | Human and machine | Machine only |
JSON과 BSON은 설계상 실제로 가까운 사촌입니다. BSON은 JSON 데이터의 바이너리 표현으로 설계되어, 광범위한 애플리케이션을 위한 특정 확장 기능을 갖추고 있으며 데이터 저장 및 탐색에 최적화되어 있습니다. JSON과 마찬가지로 BSON은 객체와 배열의 내장을 지원합니다.
BSON이 JSON과 다른 한 가지 특별한 점은 몇 가지 고급 데이터 유형을 지원한다는 점입니다. 예를 들어 JSON은 정수(어림수)와 부동소수점 숫자(소수점 이하 정밀도가 다양한 숫자)를 구분하지 않습니다.
대부분의 서버 측 프로그래밍 언어에는 보다 정교한 숫자 유형(표준에는 정수, 정규 정밀도 부동 소수점 숫자(일명 float), 배정밀도 부동 소수점(일명 double), 불리언 값이 포함됨)이 있으며, 각 값에는 효율적인 수학 연산을 위한 최적의 사용법이 있습니다.
JSON 및 BSON 데이터 모델이 있는 데이터베이스를 사용하는 개발자에게 가장 큰 매력 중 하나는 관계형 데이터베이스에서 사용하는 엄격한 테이블 형식의 데이터 모델과 비교했을 때 이 모델이 제공하는 동적이고 유연한 스키마입니다.
첫째, MongoDB 문서는 다형성으로, 필드가 단일 컬렉션 내에서 문서마다 다를 수 있습니다(관계형 데이터베이스의 테이블과 유사). 이러한 유연성 덕분에 어떤 구조의 데이터라도 모델링하고 요구 사항이 변경되면 모델을 조정하기가 더 쉬워졌습니다.
둘째, 문서 구조를 데이터베이스에 선언할 필요가 없습니다. 문서 자체가 자체적으로 설명되기 때문입니다. 개발자는 코드 작성을 시작하고 객체가 생성되는 동안 객체를 보존할 수 있습니다.
셋째, 문서에 새 필드를 추가해야 하는 경우 컬렉션의 다른 모든 문서에 영향을 주지 않고, 중앙 시스템 카탈로그를 업데이트하지 않고, 데이터베이스를 오프라인으로 전환하지 않고도 필드를 만들 수 있습니다. 데이터 모델을 변경해야 하는 경우 문서 데이터베이스는 값비싼 ALTER TABLE 작업을 수행할 필요 없이, 더 심하게는 스키마를 처음부터 다시 설계할 필요 없이, 업데이트된 객체를 계속 저장합니다.
이러한 이점을 통해 문서 데이터 모델의 유연성은 최신 애플리케이션 개발 관행의 요구 사항에 매우 적합합니다.
유연한 스키마는 강력한 기능이기는 하나, 문서의 데이터 구조와 내용을 더 잘 제어해야 하는 경우가 있습니다. 대부분의 문서 데이터베이스는 이러한 제어를 시행하는 책임을 개발자에게 다시 맡겨 애플리케이션 코드에서 구현하도록 합니다. 그러나 고급 문서 데이터베이스는 MongoDB에서 채택한 IETF JSON Schema 표준과 같은 접근 방식을 사용하여 스키마 유효성 검사를 제공합니다. 지금 MongoDB Atlas 온라인에서 사용해 보세요!
온라인 JSON 도구를 사용하여 BSON과 JSON 사이를 변환할 수 있습니다. MongoDB는 BSON을 JSON으로 변환하는 bsondump 도구도 제공합니다.
BSON은 JSON에 비해 다음과 같은 이점을 제공합니다.
BSON은 날짜, 시간, 바이너리 데이터와 같은 더 많은 데이터 유형을 지원합니다.
BSON의 바이너리 구조는 더 빠른 탐색과 데이터 검색을 가능하게 합니다.
BSON은 길이 및 유형 정보와 같은 추가 메타데이터를 제공하므로 검색 속도가 빨라집니다.
BSON은 JSON 데이터의 바이너리 인코딩 직렬화입니다. JSON string은 사람이 읽을 수 있는 반면, BSON은 구문 분석이 필요합니다. BSON은 더 많은 데이터 유형을 가지고 있고, 가볍고 탐색 가능하며, 데이터를 보다 효율적으로 저장하는 추가적인 이점을 제공합니다. 또한 다양한 프로그래밍 언어를 사용한 코딩 및 디코딩에도 효율적입니다.