DB

[MySQL] JSON_OBJECT, JSON_ARRAY로 JSON 생성하기

인생아 2025. 7. 28. 14:49
반응형

MySQL에서는 JSON 데이터를 동적으로 만들기 위해 JSON_OBJECT()JSON_ARRAY() 함수를 사용할 수 있다. 이 두 함수는 테이블 내 값을 기반으로 동적으로 JSON을 생성하거나, API 응답 형태로 데이터를 구성할 때 매우 유용하다.

1. JSON_OBJECT 함수란?

JSON_OBJECT(key1, value1, key2, value2, ...)
  • key와 value를 쌍으로 입력하여 JSON 객체 생성
  • key는 문자열, value는 문자열, 숫자, 불리언 등 다양한 타입 가능

예제

SELECT JSON_OBJECT('name', '노트북', 'price', 1200000);
-- 결과: {"name": "노트북", "price": 1200000}

테이블 컬럼 기반 생성

SELECT JSON_OBJECT('id', id, 'title', title)
FROM posts
WHERE id = 1;
  • 컬럼 값을 기반으로 동적으로 JSON 생성 가능
  • API 응답으로 넘기기 유용

NULL 포함 시 주의

  • 값이 NULL이면 자동으로 "key": null 생성
  • key가 NULL이면 에러 발생
SELECT JSON_OBJECT(NULL, 'test');
-- 결과: NULL + Warning
반응형

2. JSON_ARRAY 함수란?

JSON_ARRAY(value1, value2, ...)
  • 값만 나열하여 배열(JSON Array) 생성

예제

SELECT JSON_ARRAY('apple', 'banana', 'cherry');
-- 결과: ["apple", "banana", "cherry"]

숫자, 불리언도 포함 가능

SELECT JSON_ARRAY(1, 3.14, TRUE, NULL);
-- 결과: [1, 3.14, true, null]

3. JSON_OBJECT + JSON_ARRAY 조합

복잡한 구조의 JSON도 손쉽게 생성할 수 있다.

SELECT JSON_OBJECT(
  'id', 101,
  'tags', JSON_ARRAY('mysql', 'json', '함수')
);
-- 결과: {"id": 101, "tags": ["mysql", "json", "함수"]}

4. 실무 예제: 게시글을 JSON 응답으로 만들기

SELECT 
  JSON_OBJECT(
    'id', id,
    'title', title,
    'tags', JSON_ARRAY('DB', 'SQL', 'MySQL')
  ) AS json_response
FROM posts
WHERE id = 5;
  • API 응답용 JSON 문자열을 DB에서 직접 생성
  • 애플리케이션에서 추가 가공 없이 바로 사용 가능
반응형

5. 배열을 그룹으로 묶어보기 (GROUP_CONCAT 응용)

SELECT 
  user_id,
  JSON_ARRAYAGG(tag) AS tag_list
FROM user_tags
GROUP BY user_id;
  • JSON_ARRAYAGG()는 여러 행을 배열로 묶을 때 사용
  • GROUP_CONCAT()보다 JSON 구조를 보장

6. JSON_OBJECT 사용 시 주의사항

항목 설명
Key 중복 동일 key 사용 시 가장 마지막 값이 반영됨
Key NULL 불가 key에 NULL 들어가면 전체 결과 NULL 반환
성능 이슈 SELECT 내 다수 호출 시 성능 유의

7. JSON 응답 구조 정리

{
  "user": {
    "id": 1001,
    "name": "홍길동"
  },
  "roles": ["admin", "editor"]
}

이런 형태는 아래처럼 작성 가능:

SELECT JSON_OBJECT(
  'user', JSON_OBJECT('id', 1001, 'name', '홍길동'),
  'roles', JSON_ARRAY('admin', 'editor')
);

참고 문서

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

 

반응형