DB

[MySQL] (JSON2️⃣) JSON_INSERT, JSON_SET, JSON_REPLACE 실전 활용법

인생아 2025. 7. 17. 17:24
반응형

MySQL에서 JSON 컬럼의 값을 수정할 때 가장 많이 사용되는 함수
JSON_INSERT, JSON_SET, JSON_REPLACE이다.
이 함수들은 이름은 비슷하지만 작동 방식이 완전히 다르며,
잘못 사용하면 의도와 다른 결과가 나올 수 있다.

✅ 공통 기본 문법

JSON_INSERT(json_doc, path, val[, path, val] ...)
JSON_SET(json_doc, path, val[, path, val] ...)
JSON_REPLACE(json_doc, path, val[, path, val] ...)
  • json_doc: JSON 데이터
  • path: JSON 내부 경로 ('$.필드명' 형식)
  • val: 새로 추가하거나 수정할 값
반응형

🪛 1. JSON_INSERT: 존재하지 않는 경우에만 추가

값이 없을 때만 추가하고, 이미 존재하면 무시된다.

SELECT JSON_INSERT('{"name": "홍길동"}', '$.age', 30);
-- 결과: {"name": "홍길동", "age": 30}

SELECT JSON_INSERT('{"name": "홍길동", "age": 25}', '$.age', 30);
-- 결과: {"name": "홍길동", "age": 25} ← 기존 값 그대로

Tip: 기본값 추가할 때 유용

🧩 2. JSON_SET: 항상 새 값으로 덮어씀

존재하든 말든 무조건 설정한다.
존재하면 덮어쓰고, 없으면 새로 추가함.

SELECT JSON_SET('{"name": "홍길동"}', '$.age', 30);
-- 결과: {"name": "홍길동", "age": 30}

SELECT JSON_SET('{"name": "홍길동", "age": 25}', '$.age', 30);
-- 결과: {"name": "홍길동", "age": 30} ← 덮어씀

Tip: 기본값과 관계없이 무조건 설정할 때 사용

🧼 3. JSON_REPLACE: 존재하는 경우만 수정

해당 경로가 존재하는 경우에만 수정하고,
존재하지 않으면 아무 일도 안 함

SELECT JSON_REPLACE('{"name": "홍길동", "age": 25}', '$.age', 30);
-- 결과: {"name": "홍길동", "age": 30}

SELECT JSON_REPLACE('{"name": "홍길동"}', '$.age', 30);
-- 결과: {"name": "홍길동"} ← 무시됨

Tip: 실수로 새로운 필드를 만들고 싶지 않을 때 사용

반응형

🔍 세 함수 비교 요약

함수 존재하지 않으면 존재하면
JSON_INSERT 추가 유지
JSON_SET 추가 덮어씀
JSON_REPLACE 무시 덮어씀

🧪 실전 예제

-- 기존 JSON
SET @json = '{"name": "유진", "email": "youjin@example.com"}';

-- 기본값 추가
SELECT JSON_INSERT(@json, '$.age', 20);

-- 항상 설정
SELECT JSON_SET(@json, '$.email', 'yujin@new.com');

-- 존재 시에만 변경
SELECT JSON_REPLACE(@json, '$.phone', '010-1234-5678');

🧠 실무 활용 팁

  • 옵션 필드에 기본값을 추가할 때는 JSON_INSERT
  • 사용자 설정값을 덮어쓰기할 때는 JSON_SET
  • 민감한 값을 기존에 있을 때만 변경하고 싶을 때는 JSON_REPLACE

단순히 이름이 유사하다고 아무거나 쓰면 절대 안 된다.
테스트 데이터를 미리 넣고 결과를 확인하는 습관이 필요하다.

📘 공식 문서 참고

https://dev.mysql.com/doc/refman/8.0/en/json-modification-functions.html

반응형