CodeGym /행동 /SQL SELF /JSONB 데이터 타입 다루기

JSONB 데이터 타입 다루기

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

JSON (JavaScript Object Notation)은 시스템 간 데이터 교환에 많이 쓰이는 포맷이야. 가볍고, 사람이 읽기 쉽고, 객체나 배열 같은 구조화된 데이터를 표현하는 데 딱이야.

PostgreSQL에서는 JSON을 다루기 위해 두 가지 데이터 타입을 지원해:

  • JSON: 데이터를 문자열로 저장해. 그냥 텍스트로만 저장되는 JSON이라 내부적으로 최적화는 안 돼 있어.
  • JSONB: JSON의 바이너리 버전이야. 읽기, 필터링, 처리에 훨씬 효율적이고, PostgreSQL이 미리 파싱해서 저장을 최적화해줘.

JSONB를 더 많이 쓸까? 그 이유는:

  • 바이너리 저장 덕분에 쿼리가 더 빨라.
  • 인덱싱이 가능해서 대용량 데이터셋에 딱이야.
  • 키 순서도 보장되고 중복도 없애줘서 처리하기 편해.

JSON 구조 예시:

{
  "name": "Alice",
  "age": 25,
  "skills": ["SQL", "PostgreSQL", "JSONB"]
}

JSONB가 왜 유용할까?

반정형 데이터 저장. 실제로 데이터를 다루다 보면 복잡한 객체(예: 메타데이터, 설정, 사용자 프로필) 형태로 오는 경우가 많아. JSONB를 쓰면 이런 걸 테이블이나 관계를 수백 개 만들지 않고도 저장할 수 있어.

자주 바뀌는 데이터 모델링. 객체 구조가 자주 바뀌는 경우(필드가 추가되거나 삭제될 때 등) JSONB로 유연하게 저장할 수 있어.

API 데이터 다루기. 많은 웹앱들이 JSON 포맷으로 데이터를 보내. 굳이 변환하지 않고 그냥 "있는 그대로" 저장하고 바로 쓸 수 있어.

JSONB 컬럼이 있는 테이블 만들기

실전으로 가보자! 예를 들어 사용자 프로필을 저장하는 데이터베이스를 만든다고 해보자.

profile 컬럼에 나이, 관심사, 연락처 등 추가 정보를 JSON 포맷으로 저장할 거야. 사용자마다 저장 구조가 다를 수 있을 때 진짜 편하지.

id name - VARCHAR(100) profile - JSONB
1 Alice {"age": 25, "skills": ["SQL", "PostgreSQL", "JSONB"], "location": "New York"}
2 Bob {"age": 30, "interests": ["hiking", "photography"], "location": "Denver"}
3 Charlie {"email": "charlie@example.com", "verified": true}
4 Diana {"age": 22, "skills": ["Python"], "bio": "Data enthusiast", "location": "Berlin"}
5 Eve {"age": 28, "skills": [], "preferences": {"theme": "dark", "notifications": false}}

JSON 데이터는 문자열로 그냥 넣으면 돼. PostgreSQL이 알아서 JSONB로 변환해줘.

JSONB에서 데이터 꺼내기

이제 데이터가 있으니, 어떻게 꺼내는지 알아보자. PostgreSQL은 JSONB를 다루는 다양한 연산자를 제공해.

필드 값 접근하기

-> 연산자를 써서 필드 값을 가져올 수 있어:

-- 사용자 나이 출력하기
SELECT profile->'age' AS age FROM users;

값을 텍스트로 변환하기

->> 연산자는 값을 문자열로 뽑아줘:

-- 사용자 거주지 출력하기
SELECT profile->>'location' AS location FROM users;

JSONB로 데이터 필터링하기

JSONB의 진짜 힘은 필터링 쿼리에서 나와. 표준 SQL 연산자를 써서 JSON을 다룰 수 있어.

키로 필터링 예시:

-- 거주지가 "New York"인 사용자 찾기
SELECT * FROM users
WHERE profile->>'location' = 'New York';

배열에서 찾기

JSON은 배열도 지원하고, PostgreSQL은 배열 안에서 값 찾기도 가능해:

-- SQL을 다룰 줄 아는 사용자 찾기
SELECT * FROM users
WHERE 'SQL' = ANY(jsonb_array_elements_text(profile->'skills'));

jsonb_array_elements_text 함수는 배열 요소를 문자열로 바꿔서 비교할 수 있게 해줘.

더 짧게 쓰고 싶으면 @> 연산자를 쓸 수도 있어:

-- SQL을 다룰 줄 아는 사용자 찾기
SELECT * FROM users
WHERE profile->'skills' @> '["SQL"]';

JSON 관련 함수랑 더 다양한 활용법은 나중에 더 깊게 다뤄볼 거야 :P

요약: JSONB 언제 쓰면 좋을까?

JSONB는 이런 상황에 딱이야:

  • 복잡한 구조의 데이터를 저장할 때
  • 외부 API에서 받은 데이터를 처리할 때
  • 객체 구조가 자주 바뀔 때

근데 너무 남발하면 인덱싱이나 DB 관리가 복잡해질 수 있으니까 조심! 데이터 구조가 안정적이면 그냥 릴레이션 모델 쓰는 게 더 나을 수도 있어.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION