Skip to main content

Command Palette

Search for a command to run...

Json과 Jsonb

Published
4 min read
Json과 Jsonb
S

Nice to meet u :) Im Backend Developer

✍️ 작성하게 된 이유

프로젝트에서 데이터 값을 Json으로 저장해야하는 경우가 있었다. 해당 프로젝트에서 PostgreSQL을 사용했는데 이는 JSON 데이터를 저장하고 활용할 수 있는 기능을 제공한다. 특히 JSONJSONB라는 두 가지 데이터 타입이 존재하는데, 처음 보면 왜 두 개나 있는지, 언제를 선택해야 하는지, 어떤 차이가 있는지 혼란스럽다.

이번 글에서는 JSON과 JSONB의 차이점, 장단점, 선택 기준까지 하나하나 정리해보려 한다.


💡 JSON이란?

{ "key": "value" } 구조로 된 가볍고 파싱이 쉬운 데이터 형식
→ 널리 사용되고 있으며, PostgreSQL에서도 이를 저장할 수 있다.

PostgreSQL에서는 두 가지 타입을 지원한다.

두 타입의 공통점은 JSON포맷 유효성 체크를 한다.

(JSONB는 9.4버전부터 추가되었다.)

타입설명
JSON입력된 문자열을 그대로 저장
JSONB바이너리 포맷으로 정제해 저장

🔍 JSON vs JSONB 차이점

항목JSONJSONB
저장 방식입력값에 대한 복사본 저장 → 원본 저장공백 제거, key 정렬 후 decopmose된 바이너리 저장→ 정제된 데이터 저장
파싱 방식요청 시마다 매번 파싱→ 처리속도 느림데이터 파싱 비용이 들지 않아 읽기 비용 적음 → 처리속도 빠름한번 정제 후 저장한 것을 재사용 (빠름)
키 순서보존보존 ❌
공백그대로 유지제거
중복 키모두 저장마지막 키만 저장
인덱스❌ 불가능✅ 가능 (GIN 등)
연산자 지원제한적대부분 연산자 지원
쓰기 성능✅ 빠름❌ 느림
읽기 성능❌ 느림✅ 빠름
디스크 사용량상대적으로 적음더 큼 (항상 그런 건 아님)

요약:

특별한 이유가 없다면 기본적으로 JSONB를 쓰는 것이 좋다!

✅ 언제 JSON을 써야 할까?

사용 상황추천 타입
원본 보존이 중요할 때 (ex. 로그)JSON
INSERT가 많고, 복잡한 쿼리 필요 없음JSON
기본 객체 키에 대한 순서 보장이 있을 때JSON
대규모 조회, 고속 필터링 필요JSONB

🔧 JSON / JSONB 연산자 정리

1️⃣ 기본 연산자 (JSON/JSONB 공통)

연산자설명결과
->키 또는 인덱스에 해당하는 요소 추출JSON
->>키 또는 인덱스에 해당하는 요소 추출Text

int형이 주어지면 배열 내 인덱스로 text형이 주어지면 해당 키에 대응하는 요소를 추출한다.

연산자설명결과
#>중첩된 필드의 특정 조건만을 검색하고 싶을때JSON
#>>중첩된 필드의 특정 조건만을 검색하고 싶을때Text

검색 조건으로 활용하는 필드는 콤마로 구분한다.

위 연산자들은 JSON형으로 저장된 컬럼에 원하는 조건에 해당하는 데이터를 추출하고 싶을 때 사용한다

2️⃣ JSONB 전용 연산자

연산자설명결과
@>포함 여부 (data가 값 포함)Boolean
<@포함 여부 (값이 data 포함)Boolean

연산자설명결과
?키 존재 여부Boolean
`?`검색 조건으로 배열이 주어짐. 배열 내 키 하나라도 존재= trueBoolean
?&검색 조건으로 배열이 주어짐. 배열 내 키 모두 존재= trueBoolean

연산자설명
``주어진 2개의 JSONB들을 하나로 합침
-주어진 키 제거, int형이 주어지면 특정 인덱스에 해당하는 요소 제거
#-주어진 경로에 해당하는 값 제거

