C,C++

[C++] Mac os 에서 Mysql 연결하기

ssh9308 2023. 8. 14. 09:00
반응형

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;
}

 

 

 

 

반응형