PostgreSQL의 JSONB 타입이란
- PostgreSQL JSON과 JSONB 차이를 성능·인덱싱·운영 관점에서 명확히 정리했습니다.
- 문서 저장 방식을 결정할 때 어떤 선택이 유리한지, 근거 있는 기준을 빠르게 세울 수 있습니다.
들어가기 전
JSONB는 PostgreSQL 데이터베이스에서 JSON 데이터를 저장하는 방식입니다. PostgreSQL에는 json과 jsonb 두 타입이 모두 존재하며, 같은 JSON 문서를 저장하더라도 저장 방식과 성능 특성이 다릅니다. 처음 PostgreSQL을 사용하며 JSONB를 접했을 때, 이 낯선 타입을 단순히 JSON과 같다고 생각하고 별다른 고민 없이 사용했습니다. 하지만 사용 중 문제가 발생하면서, 확인했던 내용들을 정리해보았습니다.
JSON
JSON 포맷은 텍스트 기반의 경량 데이터 교환 포맷입니다. 여담이지만 10년 전쯤 제가 처음 개발을 시작할 때는 SOAP나 XML 같은 데이터 포맷도 종종 볼 수 있었는데, 현재는 JSON이 보편화되었습니다.
데이터베이스에서의 JSON
여러 데이터베이스에서 JSON 타입을 도입했습니다. 이는 위에서 언급한 것처럼 JSON 포맷이 보편화되었고, JSON 데이터를 직접 저장하고 처리할 수 있는 기능에 대한 수요가 커졌기 때문입니다.
MySQL에서의 JSON 타입: MySQL도 JSON 전용 타입을 제공하지만, PostgreSQL의 json/jsonb와는 구현 방식과 연산자 생태계가 다릅니다. 이 글에서는 PostgreSQL 내부의 json과 jsonb 차이에 집중합니다.
PostgreSQL에서의 JSON / JSONB: PostgreSQL은 9.2에서 json 타입을, 9.4에서 jsonb 타입을 추가했습니다. json은 입력한 텍스트를 거의 그대로 보존하고, jsonb는 파싱된 이진 표현으로 저장합니다.
- 비교 테이블
| JSON | JSONB | |
|---|---|---|
| Storage | Preserves the original text | Stores a parsed binary representation |
| Input cost | Lower | Higher |
| Reparsing required | Yes, many operations need reparsing | No, it is already decomposed for processing |
| Indexing | Doesn't support general GIN indexing | Supported |
| Data processing | Slower for queries/operators | Faster for most queries/operators |
| Whitespaces | Preserves whitespaces and key order | Removes insignificant whitespace and does not preserve order |
| Duplicates | Preserved in the original text | Duplicate keys collapse to the last value |
장점은 JSONB 데이터에 대한 인덱스 생성이 가능해 대규모 데이터셋에서 검색 속도가 빨라진다는 점입니다. 또한, 연산자와 함수 사용 시 이미 파싱된 형태라 처리 비용이 줄어드는 경우가 많습니다.
단점으로는 JSONB가 데이터 저장 시 내부 변환 과정을 거쳐 입력 비용이 더 들 수 있다는 점입니다. 또한, 공백과 키 순서가 보존되지 않아 원본 문서와 완전히 동일한 텍스트를 그대로 돌려받는 용도에는 맞지 않을 수 있습니다.
JSONB에서의 데이터 비교
jsonb 컬럼은 문자열이 아니라 jsonb 값으로 비교하는 것이 일반적입니다. 따라서 문자열 리터럴과 직접 비교할 때는 ::jsonb로 타입 변환이 필요합니다.
SELECT *
FROM table_name
WHERE jsonb_column_name = 'JSON_string_value'::jsonb;저장된 값과 동일한지 확인하려면 위와 같이 ::jsonb로 타입 변환 후 비교해야 합니다.
JSONB 쿼리와 관련된 더 많은 가이드는 PostgreSQL 공식 문서와 아래 링크에서 확인할 수 있습니다.
이와 같이 데이터베이스에서 JSON 타입을 다루는 방법을 알면, 작동 방식과 성능적 차이를 예측할 수 있습니다.


