티스토리 뷰

최근 데이터 처리 환경에서는 정형 데이터뿐 아니라 반정형 데이터도 점점 더 중요해지고 있습니다. 특히 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
'IT Lab > Database' 카테고리의 다른 글
| [SQL] ANSI SQL vs PostgreSQL 문법 비교 (5) | 2025.08.24 |
|---|---|
| [데이터 엔지니어링] 최신 데이터 도구 업데이트 (2025년 8월) | Airflow·Snowflake·PostgreSQL·Iceberg (9) | 2025.08.16 |
| [데이터 리니지] 3. 데이터 리니지, 어떻게 구성할까? (1) | 2025.08.02 |
| [데이터 리니지] 2. 분석계 데이터가 많아질수록 데이터 리니지가 필요한 이유 (0) | 2025.08.02 |
| [데이터 리니지] 1. AI 시대, 데이터 리니지의 중요성 (0) | 2025.08.02 |
- Total
- Today
- Yesterday
- ChatGPT
- 데이터베이스
- 바이브코딩
- sqlserver
- 챗gpt
- 데이터리니지
- AI코딩
- DBMS
- 데이터플랫폼
- db운영
- Xcode
- rockylinux
- cursorai
- JSONB
- IOS
- DB
- data lineage
- k8s
- PostgreSQL
- 앱개발
- 테이블복사
- AnsiSQL
- java배포
- mssql
- datahub
- DATABASE
- gpt활용
- sql
- venv
- 데이터 리니지
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |