JSON 데이터 수정
JSON_SET으로 값 추가/수정
JSON_SET(json_doc, path, value [, path, value] ...)
- "JSON_SET"은 키가 있으면 값을 수정하고, 없으면 새로 추가한다.
- json_doc: 대상 JSON 컬럼
- path: JSON 경로 ($.key, $.obj.key 등)
- value: 설정할 값 (문자, 숫자, boolean, JSON 등)
-- 갤럭시 S24에 새로운 속성 추가
UPDATE product_json
SET attributes = JSON_SET(attributes, '$.wireless_charging', true, '$.storage', 1024)
WHERE product_id = 1;
-- 결과 확인
SELECT name, attributes FROM product_json WHERE product_id = 1;

- 기존에 없는 wireless_charging 속성과 값을 추가하고, 기존에 있는 storage 속성의 값을 "256" => "1024"로 변경한다.
JSON_INSERT로 값 추가만
-- 이미 있는 color는 변경되지 않고, 없는 fast_charging만 추가됨
UPDATE product_json
SET attributes = JSON_INSERT(attributes, '$.color','새로운 색상', '$.fast_charging', true)
WHERE product_id = 1;
-- 결과 확인
SELECT name, attributes->>'$.color' AS color, attributes->>'$.fast_charging'
AS fast_charging
FROM product_json WHERE product_id = 1;

- "JSON_INSERT"는 키가 없을 때만 추가한다. 이미 있는 키는 수정하지 않는다.
- "color"는 기존 값 "팬텀 블랙"이 유지되고, "fast_charging"만 새로 추가되었다.
JSON_REPLACE로 값 수정만
-- 있는 storage는 변경되고, 없는 new_feature는 추가되지 않음
UPDATE product_json
SET attributes = JSON_REPLACE(attributes, '$.storage', 256, '$.new_feature', true)
WHERE product_id = 1;
-- 결과 확인
SELECT name,
attributes->>'$.storage' AS storage,
attributes->>'$.new_feature' AS new_feature
FROM product_json WHERE product_id = 1;

- "JSON_REPLACE"는 키가 있을 때만 수정한다. 없는 키는 추가하지 않는다.
- "storage"는 "256"로 변경되었지만, "new_feature"는 추가되지 않았다.
JSON_REMOVE로 값 삭제
-- fast_charging 속성 삭제
UPDATE product_json
SET attributes = JSON_REMOVE(attributes, '$.fast_charging', '$.wireless_charging')
WHERE product_id = 1;
-- 결과 확인
SELECT name, attributes FROM product_json WHERE product_id = 1;

- "fast_charging", "wireless_charging"이 삭제되었다
| 함수 | 차이 |
| JSON_SET | 있으면 수정, 없으면 추가 |
| JSON_INSERT | 없을 때만 추가 |
| JSON_REPLACE | 있을 때만 수정 |
| JSON_REMOVE | 삭제 |
배열에 요소 추가
-- 맥북에 새로운 포트 추가
UPDATE product_json
SET attributes = JSON_ARRAY_APPEND(attributes, '$.ports', '3.5mm 오디오')
WHERE product_id = 3;
-- 결과 확인
SELECT name, attributes->>'$.ports' AS ports FROM product_json WHERE
product_id = 3;

- "JSON_ARRAY_APPEND"를 사용하면 배열에 요소를 추가할 수 있다.
JSON 유틸리티 함수
JSON_KEYS - 키 목록 조회
SELECT name, JSON_KEYS(attributes) AS attribute_keys
FROM product_json
WHERE product_id = 1;

JSON_LENGTH - 요소 개수
-- 속성 개수 확인
SELECT name, JSON_LENGTH(attributes) AS attr_count
FROM product_json
LIMIT 5;

-- 배열 길이 확인
SELECT name, JSON_LENGTH(attributes->'$.ports') AS port_count
FROM product_json
WHERE category = '노트북';

JSON_TYPE - 타입 확인
SELECT
name,
JSON_TYPE(attributes->'$.screen_size') AS screen_type,
JSON_TYPE(attributes->'$.color') AS color_type,
JSON_TYPE(attributes->'$."5g"') AS `5g_type`
FROM product_json
WHERE product_id = 1;

- "5g"에 따옴표로 감싼 것을 주의하자.
- "5g_type" : 백틱이 추가되어 있다. MySQL에서 숫자로 시작하는 식별자는 백틱이 필요하다.
- $.key 형태의 key는 문자로 시작하고 문자/숫자/_만 허용한다.
- 숫자로 시작하는 키 또는 특수문자가 포함된 키는 반드시 따옴표로 감싸야 한다.
- JSON의 키는 가급적 영문 알파벳 문자로 시작하는 것이 좋다.
JSON_VALID - 유효성 검사
SELECT
JSON_VALID('{"name": "test"}') AS valid_json,
JSON_VALID('{name: test}') AS invalid_json,
JSON_VALID('not json at all') AS not_json;

JSON_PRETTY - 보기 좋게 출력
SELECT JSON_PRETTY(attributes) AS formatted_json
FROM product_json
WHERE product_id = 1;

정리
JSON 문법 핵심은 다음과 같다.
- 객체 "{}"와 배열 "[]" 두 가지 기본 구조
- 6가지 데이터 타입: 문자열, 숫자, 불리언, null, 객체, 배열
- 키는 반드시 큰따옴표로 감싸야 함
MySQL JSON 핵심 함수는 다음과 같다.
- "JSON_OBJECT", "JSON_ARRAY" : JSON 생성
- "->", "->>" : JSON 값 추출 ("->"는 JSON 타입, "->>"는 문자열)
- "JSON_SET" , "JSON_INSERT" , "JSON_REPLACE" : JSON 수정
- "JSON_REMOVE" : JSON 값 삭제
- "JSON_CONTAINS" , "JSON_CONTAINS_PATH" : 포함 여부 확인
'데이터 베이스 > 설계 2편, 실무에서 반드시 마주치는 9가지 설계 패턴' 카테고리의 다른 글
| Ch08. JSON 설계 - JSON 인덱스와 성능 최적화 (0) | 2026.08.01 |
|---|---|
| Ch08. JSON 설계 - JSON 활용 (0) | 2026.08.01 |
| Ch08. JSON 설계 - JSON 사용하기(1) (0) | 2026.07.31 |
| Ch08. JSON 설계 - JSON 문법 (0) | 2026.07.29 |
| Ch08. JSON 설계 - EAV의 한계와 JSON 필요성 (0) | 2026.07.29 |