DB

[MySQL] JSON_MERGE, JSON_ARRAY_APPEND 활용법

인생아 2025. 7. 28. 18:52
반응형

MySQL에서는 JSON 객체를 합치거나 배열에 값을 추가하는 다양한 함수가 제공된다. 그중 대표적인 것이 JSON_MERGE_PRESERVE(), JSON_ARRAY_APPEND() 함수다. 특히 REST API 응답 구조, 사용자 이력 기록, 동적 필드 추가 등에서 매우 유용하다.

1. JSON_MERGE_PRESERVE: JSON 병합하기

JSON_MERGE_PRESERVE(json_doc1, json_doc2, ...)
  • 여러 JSON 객체/배열을 하나로 병합
  • 동일 키가 중복되면 배열로 합쳐짐

예제: 객체 병합

SELECT JSON_MERGE_PRESERVE(
  '{"name": "철수"}',
  '{"age": 30}'
);
-- 결과: {"name": "철수", "age": 30}

예제: 중복 키 병합

SELECT JSON_MERGE_PRESERVE(
  '{"name": "철수"}',
  '{"name": "영희"}'
);
-- 결과: {"name": ["철수", "영희"]}
  • key 중복 시 값을 배열로 묶어 병합한다는 특징이 있다.

예제: 배열 병합

SELECT JSON_MERGE_PRESERVE(
  '["A", "B"]',
  '["C", "D"]'
);
-- 결과: ["A", "B", "C", "D"]
반응형

2. JSON_MERGE_PATCH (MySQL 8.0.3+)

JSON_MERGE_PATCH(json_doc1, json_doc2)
  • 중복 key는 덮어씀
  • JSON 객체만 대상 (배열은 사용 불가)
SELECT JSON_MERGE_PATCH(
  '{"name": "철수"}',
  '{"name": "영희"}'
);
-- 결과: {"name": "영희"}
  • JSON_MERGE_PATCH는 RESTful API의 PATCH 작업처럼 작동

3. JSON_ARRAY_APPEND: 배열에 값 추가

JSON_ARRAY_APPEND(json_doc, path, value[, path, value] ...)
  • 지정된 경로(일반적으로 배열)에 값 추가

예제

SELECT JSON_ARRAY_APPEND('["A", "B"]', '$', "C");
-- 결과: ["A", "B", "C"]

객체 내 배열에 값 추가

SELECT JSON_ARRAY_APPEND(
  '{"tags": ["sql", "json"]}',
  '$.tags',
  'mysql'
);
-- 결과: {"tags": ["sql", "json", "mysql"]}

여러 위치 동시 추가

SELECT JSON_ARRAY_APPEND(
  '{"a": [1], "b": [10]}',
  '$.a', 2,
  '$.b', 20
);
-- 결과: {"a": [1, 2], "b": [10, 20]}
반응형

4. 실무 활용 예제

사용자 로그 누적 저장

UPDATE users
SET history = JSON_ARRAY_APPEND(history, '$', '로그인')
WHERE id = 1;
  • history가 배열로 되어 있을 때, 새로운 활동 추가 가능

여러 필드에 동시에 값 추가

UPDATE products
SET meta = JSON_ARRAY_APPEND(meta, '$.tags', '신상품', '$.colors', 'blue')
WHERE id = 101;
  • tags와 colors 모두 배열로 존재해야 동작

5. JSON_MERGE와 JSON_ARRAY_APPEND 차이 정리

항목 JSON_MERGE_PRESERVE JSON_ARRAY_APPEND
목적 객체/배열 병합 배열에 값 추가
대상 경로 전체 JSON 경로(path) 명시 필요
중복 키 처리 배열로 병합 없음
실무 용도 예 다수 JSON 통합 히스토리 누적, 태그 추가

참고 문서

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

 

반응형