CodeGym /행동 /SQL SELF /JSON이랑 JSONB 비교: 각각의 장점과 단점

JSON이랑 JSONB 비교: 각각의 장점과 단점

SQL SELF
레벨 33, 레슨 1
사용 가능

JSON이랑 JSONB의 핵심 차이점 중 하나는 데이터 저장 포맷이야. JSON은 데이터를 텍스트로 저장하고, JSONB는 바이너리로 저장해. 이게 무슨 뜻이냐면:

  • JSON은 네가 넘긴 데이터를 그대로 저장해. 예를 들어, {"title": "PostgreSQL", "tags": ["database", "SQL"]} 이런 문자열을 넣으면, 그대로 저장돼.
  • JSONB는 먼저 JSON 오브젝트를 파싱하고, 쓸데없는 공백을 지우고, 키를 정렬하고, 구조를 최적화한 다음에 바이너리 포맷으로 저장해.

이런 최적화 덕분에 JSONB는 복잡한 필터, 검색, 정렬 쿼리에서 훨씬 빠르게 동작해.

읽기/쓰기 성능

JSON이랑 JSONB는 데이터 읽기/쓰기 속도에서 차이가 있어:

  • JSON은 저장할 때 파싱이 필요 없어서 더 빨리 저장돼. 하지만 읽거나 처리할 때는 PostgreSQL이 쿼리 실행 시마다 다시 파싱해야 해서 느려.
  • JSONB는 저장 전에 데이터 처리가 필요해서 쓰기가 좀 느려. 하지만 읽기, 필터, 값 추출은 훨씬 빨라서, 분석이나 검색 작업에 더 좋아.

예시로 보면 더 이해하기 쉬워:

-- JSON이랑 JSONB 테이블 만들기
CREATE TABLE json_example (data JSON);
CREATE TABLE jsonb_example (data JSONB);

-- 데이터 넣기
INSERT INTO json_example VALUES ('{"key": "value", "tags": ["json", "example"]}');
INSERT INTO jsonb_example VALUES ('{"key": "value", "tags": ["jsonb", "example"]}');

-- 데이터 필터링
SELECT * FROM json_example WHERE data->'key' = '"value"';  -- 더 느림
SELECT * FROM jsonb_example WHERE data->'key' = '"value"'; -- 더 빠름

데이터 인덱싱

JSONB의 가장 큰 장점 중 하나는 인덱싱 지원이야. PostgreSQL은 JSONB 컬럼에 GIN 타입 인덱스를 만들 수 있어서, 검색이나 필터링이 엄청 빨라져.

인덱스 만드는 예시:

-- JSONB 컬럼에 인덱스 만들기
CREATE INDEX idx_jsonb_tags ON jsonb_example USING gin (data->'tags');

반면에 JSON은 인덱싱을 지원하지 않아서, 복잡한 검색이나 필터 작업에는 별로야.

JSON을 언제 쓰고, JSONB를 언제 써야 할까?

JSON은 이런 상황에 좋아:

  • 데이터를 원본 그대로, 아무 변화 없이 저장해야 할 때.
  • JSON 데이터로 필터, 검색, 정렬 쿼리를 자주 안 할 때.
  • JSON 데이터를 다른 시스템이나 클라이언트에 그대로 전달해야 할 때 (예: API로 프론트엔드에 넘길 때).

예시:

-- 분석 없이 JSON 저장하기
CREATE TABLE api_responses (
    id SERIAL PRIMARY KEY,
    response JSON
);

-- API에서 받은 데이터를 그대로 저장
INSERT INTO api_responses (response)
VALUES ('{"status": "success", "payload": {"id": 123, "name": "John"}}');

JSONB는 이런 경우에 추천해:

  • JSON 내부 값으로 필터, 검색, 그룹화, 정렬을 자주 할 때.
  • 데이터 접근 속도가 저장 속도보다 더 중요할 때.
  • JSON 데이터에 인덱싱을 써서 쿼리 성능을 높이고 싶을 때.

예시:

-- 분석이나 중첩 오브젝트 작업을 위한 JSONB 저장
CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    details JSONB
);

-- 데이터 넣기
INSERT INTO products (details)
VALUES ('{"name": "Laptop", "price": 1200, "tags": ["electronics", "computers"]}');

-- "electronics" 태그가 있는 상품 찾기
SELECT * FROM products
WHERE details @> '{"tags": ["electronics"]}';

@>랑 --> 연산자에 대해서는 다음 강의에서 더 자세히 알려줄게 :P

JSON이랑 JSONB 다루기 예시

JSON 컬럼이랑 JSONB 컬럼이 있는 테이블 두 개 만들어보자:

CREATE TABLE json_table (
    id SERIAL PRIMARY KEY,
    data JSON
);

CREATE TABLE jsonb_table (
    id SERIAL PRIMARY KEY,
    data JSONB
);

두 테이블 모두 데이터 넣는 방법은 똑같아:

INSERT INTO json_table (data)
VALUES ('{"key": "value", "tags": ["json", "example"]}');

INSERT INTO jsonb_table (data)
VALUES ('{"key": "value", "tags": ["jsonb", "example"]}');

이제 key가 value인 데이터만 뽑아보자:

-- JSON용
SELECT * FROM json_table
WHERE data->>'key' = 'value';

-- JSONB용
SELECT * FROM jsonb_table
WHERE data->>'key' = 'value';

데이터가 적을 때는 성능 차이가 거의 없어. 하지만 수백만 행을 다룰 때는 JSONB가 훨씬 좋은 성능을 보여주고, 인덱스를 만들면 더 빨라져:

CREATE INDEX idx_jsonb_key ON jsonb_table USING gin ((data->>'key'));

중첩 오브젝트나 배열 다루기도 JSONB가 더 효율적이야:

-- 배열에서 값 뽑기
SELECT data->'tags'->>0 AS first_tag 
FROM jsonb_table;

장점과 단점 정리

특징 JSON JSONB
데이터 저장 원본 텍스트 포맷으로 저장 키를 정렬해서 바이너리 포맷으로 저장
쓰기 성능 그대로 저장하니까 더 빠름 저장 전에 파싱해서 더 느림
읽기 성능 쿼리할 때 파싱해야 해서 더 느림 이미 최적화돼 있어서 더 빠름
인덱싱 지원 안 함 지원함 (GIN, BTREE 인덱스)
필터링 느림 빠름
연산 지원 제한적임 확장됨

JSON이랑 JSONB 중 뭘 쓸지는 네가 뭘 하려는지에 따라 달라. 그냥 텍스트로 원본 데이터를 저장만 하면 JSON 써도 돼. 근데 컬럼 안의 데이터로 필터, 검색, 그룹화 같은 작업을 자주 한다면 JSONB가 훨씬 빠르고 편해.

복잡한 앱에서 JSON 데이터가 단순 저장소가 아니라 분석에도 많이 쓰인다면 JSONB는 필수야. 고민된다면 그냥 JSONB 쓰는 게 좋아. 언젠가 네 인생에서 가장 빠른 쿼리를 만들 때, JSONB가 고마웠다고 할지도 몰라!

2
과제
SQL SELF, 레벨 33, 레슨 1
잠금
JSON 및 JSONB에서 데이터 삽입과 추출
JSON 및 JSONB에서 데이터 삽입과 추출
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION