티스토리 뷰

1. JSON과 JSONB의 차이점
항목 | JSON | JSONB |
저장 방식 | 텍스트를 그대로 저장 | 이진(Binary) 형식으로 저장 |
검색 성능 | 느림 | 빠름(인덱싱 가능) |
키 순서 | 보존함 | 보존하지 않음 |
중복 키 | 허용 | 마지막 키만 유지됨 |
사용 추천 | 로깅 등 읽기 전용 | 대부분의 경우 JSONB 권장 |
2. JSON 데이터 조회의 주요 연산자
연산자 | 설명 |
-> | JSON 객체에서 값 추출 (JSON 형식 그대로 반환) |
->> | 문자열로 추출 |
#> | 중첩 경로로 접근 |
#>> | 중첩 경로에서 문자열 추출 |
? | 해당 키 존재 여부 확인 |
@> | 포함 여부 확인 |
JSONB_ARRAY_LENGTH() | 배열 길이 구하기 |
|| | 병합 연산자로 두 JSONB 값을 합쳐서 하나의 JSONB 객체로 만드는 역할 (JSONB 전용) |
2-1. 연산자 활용 관련
상황 | 사용 예 |
JSON 컬럼에서 특정 필드 값만 추출 | profile ->> 'name' |
배열 길이 계산 | JSONB_ARRAY_LENGTH(profile -> 'hobbies') |
필드 존재 여부 검사 | profile ? 'email' |
키-값 조건으로 필터링 | profile -> 'hobbies' ? 'reading' |
3. 예시 코드
3-1. 테이블 생성 및 데이터 삽입
CREATE TABLE users (
user_id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
profile JSONB
);
INSERT INTO users (profile) VALUES
('{"name": "Taco", "age": 30, "city": "Budapest"}'),
('{"name": "Giga", "age": 25, "city": "Tbilisi", "hobbies": ["reading", "climbing"]}');
3-2. JSON 생성 함수
SELECT JSON_BUILD_OBJECT('name', 'Taco', 'age', 30, 'city', 'Budapest');
-- → {"name": "Taco", "age": 30, "city": "Budapest"}
3-3. 기본 조회
SELECT
profile ->> 'name' AS name,
profile -> 'city' AS city,
profile -> 'hobbies' -> 0 AS first_hobby
FROM users;
3-4. 특정 키 존재 여부 확인
SELECT * FROM users WHERE profile ? 'hobbies';
3-5. 배열 안에 특정 값 포함 확인
SELECT * FROM users WHERE profile -> 'hobbies' ? 'climbing';
3-6. 여러 키 중 하나라도 포함 확인
SELECT * FROM users WHERE profile ?| ARRAY['reading', 'traveling'];
SELECT * FROM users WHERE profile ?| ARRAY['name', 'email'];
3-7. 문자열 필터링
SELECT * FROM users WHERE profile ->> 'city' LIKE 'B%';
3-8. 키 추가/병합
UPDATE users
SET profile = profile || JSONB_BUILD_OBJECT('email', 'x@x.com');
3-9. 키 삭제
UPDATE users
SET profile = profile - 'email'
WHERE profile ->> 'name' = 'Giga';
3-10. 배열 값 덮어쓰기
UPDATE users
SET profile = profile || JSONB_BUILD_OBJECT(
'hobbies',
JSONB_BUILD_ARRAY('climbing', 'traveling')
)
WHERE profile ->> 'name' = 'Taco';
3-11. 배열에 요소 추가 (덧붙이기)
UPDATE users
SET profile = profile || JSONB_SET(
profile,
'{hobbies}',
(profile -> 'hobbies') || JSONB_BUILD_ARRAY('cooking')
);
관련 문서
'기록' 카테고리의 다른 글
Redis의 핵심 자료형 배운 것 정리 및 명령어 실습 (0) | 2025.04.20 |
---|---|
PostgreSQL의 확장 기능 (Extensions) 중 hstore, pgcrypto, uuid-ossp에 대해 정리 (0) | 2025.04.20 |
트랜잭션(Transaction)에 대해 배운 것 정리 및 예제 (0) | 2025.04.19 |
PostgreSQL Function & Procedure 배운 것 정리 (0) | 2025.04.13 |
PostgreSQL에서 문자열 기반 다대다 관계 정규화하기 — 영화 장르 예제 (0) | 2025.04.12 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 동적계획법
- 구현
- react
- 비트마스킹
- 타입스크립트
- 넥스트js
- 리액트
- 브루트포스
- BFS
- NextJS
- async
- 알고리즘
- Redux
- 프로그래머스
- themoviedb
- 코드스테이츠
- CSS
- 스택
- 다이나믹프로그래밍
- 완전탐색
- aws
- SQL
- 백준
- Next.js
- 자바스크립트
- C++
- 카카오맵
- 순열
- typescript
- 햄버거버튼
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함