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의 일반적인 사용 사례
MySQL에서 JSON을 사용하는 주요 시나리오는 다음과 같습니다:
- 복잡한 데이터 구조 저장
- API 응답을 수정 없이 저장
- 진화하는 스키마를 가진 데이터 관리
3. 기본 MySQL JSON 작업
3.1 JSON 열 생성
JSON 데이터를 저장할 열을 생성하려면 아래와 같이 JSON 데이터 타입을 지정합니다:
CREATE TABLE json_data (
doc JSON
);
3.2 JSON 데이터 삽입
아래와 같이 INSERT 문을 사용하여 JSON 데이터를 삽입합니다. 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 함수를 사용합니다. 이 함수는 지정된 경로를 업데이트하고 새로운 JSON 객체를 반환합니다.
UPDATE json_data SET doc = JSON_SET(doc, '$.a.b[0]', 'new_value');
4. 성능 고려사항
4.1 삽입 성능
MySQL JSON 열에 데이터를 삽입할 때 TEXT 타입과 JSON 타입 간의 성능 차이는 거의 없습니다. 런타임 테스트 결과, JSON 타입을 사용하여 50,000개의 레코드를 삽입하는 데 TEXT 타입을 사용하는 것과 거의 동일한 시간이 소요됩니다.
4.2 업데이트 성능
JSON 데이터를 업데이트할 때 JSON_SET을 사용하면 효율적인 부분 업데이트가 가능합니다. 전체 문서를 덮어쓰는 대신 특정 필드만 업데이트할 수 있어 성능이 향상됩니다. 50,000개의 레코드를 부분 업데이트하더라도 JSON_SET은 효율적인 실행을 허용합니다.

5. MySQL에서 JSON 사용 베스트 프랙티스
5.1 JSON을 적절히 사용할 때
JSON은 복잡한 데이터 구조와 진화하는 스키마를 가진 데이터 저장에 적합합니다. 그러나 고도로 구조화된 데이터의 경우 표준 관계형 테이블을 사용하는 것이 일반적으로 더 효율적입니다.
5.2 JSON 데이터 인덱싱
MySQL에서 가상 열(Virtual Columns)을 사용하여 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 배열에 새 데이터를 추가하거나 JSON_REMOVE를 사용하여 특정 필드를 제거할 수 있습니다.
-- Append 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 JSON과 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. 결론
이 기사에서는 MySQL의 기본 JSON 작업부터 고급 기능까지 모든 것을 다루었습니다. MySQL의 JSON 기능을 활용하면 데이터베이스 내에서 복잡한 데이터 구조를 쉽게 저장하고 조작할 수 있습니다. 여기서 논의된 성능 고려사항과 모범 사례를 적용하여 더 효율적인 데이터 관리를 달성하세요.


