본문 바로가기
-----ETC-----/C++ 고급 프로그래밍과 응용 프로젝트 시리즈

[C++ 고급 프로그래밍과 응용 프로젝트 시리즈] Day 27: C++에서의 데이터베이스 연동 (SQLite, MySQL)

by cogito21_cpp 2024. 8. 1.
반응형

SQLite 소개

SQLite는 경량의 자체 포함형 SQL 데이터베이스 엔진입니다. 서버가 필요 없으며, 데이터베이스가 하나의 파일로 저장됩니다. SQLite는 임베디드 시스템 및 소형 애플리케이션에 적합합니다.

 

SQLite 설치 및 설정

SQLite 설치

리눅스 환경에서 SQLite를 설치하려면 다음 명령어를 사용합니다.

sudo apt-get install sqlite3 libsqlite3-dev

 

SQLite와 C++ 연동

SQLite와 C++을 연동하여 데이터베이스를 사용하려면 sqlite3.h 헤더 파일과 libsqlite3 라이브러리를 사용해야 합니다.

 

1. 데이터베이스 연결 및 테이블 생성

다음 코드는 SQLite 데이터베이스에 연결하고, 테이블을 생성하는 예제입니다.

 

sqlite_example.cpp

#include <iostream>
#include <sqlite3.h>

static int callback(void* NotUsed, int argc, char** argv, char** azColName) {
    for (int i = 0; i < argc; i++) {
        std::cout << azColName[i] << ": " << argv[i] ? argv[i] : "NULL";
    }
    std::cout << std::endl;
    return 0;
}

int main() {
    sqlite3* db;
    char* zErrMsg = 0;
    int rc;

    // 데이터베이스 열기
    rc = sqlite3_open("test.db", &db);
    if (rc) {
        std::cerr << "Can't open database: " << sqlite3_errmsg(db) << std::endl;
        return(0);
    } else {
        std::cout << "Opened database successfully" << std::endl;
    }

    // SQL 실행
    const char* sql = "CREATE TABLE COMPANY("  \
                      "ID INT PRIMARY KEY     NOT NULL," \
                      "NAME           TEXT    NOT NULL," \
                      "AGE            INT     NOT NULL," \
                      "ADDRESS        CHAR(50)," \
                      "SALARY         REAL );";

    rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
    if (rc != SQLITE_OK) {
        std::cerr << "SQL error: " << zErrMsg << std::endl;
        sqlite3_free(zErrMsg);
    } else {
        std::cout << "Table created successfully" << std::endl;
    }

    // 데이터베이스 닫기
    sqlite3_close(db);
    return 0;
}

 

이 코드는 SQLite 데이터베이스 파일 test.db를 열고, COMPANY 테이블을 생성합니다.

 

2. 데이터 삽입 및 조회

다음 코드는 COMPANY 테이블에 데이터를 삽입하고 조회하는 예제입니다.

 

sqlite_example.cpp (계속)

int main() {
    sqlite3* db;
    char* zErrMsg = 0;
    int rc;

    // 데이터베이스 열기
    rc = sqlite3_open("test.db", &db);
    if (rc) {
        std::cerr << "Can't open database: " << sqlite3_errmsg(db) << std::endl;
        return(0);
    } else {
        std::cout << "Opened database successfully" << std::endl;
    }

    // 데이터 삽입
    const char* sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "  \
                      "VALUES (1, 'Paul', 32, 'California', 20000.00 ); " \
                      "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "  \
                      "VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); "     \
                      "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
                      "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );" \
                      "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
                      "VALUES (4, 'Mark', 25, 'Rich-Mond', 65000.00 );";

    rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
    if (rc != SQLITE_OK) {
        std::cerr << "SQL error: " << zErrMsg << std::endl;
        sqlite3_free(zErrMsg);
    } else {
        std::cout << "Records created successfully" << std::endl;
    }

    // 데이터 조회
    sql = "SELECT * from COMPANY";

    rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
    if (rc != SQLITE_OK) {
        std::cerr << "SQL error: " << zErrMsg << std::endl;
        sqlite3_free(zErrMsg);
    } else {
        std::cout << "Operation done successfully" << std::endl;
    }

    // 데이터베이스 닫기
    sqlite3_close(db);
    return 0;
}

 

이 코드는 COMPANY 테이블에 데이터를 삽입하고, 모든 레코드를 조회하여 출력합니다.

 

MySQL 소개

MySQL은 널리 사용되는 오픈 소스 관계형 데이터베이스 관리 시스템(RDBMS)입니다. 대규모 데이터베이스 애플리케이션에 적합합니다.

 

MySQL 설치 및 설정

MySQL 설치

리눅스 환경에서 MySQL을 설치하려면 다음 명령어를 사용합니다.

sudo apt-get install mysql-server libmysqlclient-dev

 

MySQL 설정

MySQL 서버를 설치한 후, MySQL 서비스가 실행 중인지 확인합니다.

sudo systemctl start mysql
sudo systemctl enable mysql

 

MySQL 서버에 접속하여 데이터베이스와 사용자 계정을 생성합니다.

sudo mysql -u root -p

CREATE DATABASE testdb;
CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON testdb.* TO 'testuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

 

MySQL과 C++ 연동

MySQL과 C++을 연동하기 위해 mysql.h 헤더 파일과 libmysqlclient 라이브러리를 사용해야 합니다.

 

