티스토리 뷰

반응형

최근 데이터 처리 환경에서는 정형 데이터뿐 아니라 반정형 데이터도 점점 더 중요해지고 있습니다. 특히 API 응답, 로그 데이터, Config 정보 등은 JSON(JavaScript Object Notation) 형태로 제공되는 경우가 많습니다.

 

PostgreSQL은 이러한 요구를 충족하기 위해 JSON JSONB 데이터형을 공식 지원합니다. 이를 통해 관계형 데이터베이스 내에서도 반정형 데이터를 효율적으로 다룰 수 있으며, 다양한 연산자와 함수를 활용할 수 있습니다. 이번 글에서는 PostgreSQL에서 JSON을 활용하는 방법을 정리해보겠습니다.

 

1. JSON과 JSONB의 차이

PostgreSQL은 JSON JSONB 두 가지 타입을 제공합니다.

구분 JSON JSONB
저장 방식 원본 텍스트 그대로 저장 이진(Binary) 포맷으로 저장
보존 특성 공백·키 순서·중복 키 그대로 유지 공백 제거, 키 정렬, 중복 키 제거
성능 저장은 빠름 / 조회는 느림 저장은 다소 느림 / 조회는 빠름
인덱스 지원 불가 GIN 인덱스 가능
실무에서는 jsonb 사용이 권장됩니다. 인덱스와 검색 성능 측면에서 훨씬 유리하기 때문입니다.

 

 

2. JSON 데이터형

2.1 특징

  • 입력된 JSON 텍스트를 원본 그대로 저장
  • 공백, 키 순서, 중복 키 등도 그대로 보존
  • 저장은 빠르지만, 조회 시 매번 파싱이 필요해 성능이 떨어질 수 있음
  • 인덱스 지원 X
따라서 JSON은 "원본 보존"이 필요한 경우에 적합합니다.

 

2.2 기본 활용 예제

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

INSERT INTO employees_json (data) VALUES
('{"name": "Alice", "department": "IT"}'),
('{"name": "Bob", "department": "Finance"}');

-- 키 값 조회
SELECT 
    data->>'name' AS name,
    data->>'department' AS dept
FROM employees_json;

 

3. JSONB 데이터형

3.1 특징

  • 입력된 JSON을 내부적으로 이진(Binary) 포맷으로 저장
  • 저장 시 공백 제거, 키 정렬, 중복 키 제거(마지막 키만 유지)
  • 조회 시 빠르고, 다양한 연산자 및 인덱스 지원
  • 실무에서 기본 선택으로 권장

3.2 데이터 저장

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

INSERT INTO employees_jsonb (data) VALUES
('{"name": "Alice", "department": "IT", "skills": ["SQL", "Python"]}'),
('{"name": "Bob", "department": "Finance", "skills": ["Excel", "R"]}');

3.3 조회 및 조건 검색

-- 키 값 추출
SELECT data->>'name' AS name, data->>'department' AS dept
FROM employees_jsonb;

-- 조건 검색 (@> 포함 여부 연산자)
SELECT *
FROM employees_jsonb
WHERE data @> '{"department": "IT"}';

3.4 배열 처리

-- 배열의 첫 번째 요소 추출
SELECT data->'skills'->>0 AS first_skill
FROM employees_jsonb;

-- 배열 요소 펼치기
SELECT jsonb_array_elements(data->'skills') AS skill
FROM employees_jsonb;

3.5 JSONB 연산자

연산자 설명 예시
@> 왼쪽 JSONB가 오른쪽 JSONB를 포함하는지 확인 SELECT data @> '{"department":"IT"}'
FROM employees_jsonb;
<@ 왼쪽 JSONB가 오른쪽 JSONB에 포함되는지 확인 SELECT '{"department":"IT"}' <@ data
FROM employees_jsonb;
? 특정 가 존재하는지 확인 SELECT data ? 'skills'
FROM employees_jsonb;
?| 배열로 지정된 키 중 하나라도 존재하는지 확인 SELECT data ?| array['skills', 'dept']
FROM employees_jsonb;
?& 배열로 지정한 키가 모두 존재하는지 확인 SELECT data ?& array['name','department']
FROM employees_jsonb;
- (text) 키 제거 SELECT data - 'skills'
FROM employees_jsonb;
- (int) 배열 인덱스 요소 제거  SELECT data - 1
FROM employees_jsonb;
#- 경로(path) 제거 SELECT data #- '{skills,0}'
FROM employees_jsonb;

3.6 인덱스 최적화

CREATE INDEX idx_employees_jsonb_data
ON employees_jsonb
USING gin (data);

GIN 인덱스를 활용하면 @>, ?, ?|, ?& 같은 연산의 성능을 크게 향상시킬 수 있습니다.

 

결론

PostgreSQL은 JSON과 JSONB를 모두 지원하지만, 두 타입의 성격은 다릅니다.

  • JSON은 원본을 보존해야 하는 경우에 사용
  • JSONB는 검색·연산·인덱스가 필요한 대부분의 실무에서 권장

이를 통해 PostgreSQL은 RDBMS의 정형 데이터와 NoSQL 스타일의 반정형 데이터를 동시에 다룰 수 있는 유연성을 제공합니다.

 


참고 레퍼런스

PostgreSQL 공식 문서

 

8.14. JSON Types

8.14. JSON Types # 8.14.1. JSON Input and Output Syntax 8.14.2. Designing JSON Documents 8.14.3. jsonb Containment and Existence 8.14.4. jsonb …

www.postgresql.org

 

9.16. JSON Functions and Operators

9.16. JSON Functions and Operators # 9.16.1. Processing and Creating JSON Data 9.16.2. The SQL/JSON Path Language 9.16.3. SQL/JSON Query Functions …

www.postgresql.org

 

PostgreSQL Wiki

 

What's new in PostgreSQL 9.4 - PostgreSQL wiki

This page contains an overview of PostgreSQL Version 9.4's features, including descriptions, testing and usage information, and links to blog posts containing further information. See also PostgreSQL 9.4 Open Items. Major new features JSONB Binary JSON sto

wiki.postgresql.org

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/12   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함