들어가기 전
JSONB는 PostgreSQL 데이터베이스에서 JSON 데이터를 저장하는 방식입니다. 이 형식은 PostgreSQL과 MySQL에서 JSON 데이터를 처리하는 방식에서 몇 가지 중요한 차이점을 가지고 있으며, 각각의 장단점이 있습니다. 처음 PostgreSQL을 사용하며 JSONB를 접했을 때, 이 낯선 타입을 단순히 JSON과 같다고 생각하고 별다른 고민 없이 사용했습니다. 하지만 사용 중 문제가 발생하면서, 확인했던 내용들을 정리해보았습니다.
JSON
JSON 포맷은 텍스트 기반의 경량 데이터 교환 포맷입니다. 여담이지만 10년전 쯤 제가 처음 개발을 시작할 때는 SOAP나 XML 같은 데이터 포맷도 종종 볼 수 있었는데, 현재는 JSON이 보편화되었습니다.
데이터베이스에서의 JSON
여러 데이터베이스에서 JSON 타입을 도입했습니다. 이는 위에서 언급한 것처럼 JSON 포맷이 보편화되었고, JSON 데이터를 직접 저장하고 처리할 수 있는 기능에 대한 수요가 커졌기 때문입니다.
MySQL에서의 JSON 타입: MySQL은 JSON 데이터를 텍스트 형식으로 저장합니다. 이는 데이터가 원본 형태로 저장되어, 저장된 문서의 정확한 복제본을 얻을 수 있다는 장점이 있습니다. 하지만 JSON 내부 값에 대한 조회 시 처리 속도가 JSONB보다 느릴 수 있습니다. 텍스트이기 때문에 사용할 때마다 매번 파싱해야 합니다.
PostgreSQL에서의 JSON: PostgreSQL은 버전 9.4부터 JSON 타입을 추가하였습니다. PostgreSQL은 JSON을 텍스트로 저장하는 대신 데이터를 이진 형식으로 저장하여 공간을 효율적으로 사용하고 검색 및 처리 속도를 향상시킵니다.
- 비교 테이블
JSON | JSONB | |
---|---|---|
Storage | Preserves the format | Changes it to binary format |
Parsing time | Less | More |
Reparsing required | No | Yes |
Indexing | Doesn't support directly | Supported |
Data processing | Slow | Fast |
Whitespaces | Preserves whitespaces | Removes whitespaces |
Ordering of keys | Preserved | Ordered by keys |
Duplicates | Preserved | Not allowed (Last assigned value will be stored in the key) |
장점은 JSONB 데이터에 대한 인덱스 생성이 가능해 대규모 데이터셋에서 검색 속도가 빨라집니다. 또한, 데이터를 내부적으로 최적화하여 공간 효율성이 더욱 좋아질 수 있습니다.
단점으로는 JSONB가 데이터 저장 시 내부 변환 과정을 거쳐 약간의 오버헤드가 발생할 수 있습니다. 또한, 데이터가 약간 변형되어 저장되어 원본 문서와 정확히 일치하지 않을 수 있습니다.
JSONB에서의 데이터 비교
MySQL의 JSON과 달리, JSONB는 파싱된 후 저장되므로 원본 데이터와 비교 시 JSONB로 변환해야 합니다.
SELECT *
FROM table_name
WHERE jsonb_column_name = 'JSON_string_value'::jsonb;
저장된 값과 동일한지 확인하려면 위와 같이 ::jsonb
로 타입 변환 후 비교해야 합니다.
JSONB 쿼리와 관련된 더 많은 가이드는 아래 링크에서 확인할 수 있습니다. Querying JSON (JSONB) data types in PostgreSQL
이와 같이 데이터베이스에서 JSON 타입을 다루는 방법을 알면, 작동 방식과 성능적 차이를 예측할 수 있습니다.