CodeGym /행동 /SQL SELF /jsonb_set()랑 jsonb_insert()로 JSON 오브젝트 데이터 ...

jsonb_set()랑 jsonb_insert()로 JSON 오브젝트 데이터 업데이트하기

SQL SELF
레벨 33 , 레슨 4
사용 가능

자, PostgreSQL의 JSONB는 복잡한 계층 구조 데이터를 저장할 수 있는 강력한 도구야. 근데 만약 JSONB 컬럼 안의 값을 바꿔야 한다면? 예를 들어, 유저의 전화번호를 바꾸거나 배열에 새로운 카테고리를 추가하고 싶을 때? 쉬워 보이지만, JSONB는 테이블처럼 셀 하나만 바로 바꿀 수 있는 게 아니거든. JSON 오브젝트 데이터를 업데이트하려면 특별한 함수가 필요해. 오늘의 주인공은 바로:

  • jsonb_set(): 지정한 "경로"에 값 변경 또는 추가할 때 써.
  • jsonb_insert(): JSON 배열에 새 요소를 넣을 때 써.

jsonb_set()로 데이터 업데이트하기

jsonb_set() 함수는 JSONB 오브젝트의 일부를 바꾸거나 새로운 키와 값을 추가할 수 있어.

기본 문법

jsonb_set(target jsonb, path text[], new_value jsonb, create_missing boolean)
  • target — 우리가 업데이트할 JSONB 오브젝트야.
  • path — 바꿀 키까지의 경로를 나타내는 문자열 배열이야.
  • new_value — 우리가 추가하거나 바꿀 값이야.
  • create_missing — 논리값 (TRUE나 FALSE)인데, 없는 키를 새로 만들지 여부를 정해.

간단한 예제 하나 볼까? users라는 테이블에 profile이라는 JSONB 타입 컬럼이 있고, 여기에 유저 프로필이 저장돼 있다고 해보자. 한 유저가 전화번호를 바꾼다고 하면 어떻게 할까?

-- 테이블 만들고 데이터 넣기
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    profile JSONB
);

INSERT INTO users (profile)
VALUES ('{"name": "오토", "contact": {"phone": "+1-495-123-45-67"}}');

-- 전화번호 업데이트
UPDATE users
SET profile = jsonb_set(profile, '{contact,phone}', '"8-800-555-35-35"', FALSE)
WHERE id = 1;

-- 결과 확인
SELECT profile FROM users WHERE id = 1;

결과:

{
  "name": "오토",
  "contact": {
    "phone": "8-800-555-35-35"
  }
}

오! 전화번호가 바뀌었지? 경로는 '{contact,phone}'처럼 문자열 배열로 지정하는 거 잊지 마.

새로운 키 추가하기

업데이트하려는 키가 없으면 create_missing = TRUE로 지정해서 새로 만들 수 있어:

UPDATE users
SET profile = jsonb_set(profile, '{address,city}', '"베를린"', TRUE)
WHERE id = 1;

-- 결과 확인
SELECT profile FROM users WHERE id = 1;

결과:

{
  "name": "오토",
  "contact": {
    "phone": "8-800-555-35-35"
  },
  "address": {
    "city": "베를린"
  }
}

이제 주소 섹션이 새로 생겼어. 편하지?

jsonb_insert()로 데이터 넣기

jsonb_insert() 함수는 JSONB 오브젝트 안의 배열에 요소를 추가할 때 써.

기본 문법

jsonb_insert(target jsonb, path text[], new_value jsonb, insert_after boolean)
  • target — 대상 JSONB 오브젝트야.
  • path — 요소를 넣을 배열까지의 경로를 나타내는 문자열 배열이야.
  • new_value — 추가할 값이야.
  • insert_after — 논리값. FALSE면 지정 인덱스 앞에, TRUE면 뒤에 넣어.

예시 들어볼게. profile 컬럼에 유저의 관심사 리스트가 있다고 하자. 여기에 새로운 관심사를 추가하고 싶어:

-- 예제 데이터 추가
UPDATE users
SET profile = jsonb_set(profile, '{interests}', '["스포츠", "음악"]', TRUE)
WHERE id = 1;

-- "프로그래밍" 관심사를 리스트 맨 앞에 넣기
UPDATE users
SET profile = jsonb_insert(profile, '{interests,0}', '"프로그래밍"', FALSE)
WHERE id = 1;

-- 결과 확인
SELECT profile FROM users WHERE id = 1;

결과:

{
  "name": "오토",
  "contact": {
    "phone": "8-800-555-35-35"
  },
  "address": {
    "city": "베를린"
  },
  "interests": [
    "프로그래밍",
    "스포츠",
    "음악"
  ]
}

자주 하는 실수랑 피하는 법

jsonb_set()이랑 jsonb_insert() 쓸 때 아래 같은 점 조심해야 해:

  1. 경로 잘못 지정하기. 경로를 잘못 쓰거나 없는 요소를 create_missing=TRUE 없이 바꾸려고 하면 에러 나거나 아무 일도 안 생겨. 항상 네 JSON 구조를 먼저 확인해!
  2. 데이터 타입 안 맞음. new_value는 무조건 JSONB 타입이어야 해. 문자열 넣으려면 꼭 큰따옴표('"값"')로 감싸야 해.
  3. 데이터 덮어쓰기. 배열을 조심해서 안 다루면 기존 데이터가 날아갈 수 있어. 새 요소 추가할 땐 jsonb_insert()를 써서 안전하게 하자.

에러 예시:

-- 에러: 경로 잘못됨
UPDATE users
SET profile = jsonb_set(profile, '{contacts}', '"새로운 연락처"', FALSE)
WHERE id = 1;

이건 profile 오브젝트에 contacts 키가 없는데 create_missing을 FALSE로 해서 에러가 나.

피하는 방법:

-- create_missing = TRUE로 지정
UPDATE users
SET profile = jsonb_set(profile, '{contacts}', '"새로운 연락처"', TRUE)
WHERE id = 1;

실제로 어디에 써?

JSONB 다루는 건 그냥 재미로 하는 게 아니라, 요즘 앱에서 진짜 중요한 스킬이야. 예시 몇 개 들어볼게:

  • 유저 설정 저장. JSONB는 유저마다 다를 수 있는 앱 설정 같은 동적인 데이터 구조에 딱이야.
  • 외부 API 연동. REST API에서 받은 원본 JSON 데이터를 저장할 때 JSONB가 편해.
  • 빅데이터 분석. 중첩된 JSON 구조 덕분에 IoT 데이터, 로그, 분석 데이터 다루기 좋아.

여기까지가 JSON 오브젝트 업데이트에 대한 입문 강의야. 이제 JSONB에 데이터 넣고, 바꾸고, 추가하는 법, 그리고 흔한 실수 피하는 법까지 알게 됐지! 다음 강의에서는 JSONB 오브젝트를 합치고 더 효율적으로 다루는 방법을 배울 거야!

1
설문조사/퀴즈
JSON-데이터 처리, 레벨 33, 레슨 4
사용 불가능
JSON-데이터 처리
JSON-데이터 처리
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION