가끔 데이터 구조가 익숙한 문자열이나 숫자에 딱 맞지 않을 때가 있어. 예를 들어, 유저가 취미 리스트를 갖고 있거나, 프로필의 임의 설정, 주문의 중첩된 파라미터 같은 거 말이야. 이런 걸 위해 따로 테이블을 빡세게 만드는 건 불편하지. 이럴 때 JSON이 딱이야.
PostgreSQL은 이런 데이터를 다루기 위해 JSON이랑 JSONB 두 가지 포맷을 지원해. 둘 다 한 컬럼 안에 구조화된 데이터를 저장할 수 있는데, 중요한 차이점이 있어.
이게 어떻게 동작하는지, 언제 어떤 포맷을 써야 하는지, 그리고 어떤 기능들이 있는지 같이 알아보자.
JSON이 뭐야?
JSON(JavaScript Object Notation)은 구조화된 데이터를 편하게 표현하려고 만들어진 텍스트 기반 데이터 교환 포맷이야. 웹앱 개발자라면 누구나 익숙한 포맷이고, "사람이 읽기 괜찮고" "컴퓨터가 쉽게 파싱할 수 있는" 포맷이라고 할 수 있어. PostgreSQL에서는 이 포맷을 구조화된 데이터를 저장하고 처리하는 데 써.
여기 JSON 오브젝트 예시가 있어:
{
"name": "Alex Lin",
"age": 25,
"skills": ["SQL", "PostgreSQL", "JavaScript"],
"address": {
"city": "Berlin",
"postal_code": "10115"
}
}
참고: JSON은 그냥 텍스트지만, 규칙이 있는 텍스트야. 예를 들어, 키 이름은 항상 따옴표로 감싸야 해.
JSONB: Binary JSON
JSONB는 "바이너리 JSON"이고, PostgreSQL에서 지원해. JSON과 달리 JSONB는 인덱싱이 되고, 빠른 검색과 변경에 최적화되어 있어. PostgreSQL에서 JSON과 JSONB의 주요 차이는 저장 방식이야:
- JSON은 네가 넣은 그대로 텍스트 스트링으로 저장돼.
- JSONB는 데이터를 바이너리 포맷으로 바꿔서, 대부분의 작업에 더 효율적이야.
JSONB는 필터링, 인덱싱, 복잡한 중첩 구조 비교 같은 기능을 제공해.
JSONB의 주요 장점
왜 JSON 대신 JSONB를 써야 할까? 몇 가지 이유가 있어:
- 검색과 필터링 속도 향상
JSONB는 데이터를 빠르게 뽑아내는 데 최적화되어 있어. 예를 들어, 큰 오브젝트 배열이 있으면, JSONB로 원하는 요소를 전체 순회 없이 바로 찾을 수 있어.
- 인덱싱 가능
인덱스를 쓰면 JSONB 안의 키와 값으로도 검색할 수 있어서 쿼리가 엄청 빨라져. JSON을 텍스트로 저장하면(그냥 JSON 포맷) 인덱싱이 안 돼.
- 중첩 데이터 다루기 편함
JSONB는 중첩 구조를 다루는 데 진짜 좋아. 계층형 데이터를 위해 테이블을 잔뜩 만들 필요 없이, 다 한 번에 깔끔하게 담을 수 있어.
언제 JSON, 언제 JSONB를 써야 할까?
- JSON은 데이터를 "있는 그대로" 텍스트로 저장하고 싶을 때 써. 예를 들어, 데이터의 정확한 기록이 중요하거나, 최소한의 처리가 필요할 때 좋아.
- JSONB는 데이터를 자주 조회, 필터, 수정하거나 인덱싱이 필요할 때 딱이야.
JSON 오브젝트 예시
JSON 오브젝트 구조가 어떻게 생겼는지 예시로 알아보자.
간단한 JSON 오브젝트.
키-값 구조:
{
"name": "예카테리나",
"age": 29
}
JSON에서 배열
JSON은 배열도 지원해:
{
"skills": ["Python", "SQL", "데이터 분석"]
}
중첩 오브젝트
JSON은 복잡한 데이터를 저장할 수 있게 조합도 가능해:
{
"name": "안드레이",
"contacts": {
"email": "andrey@example.com",
"phone": "+79012345678"
}
}
배열과 오브젝트 조합
배열과 오브젝트를 섞어서 쓸 수도 있어:
{
"team": [
{
"name": "엘레나",
"role": "매니저"
},
{
"name": "파벨",
"role": "개발자"
}
]
}
JSON과 PostgreSQL
PostgreSQL은 JSON을 다루기 위해 두 가지 데이터 타입을 지원해:
JSON: 텍스트 포맷.JSONB: 바이너리 포맷.
JSON과 JSONB 컬럼이 있는 테이블 만들기
PostgreSQL 테이블에서 JSON/JSONB를 어떻게 쓰는지 보자. 예를 들어, 회사 직원 정보를 저장하는 테이블을 만들어볼게:
-- JSON과 JSONB 컬럼이 있는 테이블 생성
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
details JSON, -- 텍스트 JSON
profile JSONB -- 바이너리 JSON
);
처음 보면 이 컬럼들에 차이가 없어 보이지만, 사실 JSON은 변하지 않는 데이터를 저장할 때 딱이고, JSONB는 필터링이나 검색에 더 좋아.
-- 데이터 삽입
INSERT INTO employees (name, details, profile)
VALUES
('Alex Lin', '{"age": 30, "city": "탈린"}', '{"skills": ["SQL", "PostgreSQL"], "hobby": "축구"}'),
('Maya Novak', '{"age": 25, "city": "리가"}', '{"skills": ["Python", "머신러닝"], "hobby": "독서"}');
JSONB 데이터 추출
특정 함수로 JSONB에서 데이터를 뽑아낼 수 있어. 이건 다음 강의에서 더 배울 거야. 예를 들어, 직원들의 스킬을 알고 싶으면:
-- 스킬 추출
SELECT name, profile->'skills' AS skills
FROM employees;
결과:
| name | skills |
|---|---|
| Alex Lin | ["SQL", "PostgreSQL"] |
| Maya Novak | ["Python", "머신러닝"] |
실생활에서 JSON 활용
JSON(그리고 JSONB)은 실제 앱에서 엄청 많이 써. 예시 몇 개 들어볼게:
- API와 마이크로서비스. JSON은 RESTful API에서 표준 데이터 포맷이야. PostgreSQL은 저장과 처리까지 지원해.
- 데이터 통합. 네 데이터베이스가 여러 시스템에서 데이터를 받는다면, JSONB로 작업하는 게 훨씬 편해.
- 복잡한 구조 소유. 예를 들어, JSONB는 설문 데이터, 사용자 설정, 회사 메타데이터 저장에 딱이야.
GO TO FULL VERSION