본문 바로가기

Unity Engine

유니티 엔진에서 임베디드 db를 통한 데이터 관리

728x90

어딘가에서 쓰였던 데이터

 

게임 개발을 하면 아이템의 보상 값이나 몬스터의 체력 수치 등, 데이터시트에서 수많은 데이터를 읽어야 한다.

 

그런데, 그 양이 수십만 줄이 되는 경우, 데이터를 몽땅 메모리에 올리면 부담이 갈 것이다.

 

대신 로컬 스토리지용으로 쓸 수 있는 임베디드 db를 사용하면 모든 데이터를 한 번에 메모리에 올리지 않고도 필요한 데이터를 그때그때 로드하는 방식으로 메모리 사용량을 절약할 수 있다.

 

이 포스트에서는 SQLite를 사용하여 데이터를 db 형식으로 관리하는 방법에 대해 소개하고자 한다.

데이터를 임베디드 db로 관리하면 어떻게 좋은가요?

데이터를 임베디드 db 형태로 저장하게 되면 어떤 데이터가 필요할 때마다 디스크에서 읽도록 하여 데이터가 메모리에 상주하지 않아 그만큼 메모리 사용량을 줄일 수 있다.

 

메모리의 사용량이 줄어듬에 따라 부수적으로 GC에 대한 부담도 줄일 수 있다.

디스크 IO에 의한 성능 하락?

메모리에서 벗어나 더 느린 디스크에서 데이터를 읽는다는 것은 성능에 큰 영향을 미칠 수 있다.

 

하지만, 자주 읽는 데이터는 메모리에 캐싱하거나 어떤 씬에서 필요한 데이터를 사용하기 전 미리 메모리에 불러오는 최적화를 통해 개선이 가능하다.

 

이 포스트에서는 단순히 데이터를 SQLite로 바꾸고 읽는 것에 집중한다.

CSV를 SQLite db로 전환

 

 

간단한 시트를 준비해 봤다. 이를 이제 SQLite db로 바꿔줄 것이다.

 

파이썬의 pandas를 이용하면 쉽게 csv로 작성된 데이터 시트를 SQLite DB로 바꿀 수 있다.

import pandas as pd
import sqlite3

# CSV 파일 불러오기
csv_file = "mydata.csv"
df = pd.read_csv(csv_file)

# SQLite 데이터베이스 연결 (파일 없으면 자동 생성)
db_file = "mydatabase.db"
conn = sqlite3.connect(db_file)

# DataFrame을 SQLite 테이블로 변환
table_name = "mytable"
df.to_sql(table_name, conn, if_exists="replace", index=False)

# 변환 확인
print(pd.read_sql(f"SELECT * FROM {table_name} LIMIT 5;", conn))

# 연결 종료
conn.close()

 

위의 csv 파일을 넣고 해당 코드를 실행하면 결과를 볼 수 있다.

 

 

이런 식으로 데이터 시트를 편리하게 db 파일로 바꿀 수 있다.

유니티 프로젝트에 SQLite 환경 세팅

유니티로 빌드한 앱에서 SQLite를 사용하려면 SQLite 패키지를 설치하고 관련 dll 파일을 탑재해줘야 한다.

 

먼저 패키지 매니저에서 SQLite-net for Unity를 연동해 주자.

 

https://github.com/gilzoide/unity-sqlite-net

 

GitHub - gilzoide/unity-sqlite-net: SQLite-net for Unity, supports Windows, Linux, macOS, iOS, tvOS, visionOS, Android and WebGL

SQLite-net for Unity, supports Windows, Linux, macOS, iOS, tvOS, visionOS, Android and WebGL - gilzoide/unity-sqlite-net

github.com

 

 

+ 버튼을 누른 후 Add package from git URL 메뉴에서 위 저장소 주소를 넣어주면 설치가 된다.

 

다음으로 SQLite 공식 홈페이지에서 dll 파일을 받는다.

 

https://www.sqlite.org/download.html

 

SQLite Download Page

Templates (1) and (2) are used for source-code products. Template (1) is used for generic source-code products and templates (2) is used for source-code products that are generally only useful on unix-like platforms. Template (3) is used for precompiled bi

www.sqlite.org

 

Precompiled Binaries를 받으면 된다. 포스트에서는 윈도우에서 테스트하므로 윈도우용 바이너리를 받는다.

 

 

Plugins 폴더에 압축을 푼 파일들을 넣어준다.

 

 

다음으로 생성한 db를 StreamingAssets 폴더에 넣어준다.

DB 조회 코드 짜기

이제 프로젝트에서 SQLite를 사용할 수 있다.

 

각 엔티티를 조회해 보자.

 

using UnityEngine;
using System.IO;
using SQLite;

public class mytable
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public string Name { get; set; }
    public int Atk { get; set; }
    public int Hp { get; set; }
}

public class DbLoader : MonoBehaviour
{
    void Start()
    {
        var dbPath = Path.Combine(Application.streamingAssetsPath, "mydatabase.db");
        var db = new SQLiteConnection(dbPath);

        for (int i = 1; i <= 3; i++)
        {
            var monster = db.Table<mytable>().Where(x => x.Id == i).FirstOrDefault();
            Debug.Log("Monster Name: " + monster.Name);
            Debug.Log("Monster Atk: " + monster.Atk);
            Debug.Log("Monster Hp: " + monster.Hp);
        }
    }
}

 

참고로 db의 테이블을 제어하는 클래스는 만들었던 테이블 이름과 동일해야 하므로 주의하자.

 

SQLiteConnection 객체에서 각 id에 대응하는 엔티티를 불러와 출력하는 것을 확인할 수 있다.

 

 

이렇게 유니티에서 SQLite db를 사용하는 방법을 알아봤다.

Db 파일의 보안

db 파일은 독립된 파일로 존재하기 때문에 데이터 유출에 민감하다면 SQLite-net for Unity 대신 SqlCipher4Unity3D의 사용을 고려해 볼 수 있다.

 

https://github.com/netpyoung/SqlCipher4Unity3D

 

GitHub - netpyoung/SqlCipher4Unity3D: 💾 SqlCipher made easy for Unity3d

💾 SqlCipher made easy for Unity3d. Contribute to netpyoung/SqlCipher4Unity3D development by creating an account on GitHub.

github.com

 

SQLite db를 AES 256으로 암호화시키는 SQLCipher의 유니티 포팅이다. 이를 사용해 db 자체를 암호화시킬 수 있다.

728x90