[MFC] SQLite 연동 및 사용법

반응형

SQLite는 작고, 빠르고, 믿을 수 있는 세계에서 가장 많이 사용되는 관계형 데이터베이스로서 1조 개가 넘는 SQLite 데이터베이스가 사용되고 있다고 합니다. 또한 모든 iOS, Android, Mac, Windows 디바이스 및 인터넷브라우저와 IoT 디바이스에서 사용할 수 있습니다. 단일 데이터베이스 파일의 최대 크기는 281TB라고 합니다.

 

1. SQLite 특징

  • 작은 사이즈: MySQL이나 PostgreSQL과 같은 데이터베이스는 클라이언트/서버 데이터베이스서 일반적으로 자체 디스크와 메모리가 있는 서버에서 별도의 프로세스로 실행해야 합니다. SQLite는 이와 반대로 임베디드 데이터베이스입니다. 즉 데이터베이스가 디바이스, 서버 또는 스마트폰 자체에 내장됩니다. SQLite 데이터베이스는 독립적인 단일 디스크 파일이며 크로스 플랫폼이기 때문에 별도의 서버 구성이 필요 없습니다. SQLite 데이터베이스를 열고, 읽고, 쓰기 위해서는 750KB 이하의 초소형 SQLite 라이브러리만 있으면 됩니다.
  • 빠른 속도: SQLite는 별도의 서버가 필요하지 않고 단일 디스크 파일이기 때문에 데이터 사이에서 네트워크 지연이 없습니다. 그리고 fread(), fwrite() 같은 C 함수를 사용하여 파일시스템에 직접 쓸 때보다 35% 더 빠를 수 있다고 합니다.
  • 높은 신뢰성: SQLite는 세 명의 챔피언급 개발자가 개발 및 유지관리하고 있으며 다른 오픈소스 프로젝트처럼 임의의 사람들로부터 코드 기여를 받지 않고 있습니다. 덕분에 XZ 백도어 사건과 같이 외부인으로부터 코드가 오염될 경로가 원천 차단되어 보안에도 좋은 장점이 있습니다. 개발자들은 최소 2050년까지 SQLite를 지원할 것이라고 하였으며 문서화, 주석 처리, 크로스 플랫폼 및 하위 호환성을 유지하겠다고 약속했습니다. 또한 코드가 완전히 테스트된 상태로 유지되고 있는데  SQLite 소스코드가 15만 5천 개 이상의 소스 코드 줄로 구성되어 있을 때 테스트 코드와 테스트 스크립트의 소스코드는 9,200만 줄입니다. 9,200만 개의 라인의 테스트 소스코드로 15만 5천 개의 소스코드 줄을 테스트하는 것입니다. 즉, 코드보다 600배나 많은 테스트로 신뢰성을 보장하고 있습니다. 이를 위해 개발자들은 1년 내내 주당 60시간씩 일을 했다고 하네요.

2. SQLite 다운로드 및 라이브러리 파일 연동하기

Windows 환경의 MFC 프로젝트 기준으로 설명합니다.

SQLite 공식 홈페이지에서는 풀 소스코드, 아말감 버전 소스코드(모든 내용을 하나의 파일에 취합한 버전), x86/x64 DLL 을 다운로드할 수 있습니다. MFC를 위한 정적라이브러리 파일 생성은 매뉴얼에 내용이 없고 아말감 버전의 소스코드도 MFC 프로젝트에서는 일반적인 방법으로는 빌드가 안 되는 것을 확인하였습니다. 따라서 DLL을 다운로드하여 사용합니다. 

2.1. 소스코드 등 다운로드

http://sqlite.org

 

SQLite Home Page

SQLite is a C-language library that implements a small, fast, self-contained, high-reliability, full-featured, SQL database engine. SQLite is the most used database engine in the world. SQLite is built into all mobile phones and most computers and comes bu

sqlite.org

위 사이트의 SQLite Download Page에서 amalgamation 타입의 Source Code와 Precompiled Binaries for Windows를 다운로드 받습니다. 저는 32-bit, 64-bit 프로젝트에 사용할 예정이라 32-bit도 받았으며 작성일 기준 파일명은 다음과 같습니다.

  • sqlite-amalgamation-3450300.zip : sqlite3.h 헤더파일 들어있음
  • sqlite-dll-win-x64-3450300.zip : sqlite3.dll(64비트)과 sqlite3.def 파일 들어있음
  • sqlite-dll-win-x86-3450300.zip : sqlite3.dll(32비트)과 sqlite3.def 파일 들어있음

