[Unity] Unity에 Sqlite 연동하기(DB 읽기, DB 쓰기, DB 테이블 만들기)

유니티에서 DB를 이용하는 방법은 많습니다. 대표적으로 PlayerPrefs, JsonUtility, SQLite 등 이 있습니다. 그러나 Sqlite는 경량화, 빠른 처리 속도, 안정성 등의 장점으로 많이 사용됩니다. 오늘은 유니티에 Sqlite를 연동하고 사용하는 방법에 대해 알아보도록 하겠습니다.

 


1. Sqlite 관련 파일 다운로드 및 가져오기

 

Unity에 Sqlite를 연동하기 위해서는 Sqlite.dll파일을 다운받고 유니티 파일에서 Mono.Data.Sqlite.dll을 가져와야 합니다. 먼저 Sqlite.dll 파일은 링크를 통해서 다운받을 수 있습니다. 링크로 들어가면 SqLite 다운로드 페이지로 들어가집니다. 다운로드 페이지에서 Precompiled Binaries for windows에서 Sqlite-dll-win64-x64-3410200.zip을 다운로드합니다. version은 다운로드하는 시기에 따라 변하기 때문에 이미지와 달라도 걱정할 필요 없습니다.

 

SQLite 다운로드 페이지

 


다운로드를 받고 압축을 풀어주시면 됩니다. 압축을 풀면 sqlite.dll파일과 sqlite3.def 파일을 확인할 수 있습니다. 이 파일은 Mono.Data.Sqlite.dll과 한 번에 유니티 Assets으로 옮길 것이니 일단 압축만 해제해 주시면 됩니다.

 

dll 파일 이미지

 


다음으로 Mono.Data.Sqlite.dll을 가져와야 합니다. 여러 블로그 혹은 홈페이지에 공유된 dll파일이 있을 수 있으나 Unity 버전이 맞지 않으면 오류가 뜨기 때문에 직접 가져와 주는것이 좋습니다. Mono.Data.Sqlite.dll은 아래와 같은 경로에 있습니다.

 

C:\Program Files\Unity\Hub\Editor\2021.3.16f1\Editor\Data\MonoBleedingEdge\lib\mono\4.5

 

경로가 찾기 어렵다면 유니티 Hub에서 설치 메뉴로 들어간 후 설치된 유니티 오른쪽에 톱니바퀴 아이콘을 눌러 탐색기에 표시를 눌러주시면 C:\Program Files\Unity\Hub\Editor\2021.3.16f1\Editor\까지 자동으로 들어가집니다.

 

유니티 에디터 이미지

 

여기서 2021.3.16f1은 필자의 유니티 버전입니다. 여러분들의 버전은 다를 수 있기 때문에 사용하는 버전의 폴더에 들어가주시면됩니다. 이제 여기서 Mono.Data.Sqlite.dll을 찾아서 복사를 해줍니다.

 

Mono.Data.Sqlite.dll 위치 이미지

 


이제 관련 파일은 전부 다운로드 받았습니다. 만약 PC 버전에서 sqlite를 사용하실 거라면 현재 파일들만 다운로드하면 됩니다. 그러나 안드로이드에서 sqlite를 사용할 예정이라면 안드로이드 관련 파일도 다운로드 받아야 합니다. 안드로이드 관련 파일은 아래와 같습니다. 안드로이드 관련 파일은 링크에서 다운로드 받았습니다. (필자는 Sqlite 작동을 PC버전에서만 테스트해봤습니다.)

 

Android.zip
0.56MB

 


이제 다운로드한 파일을 유니티에 넣어줘야 합니다. 먼저 유니티에 Plugins라는 폴더를 하나 만들어주고 Plugins 안에 sqlite.dll파일, sqlite3.def 파일, Mono.Data.Sqlite.dll을 넣어 줍니다.

 

 


