본문 바로가기

MySQL

[짧은 기록] X DevAPI란

MySQL 서버를 Document DB처럼 사용하기 위해 MySQL 5.7.12 버전부터 X Plugin이라는 신규 컴포넌트가 도입되었다. X 플러그인은 도큐먼트 스토어용 MySQL 서버를 위해 반드시 필요한 플러그인이며, MySQL 서버가 X Protocol을 사용해서 클라이언트와 통신할 수 있도록 해준다. 여기서 X 플러그인이 활성화(8.0 default) 되어 있는 MySQL 서버와 상호작용을 할 수 있도록 클라이언트측에 제공되는 것이 X DevAPI이다.

MySQL 도큐먼트 스토어에 연결하기 위해서는 MySQL 서버 인스턴스에 X DevAPI 세션을 생성해야 하는데, 애플리케이션에서 드라이버를 통해 생성할 수도 있지만 인터렉티브한 모드를 제공하는 MySQL Shell을 통해 세션을 생성해보도록 하자.

MySQL Shell은 자바스크립트, 파이썬, SQL로 모드 전환이 가능하며, 기본적으로 자바스크립트와 파이썬에 X DevAPI가 구현되어 있다. (예시는 파이썬)

 

## MySQLShell 접속
$ mysqlsh -u root -p

MySQL Shell 8.0.35

Copyright (c) 2016, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
Other names may be trademarks of their respective owners.

Type '\help' or '\?' for help; '\quit' to exit.
Creating a session to 'root@localhost'
Fetching schema names for auto-completion... Press ^C to stop.
Your MySQL connection id is 706 (X protocol)
Server version: 8.1.0-debug Source distribution
No default schema selected; type \use <schema> to set one.

## 모드 전환
MySQL  localhost:33060+ ssl  JS > \py
Switching to Python mode...
MySQL  localhost:33060+ ssl  Py >

 

(참고로, 세션은 mysqlx 팩토리에 의해 생성되며, 반환된 세션은 X 플러그인을 실행하는 하나 이상의 MySQL 서버 인스턴스에 대한 접근을 캡슐화할 수 있다. )

모드 전환을 하고나서, mysqlx.getSession(connection) 메소드를 사용하여 X DevAPI 세션을 생성한다.

 

Py> session=mysqlx.get_session('root:<password>@localhost')
Py> db=session.get_schema('test')
Py> print(db)
<Schema:test>

 

test 스키마에 신규 컬렉션 데이터를 생성하고 조회해본다. mongo 클라이언트와 같이 탭을 누르면 자동완성 및 관련 메소드가 조회된다.

 

## test 스키마 선택
Py> \use test

## 컬렉션 생성
test Py> db.create_collection('silver')
<Collection:silver>

## 도큐먼트 생성
test Py> db.silver.add({'id':1, 'name':'leebumhwak'})

## 도큐먼트 조회
test Py> db.silver.find()
{
    "id": 1,
    "_id": "000065505fc20000000000000003",
    "name": "leebumhwak"
}
1 document in set (0.0055 sec)

 

이번에는 SQL 모드로 전환하여 해당 컬렉션이 어떤 테이블 구조로 생성되어 있는지 확인해보자.

 

## SQL 모드
test Py> \sql

## 테이블 명세 조회
test SQL> show create table silver;
CREATE TABLE `silver` (
  `doc` json DEFAULT NULL,
  `_id` varbinary(32) GENERATED ALWAYS AS (json_unquote(json_extract(`doc`,_utf8mb4'$._id'))) STORED NOT NULL,
  `_json_schema` json GENERATED ALWAYS AS (_utf8mb4'{"type":"object"}') VIRTUAL,
  PRIMARY KEY (`_id`),
  CONSTRAINT `$val_strict_A7BC7DAEC0FCFED7D6993CED43BC75D6F6B5CC59` CHECK (json_schema_valid(`_json_schema`,`doc`))
)

test Py> SELECT * FROM silver;
+------------------------------------------------------------------------+------------------------------------------------------------+--------------------+
| doc                                                                    | _id                                                        | _json_schema       |
+------------------------------------------------------------------------+------------------------------------------------------------+--------------------+
| {"id": 1, "_id": "000065505fc20000000000000003", "name": "leebumhwak"} | 0x30303030363535303566633230303030303030303030303030303033 | {"type": "object"} |
+------------------------------------------------------------------------+------------------------------------------------------------+--------------------+

 

doc 필드를 통해서 generated column 타입의, 물리적으로 저장되는 _id 필드와 가상의 _json_schema 필드가 자동으로 생성된다.