반응형
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
반응형
'DB' 카테고리의 다른 글
| [MySQL] JSON_VALID, JSON_UNQUOTE 등 유틸 함수 총정리 (0) | 2025.07.28 |
|---|---|
| [MySQL] JSON_CONTAINS, JSON_LENGTH 등 검사 함수 모음 (1) | 2025.07.28 |
| [MySQL] JSON_SET, JSON_REPLACE로 값 수정하기 (1) | 2025.07.28 |
| [MySQL] JSON_EXTRACT와 -> 연산자로 값 조회하기 (2) | 2025.07.28 |
| [MySQL] JSON_OBJECT, JSON_ARRAY로 JSON 생성하기 (1) | 2025.07.28 |
| [MySQL] JSON 데이터 타입과 기본 구조 이해하기 (1) | 2025.07.28 |
| [MySQL] 암호화와 해시 함수 선택 가이드 (1) | 2025.07.28 |
| [MySQL] COMPRESS와 UNCOMPRESS로 데이터 압축 처리하기 (1) | 2025.07.28 |