안드로이드에서도 사용하실 거라면 Android 폴더를 Plugins 폴더 안에 만들어주시고 그 안에 위에서 다운로드한 libs파일을 Android 폴더에 넣어주시면 됩니다.

 

 


2. 데이터베이스(DB) 만들기

 

데이터베이스 테이블을 만드는 방법은 매우 다양합니다. 그러나 필자는 엑셀을 이용해 테이블을 만들어 사용하는 방법을 이용하겠습니다. 먼저 아래 그림처럼 엑셀을 이용해 필요한 데이터를 만들어 줍니다. 필자는 번호, 이름, 나이, 성별 데이터를 만들었습니다. 

 

 


데이터를 모두 만들었다면 엑셀을 저장합니다. 이때 '다른 이름으로 저장'을 이용해 파일 형식을 CSV로 만들어줘야 합니다. 

 

 


CSV 파일은 쉼표로 구분된 값(Comma Separated Values) 파일의 약자입니다. 이 파일 형식은 아래 그림과 같이 일반적으로 텍스트 파일로 작성되며, 각 줄은 쉼표 또는 세미콜론으로 구분된 값들의 집합으로 이루어져 있습니다. 

 

 


CSV 파일을 만들었다면 이제 CSV파일을 db파일로 만들어야 합니다. db 파일을 만드는 방법은 여러 종류가 있지만 필자는 DB Browser for SQLite를 이용해서 만들도록 하겠습니다. DB Browser for SQLite는 링크를 통해 다운로드할 수 있습니다. 링크에 접속한 후 Download 페이지에 들어가 컴퓨터 환경에 맞게 파일을 다운로드 받아줍니다. 필자는 no installer인 zip파일을 다운로드하였습니다.

 

DB Browser for SQLite는 SQLite 데이터베이스를 관리하기 위한 오픈소스 도구입니다. 이 도구는 SQLite 데이터베이스를 만들고 수정할 수 있는 그래픽 사용자 인터페이스(GUI)를 제공합니다. 이 도구를 사용하면 SQLite 데이터베이스를 쉽게 관리할 수 있으며, 데이터베이스에 저장된 정보를 쉽게 검색하고 수정할 수 있습니다.

 

 


다운로드한 Zip 파일을 압축해제 해줍니다. 그러면 아래 그림과 같이 폴더하나가 생기고 폴더 안에 DB browser for SQLite.exe가 있는 것을 확인할 수 있습니다. 이 실행파일을 실행해 줍니다.

 

 


만약 아무 이상이 없다면 아래 그림과 같이 정상적으로 시스템이 실행됩니다. 시스템이 실행되면 왼쪽 상단에 새 데이터베이스 버튼을 클릭합니다.

 

 


데이터 베이스를 저장하고 싶은 경로를 선택하고 파일 이름을 설정한 후 저장합니다.

 

 


저장을 하면 아래 그림과 같이 테이블 정의 변경 창이 자동으로 뜨게 됩니다. 우리는 엑셀로 만든 데이터를 가지고 와 테이블을 만들 것이기 때문에 닫기 버튼을 눌러줍니다.

 

 


그리고 왼쪽 상단 '파일 > 가져오기 > CSV파일에서 테이블 가져오기'를 선택합니다.

 

 


파일을 가져오면 아래와 같이 한글 데이터가 깨지는 것을 확인할 수 있습니다. (엑셀을 저장할 때 인코딩이 UTF-8로 저장됐다면 깨지는 현상이 발생하지 않습니다.)  

 

 


한글 깨짐 현상을 방지하기 위해서는 다음과 같은 절차가 필요합니다. 먼저 저장한 엑셀파일에서 마우스 오른쪽 버튼을 클릭한 후 '연결프로그램 > 메모장'을 선택하여 메모장으로 파일을 열어줍니다.

 

 


그리고 메모장에서 ctrl + Shift + S를 눌러 다른 이름으로 저장을 해줍니다. 이때 확장자, 이름을 변경할 필요 없이 ANSI로 인코딩 된 것을 UTF-8로만 변경해 주시면 됩니다.

 