⚠️ 주의할 점

  • JSON은 인덱스 불가능 → 복잡한 조회 시 성능 저하

  • JSONB는 쓰기 성능 낮음 → 대량 INSERT 시 부담

  • JSONB는 중복 키 제거 → 마지막 키만 유지됨

  • 데이터 파싱 및 정렬 비용 고려 필요


✅ 결론

조건선택
원본 유지 중요JSON
읽기 속도 중요JSONB
검색, 인덱스 활용JSONB
단순 로그 저장JSON

👉 대부분의 CRUD 기반 웹 서비스에서는 JSONB가 더 유리

참고자료

americano_people(PostgreSQL) JSON VS JSONB

yeongun[PostgreSQL] json, jsonb 타입과 연산자

https://postgresql.kr/blog/postgresql_jsonb.html

https://www.oracle.com/kr/database/what-is-json/

안종혁PostgreSQL JSON / JSONB 타입을 JPA와 매핑하기

More from this blog

[Spring] N+1문제 발생과 분석

✍️ 작성하게 된 이유 옷을 관리하는 서비스를 개발하면서 Cloth 엔티티와 그에 연관된 ClothWithAttributes, Attribute 데이터를 함께 조회하는 기능이 필요했다.그런데 연관 데이터를 조회할 때마다 쿼리가 폭발적으로 증가(N+1 문제) 하며, 성능이 급격히 저하되는 상황을 마주하게 되었다. Spring JPA의 대표적인 문제로 N+1임을 알고있었지만, 해결하는 방법은 Fetch Join밖에 몰랐다. 지연로딩되는 필드를 엔티...

Sep 17, 20256 min read
[Spring] N+1문제 발생과 분석

데이터베이스 기본 개념 정리

1️⃣ 데이터베이스(DB) & DBMS DB (Database): 일정한 규칙(스키마)에 따라 구조화되어 저장된 데이터의 집합. DBMS (Database Management System): DB를 제어/관리하는 시스템 소프트웨어. 특징: 실시간 접근 가능, 동시 공유 가능. 구조: 데이터베이스 → DBMS → 응용 프로그램 → 사용자 2️⃣ 엔티티(Entity) & 릴레이션(Relation) 엔티티: 여러 속성을 가진 "개체"...

Aug 5, 20252 min read
데이터베이스 기본 개념 정리

[Project] 날씨에 맞는 옷 추천 서비스 : 지그재그 크롤링 여정 기록 (1) ChromeDriver를 EC2에 설치하기

✍️ 작성하게 된 이유 무신사, 29cm는 Jsoup으로 충분히 크롤링이 가능했기 때문에, ZigZag도 당연히 Jsoup으로 처리될 것이라 생각했다. 무신사, 29cm와 마찬가지로 필요한 데이터는 모두 <script> 태그 안에 들어있었다. 하지만… 예상은 보기 좋게 빗나갔다. 🧪 현상 ✅ 로컬 크롤링 → 정상 작동 Jsoup으로 script 태그 내에서 대표 이미지와 상품명을 잘 추출 로컬 환경에서는 아무 문제 없이 작동 ❌ A...

Jul 30, 20253 min read
[Project] 날씨에 맞는 옷 추천 서비스 : 지그재그 크롤링 여정 기록 (1) ChromeDriver를 EC2에 설치하기

[Project] 날씨에 맞는 옷 추천 프로젝트: Selenium은 정말 필요한 선택이었을까? - 크롤링 삽질 기록

✍️ 작성하게 된 이유 날씨에 따라 옷을 추천해주는 서비스를 만들면서, 사용자가 입력한 구매 링크에서 옷 정보( 대표이미지, 상품명 )를 불러오는 기능이 필요했다. 처음에 해당 페이지를 동적 페이지로 판단했고, 자연스럽게 Selenium을 도입했다. 하지만 이 결정이 과연 최선이었는지는 수많은 시행착오 끝에야 알 수 있었다. 🕸️ Selenium을 선택한 이유 동적 페이지는 Jsoup으로 크롤링이 어렵다는 인식으로 처음부터 Selenium을 ...

Jul 28, 20254 min read
[Project] 날씨에 맞는 옷 추천 프로젝트: Selenium은 정말 필요한 선택이었을까? - 크롤링 삽질 기록

Soyulia's Blog

49 posts