DB

[MySQL] JSON 데이터 타입과 기본 구조 이해하기

인생아 2025. 7. 28. 13:46
반응형

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

 

반응형