변경전 인코딩이 ANSI로 설정됨

 

변경후 인코딩이 UTF-8로 설정됨

 


UTF-8로 저장을 한 후 DB browser for SQLite에서 csv를 불러오면 정상적으로 한글 폰트가 보이는 것을 확인할 수 있습니다.  불러온 csv를 테이블로 만들기 전에 '첫 행에 필드명 포함', '필드 앞뒤 공백 제거' 부분을 꼭 체크하고 확인을 눌러주세요.

 

 


완료가 되면 만든 저장한 엑셀이름으로 테이블이 만들어지는 것을 확인할 수 있습니다. 확인이 끝났다면 ctrl + s를 눌러 저장을 하고DB browser for SQLite를 종료해 줍니다.

 

 


DB browser for SQLite와 CSV를 이용해 만든 db파일을 유니티 Assets > StreamingAssets 폴더에 넣어줍니다. StreamingAssets 폴더는 처음에 존재하지 않기 때문에 사용자가 직접 만들어 줘야 합니다.

 

 


3. 유니티에서 데이터베이스(DB) 사용하기

 

유니티에서 스크립트를 하나 만들어줍니다.(스크립트를 생성하는 방법은 따로 설명하지 않겠습니다.) 유니티에서 SQLite를 사용하려면 Mono.Data.Sqlite 네임스페이스를 사용해야 합니다. 그렇기 때문에 스크립트 상단에 using Mono.Data.Sqlite를 추가해 줍니다.

 

아래는 SQLite 데이터베이스 불러오는 기본 코드입니다. 먼저 StreamingAssets에 저장한 db이름을 dbname에 넣어줍니다. 필자는 testdb로 이름을 정했기 때문에 testdb.db를 넣어줬습니다. 그리고 Application.streamingAssetsPath이용해 데이터베이스 파일의 경로를 만들어 connectionString에 할당해 줍니다. (Application.streamingAssetsPath는 Unity에서 제공하는 Application 클래스의 속성 중 하나로, 스트리밍 에셋 폴더의 경로를 나타냅니다.) 그리고 IDbConnection 인터페이스를 사용해 데이터베이스에 연결합니다. 

 

using UnityEngine;
using System.Data;
using Mono.Data.Sqlite;


public class Test : MonoBehaviour
{

    private void Start()
    {
        string dbname = "/testdb.db";
        string connectionString = "URI=file:" + Application.streamingAssetsPath + dbname;
        IDbConnection dbConnection = new SqliteConnection(connectionString);
        dbConnection.Open();
    }

}

 


3.1 데이터 베이스 읽기

 

아래 코드는 데이터베이스 파일에서 데이터를 읽는 예시 코드입니다. 코드에서는 IDbCommand 인터페이스를 사용해 데이터베이스에서 데이터를 쿼리 합니다. 그리고 데이터 리더(IdataReader)를 사용하여 쿼리 결과를 읽습니다. 코드에서는 MyTable이라는 테이블에서 모든 레코드를 가져와 이름(name)과 나이(age)를 출력합니다. (우리가 만든 테이블 이름을 적용해 주면 됩니다.) 데이터 읽기가 끝났다면 데이터베이스 연결을 종료합니다.

 

dbcommand.CommandText에 어떤 쿼리문을 입력하느냐에 따라 특정 데이터를 불러올 수도 있고, 모든 데이터를 불러올 수도 있습니다. 이 예제는 쿼리문에 관련된 내용을 알려드리는 글이 아니기에 쿼리문에 대한 부분을 생략하겠습니다.

 

using UnityEngine;
using System.Data;
using Mono.Data.Sqlite;


public class Test : MonoBehaviour
{

