JSON_ARRAYAGG와 JSON_OBJECTAGG 차이 (Mysql 8.0)

2025. 2. 12. 21:29BACKEND

728x90

JSON_ARRAYAGG() 함수와 JSON_OBJECTAGG() 함수는 MySQL에서 JSON 데이터를 집계하는 데 사용되는 함수로, 각각 다른 형태의 JSON 구조를 생성한다. 이 두 함수의 차이점은 생성되는 JSON 데이터의 형태에 있다.

1. JSON_ARRAYAGG()

JSON_ARRAYAGG() 함수는 JSON 배열을 생성, 여러 개의 값을 한 배열로 묶어서 JSON 형태로 반환할 때 사용된다. 쉽게 말해, 특정 컬럼의 값을 순차적으로 모아서 하나의 배열을 만드는 역할을 한다.

예제:

다음과 같은 테이블이 있다고 가정

id name

1 John
2 Jane
3 Smith

이 데이터를 JSON_ARRAYAGG()로 집계하면:

SELECT JSON_ARRAYAGG(name) AS names_array
FROM employees;

결과:

["John", "Jane", "Smith"]

여기서 JSON_ARRAYAGG()는 name 컬럼의 값을 모아 하나의 배열 형태로 반환.

2. JSON_OBJECTAGG()

JSON_OBJECTAGG() 함수는 JSON 객체를 생성. 키-값 쌍을 모아서 하나의 JSON 객체를 만드는 데 사용된다. 즉, 각 행의 데이터를 특정 키와 값으로 구성하여 객체 형태로 반환 한다.

예제:

다음과 같은 테이블이 있다고 가정

id name

1 John
2 Jane
3 Smith

이 데이터를 JSON_OBJECTAGG()로 집계하면:

SELECT JSON_OBJECTAGG(id, name) AS names_object
FROM employees;

결과:

{
  "1": "John",
  "2": "Jane",
  "3": "Smith"
}

여기서 JSON_OBJECTAGG()는 id 컬럼을 키로, name 컬럼을 값으로 사용하여 JSON 객체를 생성 한다.

요약

  • JSON_ARRAYAGG(): 특정 컬럼의 여러 값을 모아서 JSON 배열로 반환 한다.
    • 예: ["John", "Jane", "Smith"]
  • JSON_OBJECTAGG(): 두 개의 컬럼(하나는 키, 하나는 값)을 이용해 JSON 객체를 반환 한다.
    • 예: { "1": "John", "2": "Jane", "3": "Smith" }

따라서 JSON_ARRAYAGG()는 여러 값을 리스트 형태로 모아서 반환하는 반면, JSON_OBJECTAGG()는 키-값 쌍으로 구성된 객체 형태로 데이터를 반환 해준다.

배열 안의 JSON 오브젝트가 필요 하다면

나는 처음에는 두 함수를 같이 사용 할 수 있는줄 알았다. 그래서 항상 왜 에러가 생기는지 헷갈렸는데

아쉽게도 JSON_ARRAYAGG(JSON_OBJECTAGG())처럼 두 개의 집계 함수를 직접 중첩하여 사용하는 것은 MySQL에서 지원되지 않는다. 대신, 각 행을 JSON 객체로 만든 다음, 그 객체들을 JSON 배열로 모으는 방식으로 구현할 수 있다 이 경우, JSON_OBJECT()와 JSON_ARRAYAGG()를 조합하여 원하는 형태의 결과를 얻을 수 있다.

예를 들어, 다음과 같은 형태의 배열 안에 JSON 객체들을 만들고 싶다고 가정하자

[
  { "id": 1, "name": "John" },
  { "id": 2, "name": "Jane" },
  { "id": 3, "name": "Smith" }
]

JSON_OBJECT()를 이용해 각 행을 JSON 객체로 만든 후, JSON_ARRAYAGG()로 이 객체들을 배열로 묶으면 된다.

예제

다음과 같은 테이블이 있다고 가정

id name

1 John
2 Jane
3 Smith

이를 배열 안에 JSON 객체로 표현하려면 아래와 같이 사용하면 된다.

SELECT JSON_ARRAYAGG(
           JSON_OBJECT(
               'id', id,
               'name', name
           )
       ) AS result_array
FROM employees;

결과:

[
  { "id": 1, "name": "John" },
  { "id": 2, "name": "Jane" },
  { "id": 3, "name": "Smith" }
]

쿼리 설명

  1. JSON_OBJECT('id', id, 'name', name):
    • 각 행을 JSON 객체로 변환.
    • 'id', id와 'name', name을 사용하여 객체의 키와 값을 설정.
  2. JSON_ARRAYAGG(...):
    • 여러 JSON 객체들을 배열로 묶어준다.

각 행이 JSON 객체가 되고, 그 객체들이 모두 하나의 JSON 배열로 묶여 원하는 형태의 결과를 얻을 수 있다.

요약

  • JSON_ARRAYAGG() → 컬럼의 여러 값을 모아 JSON 배열로 반환, [’jone’, ‘may’, ‘taylor’]
  • JSON_OBJECTAGG() → 두 개의 컬럼(키, 값)을 이용해 JSON 객체를 반환,
  • 두 함수는 모두 집계 함수이므로 배열안에 JSON객체를 만들고 싶다면 JSON_ARRAYAGG( JSON_OBJECTAGG() ) 형태로 사용하는 것이 아니라 JSON_ARRAYAGG( JSON_OBJECT(’key’, ‘value’) ) 와 같이 사용해야 한다.

'BACKEND' 카테고리의 다른 글

EXPLAIN 사용법 찍먹 해보기  (0) 2025.03.26
Nest, Adonis, Express 비교 하기  (1) 2024.12.09
Nest.js 공부하기 (2)  (0) 2024.11.27
Nest.js 공부하기 (1)  (3) 2024.11.04
Prisma 공부하기  (3) 2024.10.20