DB

[MySQL] (JSON1️⃣) JSON 타입이란? 구조와 활용 예제 정리

인생아 2025. 7. 17. 16:21
반응형

MySQL 5.7부터 정식 지원된 JSON 타입은, 이제 수많은 실무 프로젝트에서 유연한 데이터 저장 방식으로 활용되고 있다.
관계형 모델의 정형 데이터와 비정형 데이터를 함께 다루기 위한 강력한 기능이다.

✅ JSON 타입이란?

  • MySQL에서 제공하는 특수한 컬럼 타입
  • 문자열처럼 보이지만 내부적으로는 바이너리 포맷으로 저장
  • 단순 문자열 저장이 아니라, 내부 구조를 파싱하고 연산 가능

예를 들어 다음과 같은 형태를 하나의 JSON 컬럼에 저장 가능하다.

{
  "name": "홍길동",
  "age": 30,
  "skills": ["SQL", "Python"],
  "certified": true
}
반응형

📦 왜 JSON 타입을 쓰는가?

  • 스키마 유연성: 컬럼 구조를 자주 바꾸지 않아도 됨
  • 다양한 구조를 가진 데이터를 1개의 컬럼에 저장 가능
  • 비교, 조회, 수정이 전용 함수로 지원됨
  • 로그 데이터, 설정값, 옵션, 통계 등 정형화되지 않은 데이터 저장에 적합

🧱 JSON 데이터 타입 구조 예시

CREATE TABLE users (
  id INT PRIMARY KEY,
  profile JSON
);

데이터 삽입 예시:

INSERT INTO users (id, profile)
VALUES (1, '{
  "name": "철수",
  "age": 25,
  "email": "chulsoo@example.com",
  "address": {
    "city": "Seoul",
    "zip": "12345"
  }
}');

MySQL은 이 값을 문자열처럼 보이지만 내부적으로는 Binary JSON Format으로 저장함.
그 덕분에 빠른 탐색과 비교가 가능하다.

🔍 JSON 데이터 읽어보기 예시

기본적으로 -> 또는 ->> 연산자를 사용하거나, JSON_EXTRACT() 함수를 사용함

-- 이름 가져오기
SELECT profile->>'$.name' FROM users;

-- 도시 가져오기
SELECT JSON_EXTRACT(profile, '$.address.city') FROM users;
  • -> : JSON 객체 반환
  • ->> : 문자열 값 반환
  • $.필드 : JSON 내부 경로 (Path)
반응형

🧪 JSON 필드 존재 여부 체크

SELECT *
FROM users
WHERE JSON_CONTAINS_PATH(profile, 'one', '$.email');
  • 'one': 하나라도 존재하면 true
  • 'all': 모두 존재해야 true

💡 실무에서 자주 쓰이는 패턴

  • 사용자 맞춤 설정
  • 필터 옵션 저장 (예: 쇼핑몰 검색 조건)
  • 로그, 이벤트, 통계 등 스키마가 고정되지 않은 데이터
  • 복잡한 구조를 단일 테이블에 담아야 할 때

⚠️ 주의할 점

  • JSON 타입 컬럼은 일반적인 인덱스가 불가능
    → 성능 문제 발생 가능
  • 데이터 유효성 검증 없음 (JSON 형식만 맞으면 저장됨)
  • 자주 조회되는 필드는 일반 컬럼으로 분리하는 것이 좋음

📘 공식 문서 참고

https://dev.mysql.com/doc/refman/8.0/en/json.html

 

반응형