반응형
MySQL은 5.7 버전부터 JSON 데이터 타입을 공식 지원한다. 이는 단순 문자열이 아닌 구조화된 데이터 형식으로 저장·검색·수정이 가능하다는 점에서 NoSQL적 유연함을 RDB에 결합한 기능이라 할 수 있다.

1. JSON 데이터 타입이란?
기존에는 JSON 데이터를 TEXT나 VARCHAR 컬럼에 문자열 형태로 저장했지만, JSON 타입은 MySQL이 내부적으로 구조를 인식하고 최적화된 바이너리 포맷으로 저장한다.
CREATE TABLE products (
id INT PRIMARY KEY,
info JSON
);
- info 컬럼은 JSON 형식만 저장 가능
- 유효하지 않은 JSON 형식은 에러 발생
✅ 장점 요약
- 구조화된 데이터 저장 가능
- → 또는 JSON 함수로 세부 데이터 추출 가능
- 공간 효율적인 바이너리 포맷 저장
- 인덱싱, 조건문 등 일부 최적화 지원
2. JSON 형식 규칙
MySQL JSON 타입에 저장할 수 있는 데이터는 RFC 7159 (JSON 표준)을 따른다.
허용되는 JSON 타입
| 타입 | 예시 |
| 객체(Object) | {"name": "book", "price": 1000} |
| 배열(Array) | ["apple", "banana", "cherry"] |
| 문자열 | "Hello" |
| 숫자 | 42, 3.14 |
| 불리언 | true, false |
| 널(null) | null |
❌ 문자열과 JSON의 혼동 주의
-- 문자열 저장 (허용)
INSERT INTO products (id, info)
VALUES (1, '{"name": "펜", "price": 500}');
-- JSON이 아닌 문자열 (에러 발생)
INSERT INTO products (id, info)
VALUES (2, '"name": "펜", "price": 500');
반드시 전체 구조가 유효한 JSON 형식이어야 한다.
반응형
3. JSON 컬럼에 데이터 삽입하기
INSERT INTO products (id, info)
VALUES (3, JSON_OBJECT('name', '노트북', 'price', 1200000));
또는 문자열 그대로 삽입도 가능:
INSERT INTO products (id, info)
VALUES (4, '{"name": "모니터", "price": 200000}');
- JSON_OBJECT()는 내부적으로 유효한 JSON을 생성해주므로 안정적이다.
4. JSON 컬럼에서 값 조회하기
기본적인 조회는 컬럼 전체를 반환한다:
SELECT info FROM products WHERE id = 1;
-- 결과: {"name": "펜", "price": 500}
JSON 내부 필드 조회는 ->, ->> 또는 JSON_EXTRACT() 사용:
SELECT info->>'$.name' AS 상품명 FROM products;
-- 결과: 펜
5. JSON 데이터 유효성 검사
입력 전에 JSON 형식이 맞는지 확인할 수 있다:
SELECT JSON_VALID('{"a": 1, "b": 2}'); -- 1 (유효)
SELECT JSON_VALID('"a": 1, "b": 2'); -- 0 (유효하지 않음)
삽입 전 필터링 처리 시 유용하게 활용된다.
반응형
6. JSON 저장 시 내부 구조 (바이너리)
MySQL은 JSON 타입을 문자열로 저장하지 않고, 최적화된 binary 포맷으로 저장한다.
그 덕분에 쿼리 성능도 향상되며, 구조 인식이 가능하다. 예를 들어:
SELECT JSON_TYPE(info) FROM products;
-- 결과: OBJECT
SELECT JSON_LENGTH(info) FROM products;
-- 결과: 키 개수 반환
7. JSON 데이터의 기본 제한사항
| 항목 | 내용 |
| 최대 크기 | 약 1GB (BLOB 한도와 동일) |
| NULL 저장 여부 | JSON 내 null은 저장 가능 |
| 중첩 객체 깊이 제한 | 100 레벨까지 가능 (버전에 따라 상이) |
| 인덱스 제한 | JSON 내부 필드는 일반 인덱스로 불가 (→ 가상 컬럼 사용 필요) |
8. 실무 적용 예시
제품 사양 저장용 JSON
CREATE TABLE electronics (
id INT PRIMARY KEY,
specs JSON
);
INSERT INTO electronics (id, specs)
VALUES (1, '{"cpu": "Intel i7", "ram": "16GB", "ssd": "512GB"}');
사용자 맞춤 설정
CREATE TABLE user_settings (
user_id INT,
config JSON
);
-- 알림 설정 저장
INSERT INTO user_settings (user_id, config)
VALUES (1001, '{"alarm": true, "newsletter": false}');
각각의 사용자의 설정을 유연하게 저장할 수 있어 스키마 변경 없이 다양한 설정 확장이 가능하다.
참고 문서
https://dev.mysql.com/doc/refman/8.0/en/json.html
https://dev.mysql.com/doc/refman/8.0/en/json.html#json-data-type
반응형
'DB' 카테고리의 다른 글
| [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] 암호화와 해시 함수 선택 가이드 (1) | 2025.07.28 |
| [MySQL] COMPRESS와 UNCOMPRESS로 데이터 압축 처리하기 (1) | 2025.07.28 |
| [MySQL] ENCODE와 DECODE 함수 사용법 🔐 (1) | 2025.07.28 |
| [MySQL] AES_ENCRYPT, AES_DECRYPT로 대칭키 암호화 🔐 (0) | 2025.07.25 |