MySQL 5.7 버전부터 도입된 JSON 데이터 타입을 사용하면 관계형 데이터베이스 안에서도 JSON 형식의 데이터를 손쉽게 저장하고 조회할 수 있습니다. 이 글에서는 JSON 타입 컬럼을 가진 테이블을 만들고, 데이터를 삽입한 뒤, JSON_CONTAINS() 함수로 특정 값을 조회하는 방법을 단계별로 살펴보겠습니다.
1단계: JSON 타입 테이블 생성하기
먼저 JSON 데이터 타입의 컬럼을 포함하는 테이블을 생성합니다.
mysql> create table DemoTable
-> (
-> StudentName json
-> );
Query OK, 0 rows affected (0.74 sec)
2단계: JSON 데이터 삽입하기
INSERT 문을 사용하여 JSON 배열 형태의 문자열을 그대로 삽입할 수 있습니다.
mysql> insert into DemoTable values('["John", "Chris", "Robert","David","Sam"]');
Query OK, 1 row affected (0.33 sec)
3단계: 저장된 데이터 확인하기
SELECT 문으로 테이블의 전체 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+---------------------------------------------+
| StudentName |
+---------------------------------------------+
| ["John", "Chris", "Robert", "David", "Sam"] |
+---------------------------------------------+
1 row in set (0.00 sec)
4단계: JSON_CONTAINS()로 조건 조회하기
JSON 배열 안에 특정 값이 포함되어 있는지 확인하려면 JSON_CONTAINS() 함수를 사용합니다. 아래 쿼리는 'Chris'라는 이름이 포함된 행만 반환합니다.
mysql> SELECT *from DemoTable WHERE JSON_CONTAINS(StudentName, '["Chris"]');
실행 결과는 다음과 같습니다.
+---------------------------------------------+
| StudentName |
+---------------------------------------------+
| ["John", "Chris", "Robert", "David", "Sam"] |
+---------------------------------------------+
1 row in set (0.04 sec)
함께 알아두면 좋은 JSON 조회 팁
JSON_CONTAINS() 외에도 MySQL은 다양한 JSON 함수를 제공합니다.
- JSON_EXTRACT(): JSON 문서에서 특정 경로의 값을 추출합니다. 예를 들어
JSON_EXTRACT(StudentName, '$[0]')은 배열의 첫 번째 요소인 "John"을 반환합니다. - -> 연산자(컬럼-경로 연산자):
StudentName->'$[0]'처럼 간결하게 값을 추출할 수 있으며, MySQL 5.7.13 이상에서 지원됩니다. - MEMBER OF 연산자: MySQL 8.0.17 이상에서는
'Chris' MEMBER OF (StudentName)처럼 더 직관적인 문법으로 배열 멤버 여부를 검사할 수 있습니다.
이처럼 MySQL의 JSON 데이터 타입과 내장 함수를 활용하면 별도의 애플리케이션 로직 없이도 SQL 쿼리만으로 JSON 데이터를 유연하게 필터링하고 조회할 수 있습니다.