1. 데이터베이스 연결 및 테이블 생성

다음 코드는 MySQL 데이터베이스에 연결하고, 테이블을 생성하는 예제입니다.

 

mysql_example.cpp

#include <mysql/mysql.h>
#include <iostream>

int main() {
    MYSQL *conn;
    MYSQL_RES *res;
    MYSQL_ROW row;

    const char *server = "localhost";
    const char *user = "testuser";
    const char *password = "password"; /* set me first */
    const char *database = "testdb";

    conn = mysql_init(NULL);

    // 데이터베이스 연결
    if (!mysql_real_connect(conn, server, user, password, database, 0, NULL, 0)) {
        std::cerr << "mysql_real_connect() failed\n";
        mysql_close(conn);
        return 1;
    }

    // SQL 실행
    if (mysql_query(conn, "CREATE TABLE IF NOT EXISTS COMPANY (ID INT PRIMARY KEY, NAME TEXT, AGE INT, ADDRESS CHAR(50), SALARY REAL)")) {
        std::cerr << "CREATE TABLE failed. Error: " << mysql_error(conn) << std::endl;
        mysql_close(conn);
        return 1;
    }

    std::cout << "Table created successfully" << std::endl;

    // 데이터베이스 닫기
    mysql_close(conn);
    return 0;
}

 

이 코드는 MySQL 데이터베이스 testdb에 연결하고, COMPANY 테이블을 생성합니다.

 

2. 데이터 삽입 및 조회

다음 코드는 COMPANY 테이블에 데이터를 삽입하고 조회하는 예제입니다.

 

mysql_example.cpp (계속)

int main() {
    MYSQL *conn;
    MYSQL_RES *res;
    MYSQL_ROW row;

    const char *server = "localhost";
    const char *user = "testuser";
    const char *password = "password"; /* set me first */
    const char *database = "testdb";

    conn = mysql_init(NULL);

    // 데이터베이스 연결
    if (!mysql_real_connect(conn, server, user, password, database, 0, NULL, 0)) {
        std::cerr << "mysql_real_connect() failed\n";
        mysql_close(conn);
        return 1;
    }

    // SQL 실행 - 테이블 생성
    if (mysql_query(conn, "CREATE TABLE IF NOT EXISTS COMPANY (ID INT PRIMARY KEY, NAME TEXT, AGE INT, ADDRESS CHAR(50), SALARY REAL)")) {
        std::cerr << "CREATE TABLE failed. Error: " << mysql_error(conn) << std::endl;
        mysql_close(conn);
        return 1;
    }

    std::cout << "Table created successfully" << std::endl;

    // 데이터 삽입
    if (mysql_query(conn, "INSERT INTO

 COMPANY (ID, NAME, AGE, ADDRESS, SALARY) VALUES (1, 'Paul', 32, 'California', 20000.00)")) {
        std::cerr << "INSERT failed. Error: " << mysql_error(conn) << std::endl;
        mysql_close(conn);
        return 1;
    }

    if (mysql_query(conn, "INSERT INTO COMPANY (ID, NAME, AGE, ADDRESS, SALARY) VALUES (2, 'Allen', 25, 'Texas', 15000.00)")) {
        std::cerr << "INSERT failed. Error: " << mysql_error(conn) << std::endl;
        mysql_close(conn);
        return 1;
    }

    std::cout << "Records inserted successfully" << std::endl;

    // 데이터 조회
    if (mysql_query(conn, "SELECT * FROM COMPANY")) {
        std::cerr << "SELECT failed. Error: " << mysql_error(conn) << std::endl;
        mysql_close(conn);
        return 1;
    }

    res = mysql_store_result(conn);

    if (res == NULL) {
        std::cerr << "mysql_store_result() failed. Error: " << mysql_error(conn) << std::endl;
        mysql_close(conn);
        return 1;
    }

    int num_fields = mysql_num_fields(res);

    while ((row = mysql_fetch_row(res))) {
        for (int i = 0; i < num_fields; i++) {
            std::cout << (row[i] ? row[i] : "NULL") << " ";
        }
        std::cout << std::endl;
    }

    // 결과 해제 및 데이터베이스 닫기
    mysql_free_result(res);
    mysql_close(conn);
    return 0;
}

 

이 코드는 COMPANY 테이블에 데이터를 삽입하고, 모든 레코드를 조회하여 출력합니다.

 

빌드 및 실행

1. SQLite 예제 빌드 및 실행

g++ sqlite_example.cpp -o sqlite_example -lsqlite3
./sqlite_example

 

2. MySQL 예제 빌드 및 실행

g++ mysql_example.cpp -o mysql_example `mysql_config --cflags --libs`
./mysql_example

 

이제 SQLite와 MySQL을 사용하여 데이터베이스 연동을 구현하고, 데이터를 삽입하고 조회하는 예제를 실행할 수 있습니다.

 

이제 27일차의 학습을 마쳤습니다. SQLite와 MySQL을 사용하여 C++ 애플리케이션에서 데이터베이스를 연동하고 사용하는 방법을 학습하고 실습해보았습니다.

 

질문이나 피드백이 있으면 언제든지 댓글로 남겨 주세요. 내일은 "C++로 게임 개발 (SFML, SDL)"에 대해 학습하겠습니다.

반응형