1. 소개
1.1 JSON의 중요성
현대 웹 개발에서 데이터 교환은 점점 복잡해지고 있습니다. 경량이면서 구조화된 데이터 형식인 JSON(JavaScript Object Notation)은 데이터 전송 및 저장에 널리 사용됩니다. MySQL 5.7 버전부터 JSON 데이터 타입을 지원하여 데이터베이스에 JSON 데이터를 직접 저장하고 조작하기가 쉬워졌습니다.
1.2 MySQL에서 JSON 사용하기
이 문서는 MySQL에서 JSON을 다루는 기본부터 성능 고려 사항 및 실용적인 사용 사례까지 모두 설명합니다. 초보자이든 고급 사용자이든 MySQL에서 JSON을 효과적으로 활용하는 데 필요한 지식을 얻을 수 있습니다.
2. MySQL에서 JSON이란?
2.1 JSON 기본
JSON은 키‑값 쌍으로 데이터를 구조화하는 간단한 형식입니다. 가볍고 가독성이 높아 웹 API와 데이터 전송에 널리 사용됩니다. MySQL에서는 JSON 데이터 타입을 통해 데이터베이스에 JSON 데이터를 직접 저장하고 조작할 수 있습니다.
2.2 MySQL JSON 데이터 타입
MySQL 5.7에 도입된 JSON 데이터 타입은 LONGBLOB이나 LONGTEXT와 비슷한 디스크 공간을 차지합니다. 데이터 무결성을 보장하기 위해 MySQL은 삽입 시 JSON 데이터를 검증하여 잘못된 JSON이 저장되는 것을 방지합니다.
2.3 JSON 사용 사례
JSON을 MySQL에서 사용하는 일반적인 시나리오는 다음과 같습니다:
- 복잡한 데이터 구조 저장
- API에서 가져온 원시 데이터 저장
- 동적이거나 진화하는 스키마를 가진 데이터 관리

3. MySQL에서 기본 JSON 작업
3.1 JSON 컬럼 생성
JSON 데이터를 저장할 컬럼을 만들려면 다음과 같이 json 데이터 타입을 지정합니다:
CREATE TABLE json_data (
doc JSON
);
3.2 JSON 데이터 삽입
JSON 데이터를 삽입하려면 INSERT 문을 사용합니다. MySQL은 삽입 시 데이터 형식을 검증하고, 유효한 JSON이 아니면 오류를 반환합니다.
INSERT INTO json_data(doc) VALUES ('{"a": {"b": ["c", "d"]}, "e": "f"}');
키‑값 쌍을 사용해 JSON_OBJECT 함수를 통해 JSON 객체를 생성할 수도 있습니다:
INSERT INTO json_data(doc) VALUES (JSON_OBJECT('key1', 'value1', 'key2', 'value2'));
3.3 JSON 데이터 조회
삽입된 JSON 데이터를 조회하려면 JSON_EXTRACT 함수를 사용합니다. 이 함수는 지정된 경로를 통해 JSON 객체에서 값을 추출합니다.
SELECT * FROM json_data WHERE JSON_EXTRACT(doc, '$.e') = 'f';
또는 축약형 -> 연산자를 사용할 수도 있습니다:
SELECT * FROM json_data WHERE doc->'$.e' = 'f';
3.4 JSON 데이터 업데이트
JSON 객체의 일부를 업데이트하려면 JSON_SET 함수를 사용합니다. 전체 객체를 덮어쓰지 않고 특정 필드만 업데이트합니다.
UPDATE json_data SET doc = JSON_SET(doc, '$.a.b[0]', 'new_value');
4. 성능 고려 사항
4.1 삽입 성능
JSON 컬럼에 데이터를 삽입할 때 성능은 TEXT 컬럼에 삽입하는 것과 거의 동일합니다. 예를 들어 50,000개의 레코드를 삽입했을 때 JSON은 속도 면에서 TEXT와 비슷한 성능을 보입니다.
4.2 업데이트 성능
JSON 데이터를 업데이트할 때 JSON_SET을 사용하면 부분 업데이트가 가능해 전체 객체를 덮어쓰는 것보다 성능이 향상됩니다. 50,000개의 레코드를 업데이트해도 JSON_SET은 효율적인 업데이트를 제공합니다.

5. MySQL에서 JSON 사용을 위한 모범 사례
5.1 적절한 사용 사례
JSON은 복잡한 데이터 구조나 동적 스키마를 가진 데이터를 저장하는 데 가장 적합합니다. 그러나 구조가 명확한 데이터는 전통적인 관계형 테이블이 일반적으로 더 효율적입니다.
5.2 JSON 데이터 인덱싱
MySQL에서는 가상 컬럼을 이용해 JSON 컬럼에 인덱스를 생성할 수 있습니다. 이는 JSON 데이터에 대한 조회 성능을 향상시킵니다.
ALTER TABLE json_data ADD COLUMN e_value VARCHAR(255) AS (doc->'$.e'), ADD INDEX (e_value);
5.3 일반적인 함정 피하기
- JSON 컬럼을 과도하게 사용하지 말고 관계형 데이터베이스의 장점을 활용하세요.
- 적절한 인덱스를 설정하여 쿼리 효율성을 보장하세요.
- JSON 데이터가 너무 커지는 것을 방지하고 필요할 때 데이터를 정규화하세요.
6. MySQL의 고급 JSON 함수
6.1 추가 JSON 함수
MySQL은 JSON 데이터를 조작하기 위한 다양한 함수를 제공합니다. 예를 들어, JSON_APPEND는 새로운 요소를 추가하고, JSON_REMOVE는 특정 필드를 삭제합니다.
-- Add data
UPDATE json_data SET doc = JSON_APPEND(doc, '$.a.b', 'new_element');
-- Remove data
UPDATE json_data SET doc = JSON_REMOVE(doc, '$.a.b[0]');
6.2 SQL 함수와 결합
JSON 함수는 기존 SQL 함수와 결합하여 보다 복잡한 쿼리를 만들 수 있습니다. 예를 들어, GROUP BY나 ORDER BY 절과 함께 JSON 데이터를 사용할 수 있습니다.
SELECT JSON_EXTRACT(doc, '$.e') AS e_value, COUNT(*) FROM json_data GROUP BY e_value;
7. 결론
이 문서에서는 기본 JSON 작업부터 MySQL의 고급 기능까지 모두 다루었습니다. MySQL의 JSON 기능을 활용하면 복잡한 데이터를 저장하고 관리하는 작업을 단순화할 수 있습니다. 성능에 대한 인사이트와 모범 사례를 적용하면 데이터를 보다 효율적으로 관리할 수 있습니다.


