Skip to content
Kendrick's Website Kendrick's GitHub Kendrick's Youtube Kendrick's Travel blog

PostgreSQL의 JSONB 타입이란

5 min read
Cover

들어가기 전

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을 텍스트로 저장하는 대신 데이터를 이진 형식으로 저장하여 공간을 효율적으로 사용하고 검색 및 처리 속도를 향상시킵니다.

  • 비교 테이블
JSONJSONB
StoragePreserves the formatChanges it to binary format
Parsing timeLessMore
Reparsing requiredNoYes
IndexingDoesn't support directlySupported
Data processingSlowFast
WhitespacesPreserves whitespacesRemoves whitespaces
Ordering of keysPreservedOrdered by keys
DuplicatesPreservedNot 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 타입을 다루는 방법을 알면, 작동 방식과 성능적 차이를 예측할 수 있습니다.