2.2. .lib 파일 생성

SQLite의 DLL파일은 C언어로 작성되었지만 MFC 프로젝트는 C++ 언어로 작성됩니다. 따라서 C언어 함수를 C++ 프로그램에서 사용하기 위해서는 함수 이름과 매개 변수 형식을 C++ 컴파일러에게 알려줘야 하는데 이 역할을 하는 것이 sqlite3.def 파일입니다. C++ 컴파일러는 .def 파일을 통해 DLL 함수를 어떻게 사용해야 하는지 파악하고, 프로그램 코드를 적절하게 연결합니다. 따라서 이 과정에서 생성되는 .lib 파일은 독립적으로 사용할 수 있는 정적라이브러리 파일이 아니라 .def 파일을 기반으로 DLL 파일의 정보를 담은 파일이기 때문에 컴파일러는 .lib파일을 통해 DLL 함수에 대한 정보를 얻고 프로그램 코드와 DLL 함수를 연결합니다. MSVC 설치 시 패키지로 함께 설치되는 Developer Command Prompt를 활용하여 .lib 파일을 생성할 수 있습니다. "lib" 명령어를 사용하며 다음 x86 버전 생성 예제를 확인합니다.

Developer Command Prompt

x86버전 > lib /def:sqlite3.def /machine:x86
x64버전 > lib /def:sqlite3.def /machine:x64

D:\dev\util\sqllite\sqlite-dll-win-x86-3450300>dir
D:\dev\util\sqllite\sqlite-dll-win-x86-3450300 디렉터리

2024-05-08  오후 03:43             8,226 sqlite3.def
2024-05-08  오후 03:43         2,485,760 sqlite3.dll
               2개 파일           2,493,986 바이트
               2개 디렉터리  972,652,843,008 바이트 남음

D:\dev\util\sqllite\sqlite-dll-win-x86-3450300>lib /def:sqlite3.def /machine:x86
Microsoft (R) Library Manager Version 14.38.33134.0
Copyright (C) Microsoft Corporation.  All rights reserved.

   Creating library sqlite3.lib and object sqlite3.exp

D:\dev\util\sqllite\sqlite-dll-win-x86-3450300>dir
D:\dev\util\sqllite\sqlite-dll-win-x86-3450300 디렉터리

2024-05-08  오후 03:43             8,226 sqlite3.def
2024-05-08  오후 03:43         2,485,760 sqlite3.dll
2024-05-08  오후 04:06            51,632 sqlite3.exp
2024-05-08  오후 04:06            86,004 sqlite3.lib
               4개 파일           2,631,622 바이트
               2개 디렉터리  972,652,703,744 바이트 남음

D:\dev\util\sqllite\sqlite-dll-win-x86-3450300>

sqlite.lib 파일을 확인할 수 있습니다. 헤더파일 사이즈는 627KB네요.

 

3. MFC 프로젝트 적용

기존 프로젝트 파일 경로에 sqlite3.lib, sqlite3.h 파일을 복사하고 프로젝트 설정에서 참조 경로를 잡습니다.

소스코드 경로에 "prebuilt/SQLite" 경로를 신규 생성하고 헤더파일과 라이브러리 파일을 복사합니다.

실행파일 존재 경로에 sqlite3.dll 파일을 복사합니다.

sqlite3.lib 파일과 sqlite3.h 를 프로젝트 폴더에 복사
프로젝트 솔루션탐색기에 헤더파일 추가

프로젝트 속성창에서 다음 항목을 설정합니다.

  • Linker > General > Additional Library Directories: $(ProjectDir)\prebuilt\sqlite\
  • Linker > Input > Additional Dependencies: sqlite3.lib
  • C/C++ > Additional Include Directories: $(ProjectDir)\prebuilt\

4. 테스트 코드 작성

SQLite 버전을 출력하는 테스트 코드를 작성해 봅니다. 임의의 .cpp 파일에 다음의 내용을 작성 후 호출하여 결과를 확인해 봅니다.

#include "prebuilt/SQLite/sqlite3.h"

printf("[INFO] SQLite version (%s)\n", sqlite3_libversion());

 

테스트 코드 결과 확인

 

이상으로 MFC 프로젝트에서 SQLite를 사용하는 방법을 알아보았습니다.

반응형