SQLite - C/C++ 초급자를 위한 가이드

안녕하세요, 꿈나무 프로그래머 여러분! 오늘 우리는 C/C++를 사용하여 SQLite의 세계로 흥미로운 여정을 떠납니다. 코드를 한 줄도 적어보지 않았다면 걱정하지 마세요 - 우리는 매우 기본적인 것부터 시작하여 차근차근 올라갈 것입니다. 이 튜토리얼이 끝나면 여러분이 이룰 수 있는 것에 놀라게 될 것입니다!

SQLite - C/C++

SQLite란?

코드에 들어가기 전에 SQLite가 무엇인지 이해해 보겠습니다. 디지털 노트북을 상상해 보세요. 여기서 여러 가지 정보를 체계적으로 저장할 수 있습니다. SQLite는 바로 그런东西입니다 - 서버 프로세스가 필요하지 않은 경량형, 파일 기반 데이터베이스입니다. 마치 여러분의 주머니 속에 있는 작은 데이터베이스似的입니다!

C/C++ 인터페이스 API

C/C++를 사용하여 SQLite와 상호작용하려면 API(응용 프로그램 인터페이스)를 사용해야 합니다. 이 API는 우리의 C/C++ 프로그램이 SQLite와 소통할 수 있게 해주는 특별한 도구라고 생각해 보세요. 다음은 우리가 사용할 주요 API입니다:

API 함수 설명
sqlite3_open() SQLite 데이터베이스에 연결을 여는 함수
sqlite3_exec() SQL 문을 실행하는 함수
sqlite3_close() 데이터베이스 연결을 닫는 함수
sqlite3_errmsg() 오류 메시지를 반환하는 함수

이제 이름이 무서워 보일 수 있지만, 걱정 마세요. 우리는 많은 예제와 함께 하나씩 탐구해 나갈 것입니다!

데이터베이스 연결

먼저 데이터베이스에 연결해 보겠습니다. 이는 디지털 노트북을 열어 쓰기 시작하는 것과 같습니다.

#include <stdio.h>
#include <sqlite3.h>

int main() {
sqlite3 *db;
int rc = sqlite3_open("test.db", &db);

if (rc) {
fprintf(stderr, "데이터베이스 열 수 없음: %s\n", sqlite3_errmsg(db));
return(0);
} else {
fprintf(stderr, "데이터베이스 성공적으로 열림\n");
}

sqlite3_close(db);
return 0;
}

이를 구분해 보면:

  1. 필요한 헤더 파일을 포함합니다: stdio.h는 입력/출력을 위한 것이고, sqlite3.h는 SQLite 함수를 위한 것입니다.
  2. main() 함수에서 sqlite3 포인터를 선언하여 데이터베이스 연결을 나타냅니다.
  3. sqlite3_open()을 사용하여 "test.db"라는 데이터베이스를 엽니다 (또는 새로 만듭니다).
  4. 연결이 성공적이었는지 확인합니다. 아니면 오류 메시지를 출력합니다.
  5. 마지막으로 데이터베이스 연결을 닫습니다.

테이블 생성

이제 노트북을 열었으니, 정보를 저장할 페이지를 만들어 보겠습니다. 데이터베이스 용어로는 이를 테이블이라고 합니다.

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

rc = sqlite3_open("test.db", &db);

if (rc) {
fprintf(stderr, "데이터베이스 열 수 없음: %s\n", sqlite3_errmsg(db));
return(0);
}

char *sql = "CREATE TABLE STUDENTS("
"ID INT PRIMARY KEY     NOT NULL,"
"NAME           TEXT    NOT NULL,"
"AGE            INT     NOT NULL,"
"GRADE          CHAR(1) );";

rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);

if (rc != SQLITE_OK) {
fprintf(stderr, "SQL 오류: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "테이블 성공적으로 생성\n");
}

sqlite3_close(db);
return 0;
}

이 예제에서:

  1. 데이터베이스를 여는 방법은과거와 동일합니다.
  2. SQL 문을 정의하여 STUDENTS라는 테이블을 생성합니다. 이 테이블에는 ID, NAME, AGE, GRADE라는 컬럼이 있습니다.
  3. sqlite3_exec()를 사용하여 SQL 문을 실행합니다.
  4. 실행이 성공적이었는지 확인하고 적절한 메시지를 출력합니다.

INSERT 연산

테이블이 준비되었으니, 이제 데이터를 추가해 보겠습니다.

char *sql = "INSERT INTO STUDENTS (ID,NAME,AGE,GRADE) "
"VALUES (1, 'Alice', 20, 'A' ); "
"INSERT INTO STUDENTS (ID,NAME,AGE,GRADE) "
"VALUES (2, 'Bob', 21, 'B' ); ";

rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);

if (rc != SQLITE_OK) {
fprintf(stderr, "SQL 오류: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "레코드 성공적으로 추가\n");
}

여기서 우리는 STUDENTS 테이블에 두 개의 레코드를 추가하고 있습니다. SQL 문은 INSERT INTO 구문을 사용하여 새로운 행을 추가합니다.

SELECT 연산

이제 추가한 데이터를 검색해 보겠습니다. 데이터베이스의 진정한 마법은 여기에서 빛을 발합니다!

static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
for(int i = 0; i < argc; i++) {
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}

// main() 함수 내에서
char *sql = "SELECT * from STUDENTS";
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);

if (rc != SQLITE_OK) {
fprintf(stderr, "SQL 오류: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "작업 성공적으로 완료\n");
}

이 예제는 콜백 함수를 소개합니다. 우리가 SELECT를 수행할 때, SQLite는 결과集中的 각 행에 대해 이 콜백 함수를 호출합니다. 마치 노트북의 각 항목을 읽어주는 비서似的입니다!

UPDATE 연산

데이터를 잘못 입력했고 변경해야 한다면? 그때 UPDATE를 사용합니다.

char *sql = "UPDATE STUDENTS set GRADE = 'A' where ID=2";
rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);

if (rc != SQLITE_OK) {
fprintf(stderr, "SQL 오류: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "레코드 성공적으로 업데이트\n");
}

이 SQL 문은 Bob의 학점을 A로 변경합니다. Bob, 잘 했어!

DELETE 연산

때로는 데이터를 제거해야 할 필요가 있습니다. 레코드를 제거하는 방법을 보겠습니다.

char *sql = "DELETE from STUDENTS where ID=2";
rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);

if (rc != SQLITE_OK) {
fprintf(stderr, "SQL 오류: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "레코드 성공적으로 제거\n");
}

이 명령은 Bob의 레코드를 테이블에서 제거합니다. Bob, 안녕!

이제 우리는 C/C++를 사용하여 SQLite의 기본적인 작업을 다룰 줄 배웠습니다! 기억하시라, 프로그래밍은 새로운 언어를 배우는 것과 같습니다 - 연습이 필요합니다. 즉시 이해가 되지 않는다면 실망하지 마세요. 계속 실험하고, 곧 프로처럼 데이터베이스 애플리케이션을 작성하게 될 것입니다!

Credits: Image by storyset