Mac os 환경에서 C++를 사용해서 Mysql과 연동하여
소스코드를 작성하는 방법을 보자.
일단, 해당글에서는 mac os 에 mysql 은 이미 설치되었다고 가정하고
설명을 진행하겠다.
1. mysql-connector-c++ 설치
2023.08.12 기준, homebrew 를 통해서 설치가능한 c++ mysql connector의
최신버전은 8.0.33_1 버전이다.
터미널을 열어서 아래와 같은 명령어를 실행시켜주자.
brew install mysql-connector-c++
그리고 homebrew를 통해서 설치된 라이브러리가 존재하는 디렉터리로 이동해 보자.
아래의 주소는 각자의 환경마다 다를 수 있으니 참고만 하자.
위에서 mysql-connector-c++ 디렉터리에 접근해 보자.
아래와 같이 해당 라이브러리가 8.0.33_1 버전임을 확인할 수 있다.
해당 버전 디렉터리에 접근을 해보면 아래와 같은 파일들이 존재하는 것을 볼 수 있다.
여기서 컴파일할 때 옵션으로 적어줘야 하는 것은 include, lib이다.
2. Compile check
첫 번째로 Mysql에서 스키마 작업을 위해서 데이터베이스 클라이언트 툴을 실행시켜 주자.
먼저 사용하고 있는 스키마에 접속한 다음, 아래와 같이 테스트 테이블을 작성해 주자.
use admin -- 사용하는 스키마에 접속
-- 테스트 테이블 작성
CREATE TABLE C_TEST (
seq INT AUTO_INCREMENT PRIMARY KEY,
rand_key INT NOT NULL
);
그다음, 특정 경로에서 아래와 같은 C++ 소스코드를 작성해 주자.
아래의 코드는 mysql 인스턴스에 연결해 준 다음, 위에서 생성해 준 테이블에
더미데이터 하나를 넣어주는 소스이다.
#include <iostream>
#include <mysqlx/xdevapi.h>
using namespace std;
int main() {
try {
// mysql 의 호스트명, 포트, 계정명, 계정 비밀번호
mysqlx::Session session("localhost", 3306, "root", "123");
// Use testdb database
mysqlx::Schema db = session.getSchema("admin");
mysqlx::Table table = db.getTable("C_TEST");
// CREATE: Insert data
table.insert("rand_key").values(25).execute();
} catch (const std::exception& e) {
cerr << "Error: " << e.what() << endl;
}
return 0;
}
컴파일은 아래와 같은 방법으로 할 수 있다.
터미널을 킨 다음 아래와 같이 입력해 주면 된다.
{} -> 해당 괄호는 설명을 위해 작성해 준 것으로 실제 컴파일할 때는 넣으면 안 된다.
/usr/bin/g++ -fdiagnostics-color=always -g -std=c++17
{소스코드.cpp} -o {컴파일된 결과 이름}
-I/opt/homebrew/Cellar/mysql-connector-c++/8.0.33_1/include
-L/opt/homebrew/Cellar/mysql-connector-c++/8.0.33_1/lib
-lmysqlcppconn8
실제 예시는 아래와 같다.
/usr/bin/g++ -fdiagnostics-color=always -g -std=c++17
/Users/sinseunghwan/Documents/wd/dev/c++/c_plus_conn.cpp -o /Users/sinseunghwan/Documents/wd/dev/c++/c_plus_conn
-I/opt/homebrew/Cellar/mysql-connector-c++/8.0.33_1/include
-L/opt/homebrew/Cellar/mysql-connector-c++/8.0.33_1/lib
-lmysqlcppconn8
컴파일이 문제없이 완료되었다면, 컴파일된 파일이 생길 것이다.
컴파일된 파일을 실행시켜 보자.
그럼 아래와 같은 오류를 만날 수 있다.
현재 mysql 은 정상적으로 3306 포트를 사용해서 실행되고 있는 모습을 볼 수 있다.
해당 문제는 사실 c++ 소스코드를 mysql 인스턴스 자체에
바로 connect 시키려고 시도하여 발생하는 오류이다.
이는 C++ 소스가 mysqlx를 통해서 mysql 인스턴스와 통신하기 때문이다.
mysqlx는 MySQL Server 8.0부터 도입된 X DevAPI를 사용하기 위한 MySQL 클라이언트 유틸리티이다.
이 인터페이스를 사용하려면 mysqlx 프로토콜을 지원하는 클라이언트 라이브러리가 필요하며,
이 프로토콜은 33060 포트를 통해 통신한다.
아래와 같이 33060 포트를 확인해 보자.
X DevAPI는 개발자들이 MySQL과 상호작용하기 위해 제공하는 모던한 개발 API로
JSON 문서 스토어, CRUD 작업, 프로토콜에 대한 지원 등 다양한 기능을 제공한다.
아래는 X DevAPI 관련된 몇 가지 주요 사항이다.
1) CRUD 작업
X DevAPI를 통해 SQL 쿼리를 사용하지 않고도
데이터를 생성(Create), 읽기(Read), 수정(Update), 삭제(Delete)하는 CRUD 작업을 수행할 수 있다.
2) JSON 문서 스토어
X DevAPI는 MySQL의 JSON 문서 스토어 기능을 완벽하게 지원한다.
이를 통해 스키마가 없는 데이터를 MySQL에 저장하고 관리할 수 있습니다.
3) MySQL X 프로토콜
X DevAPI는 MySQL X 프로토콜을 사용한다.
이는 기존의 MySQL 클라이언트/서버 프로토콜과는 다르게,
비동기 작업과 CRUD 작업을 위한 특별한 메시지 포맷을 지원한다.
4) 세션
X DevAPI는 MySQL과의 연결을 세션(session)으로 관리한다.
세션은 전통적인 데이터베이스 연결과 비슷하지만, 복수의 클라이언트 연결을 관리할 수 있다.
5) 표현식
X DevAPI는 특별한 표현식 문법을 제공하여,
CRUD 작업 시 복잡한 데이터 조작이나 필터링을 할 수 있다.
즉 소스코드를 아래와 같이 변경한다면, 정상적으로 원하는 결과가 나오게 된다.
#include <iostream>
#include <mysqlx/xdevapi.h>
using namespace std;
int main() {
try {
mysqlx::Session session("localhost", 33060, "root", "1234");
// Use testdb database
mysqlx::Schema db = session.getSchema("admin");
mysqlx::Table table = db.getTable("C_TEST");
// CREATE: Insert data
table.insert("rand_key").values(25).execute();
} catch (const std::exception& e) {
cerr << "Error: " << e.what() << endl;
}
return 0;
}
'C,C++' 카테고리의 다른 글
[C++] Mysql select, insert, update, delete (0) | 2023.08.16 |
---|---|
[C++] 멀티스레드 프로그래밍 (0) | 2023.08.15 |
[C,C++] 포인터 배열, 배열 포인터 (2) | 2023.02.05 |
[C/C++] 포인터 (0) | 2022.06.02 |