    private void Start()
    {
        string dbname = "/tttt.db";
        string connectionString = "URI=file:" + Application.streamingAssetsPath + dbname;
        IDbConnection dbConnection = new SqliteConnection(connectionString);
        dbConnection.Open();

        string tablename = "Test";

        IDbCommand dbCommand = dbConnection.CreateCommand();
        dbCommand.CommandText = "SELECT * FROM " + tablename;
        IDataReader dataReader = dbCommand.ExecuteReader();

        while (dataReader.Read())
        {
            string name = dataReader.GetString(1);
            int age = dataReader.GetInt32(2);
            Debug.Log("Name: " + name + ", Age: " + age);
        }

        dataReader.Close();

    }

}

 

 


3.2 데이터 베이스 쓰기

 

데이터를 추가하기 위해서는 우선 데이터베이스에 연결하고, INSERT 문을 사용하여 새로운 레코드를 추가해야 합니다. 먼저 데이터베이스에 연결합니다. 그리고 INSERT 문을 사용하여 데이터를 추가합니다. 코드에서는 새로운 레코드를 추가하기 위해 INSERT INTO 문을 사용했습니다. 이때, VALUES 절에는 새로 추가할 레코드의 값을 지정합니다. 코드에서는 문자열 타입의 name과 숫자 타입의 age를 추가하고 있습니다. 

 

using UnityEngine;
using System.Data;
using Mono.Data.Sqlite;


public class Test : MonoBehaviour
{

    private void Start()
    {
        string dbname = "/tttt.db";
        string connectionString = "URI=file:" + Application.streamingAssetsPath + dbname;
        IDbConnection dbConnection = new SqliteConnection(connectionString);
        dbConnection.Open();


        int no = 1;
        string name = "아무개";
        int age = 30;
        string sex = "남자";
        string insertQuery = $"INSERT INTO Test (No, 이름, 나이, 성별) VALUES ({no}, '{name}', {age}, '{sex}')";

        IDbCommand dbCommand = dbConnection.CreateCommand();
        dbCommand.CommandText = insertQuery;
        dbCommand.ExecuteNonQuery();
        dbCommand.Dispose();
        dbConnection.Close();

        print("끝");
    }

}

 

아래 그림은 코드를 통해 설정한 번호, 이름, 나이, 성별을 데이터베이스에 추가한 것을 보여줍니다. 유니티 UI를 응용하면 값을 입력받고 데이터를 데이터베이스에 쓸 수 있게 됩니다.

 

 


3.3 새로운 테이블 만들기

 

아래 코드는 CREATE TABLE 문을 사용하여 새로운 테이블을 만듭니다. 이때, IF NOT EXISTS 절을 사용하면 테이블이 이미 존재하는 경우에도 오류가 발생하지 않습니다. 쿼리문을 이용해 No, Name, Job, Address와 같이 열의 이름과 데이터 타입을 정의합니다. 그리고 PRIMARY KEY와 AUTOINCREMENT 키워드를 No 열에 적용해 줍니다. Ket는 꼭 적용해 줄 필요는 없습니다.

 

using UnityEngine;
using System.Data;
using Mono.Data.Sqlite;


public class Test : MonoBehaviour
{

    private void Start()
    {
        string dbname = "/tttt.db";
        string connectionString = "URI=file:" + Application.streamingAssetsPath + dbname;
        IDbConnection dbConnection = new SqliteConnection(connectionString);
        dbConnection.Open();


        string createTableQuery = @"CREATE TABLE IF NOT EXISTS NewTable (
                                No INTEGER PRIMARY KEY AUTOINCREMENT,
                                Name TEXT NOT NULL,
                                Job TEXT NOT NULL,
                                Address TEXT NOT NULL)";

        IDbCommand dbCommand = dbConnection.CreateCommand();
        dbCommand.CommandText = createTableQuery;
        dbCommand.ExecuteNonQuery();

        dbConnection.Close();

        print("끝");
    }

}

 

아래 그림은 코드를 통해 데이터베이스에 추가한 테이블을 보여줍니다. 설정한 것과 같이 No, Name, Job, Address가 열이 있는 것을 확인할 수 있습니다.