유니티 데이터베이스 연결하는 방법

유니티(Unity)에서 데이터베이스를 연결하는 방법은 크게 두 가지, 즉 로컬 데이터베이스(SQLite) 연결과 원격 데이터베이스(MySQL, MS SQL 등) 연결로 나눌 수 있습니다. 각 방법은 게임의 특성과 데이터의 성격에 따라 적합하게 선택해야 합니다.


1. 로컬 데이터베이스 연결 (SQLite)

SQLite는 파일 기반의 경량 데이터베이스로, 유니티 프로젝트 내부에 데이터베이스 파일을 직접 포함하여 사용합니다. 이는 주로 인터넷 연결 없이 동작하는 싱글 플레이어 게임, 사용자의 설정 저장, 게임 진행 기록, 또는 작은 규모의 아이템 정보 등 비교적 적은 양의 데이터를 저장하고 관리할 때 매우 유용합니다.

구현 상세

  1. SQLite 라이브러리 준비:
    • 유니티는 기본적으로 SQLite를 직접 지원하지 않으므로, 외부 라이브러리를 추가해야 합니다. 가장 흔히 사용되는 것은 System.Data.SQLite 또는 Mono.Data.Sqlite입니다.
    • 이 라이브러리들은 일반적으로 .dll 파일 형태로 제공되며, 유니티 프로젝트의 Assets 폴더 내에 Plugins 폴더를 생성하고 그 안에 해당 .dll 파일을 넣어주면 됩니다.
    • iOS 및 Android 빌드: 모바일 플랫폼에서는 추가적인 설정이나 특정 SQLite 버전의 .dll 파일이 필요할 수 있습니다. 예를 들어, 모바일용 SQLitePCLRaw 같은 라이브러리를 사용하는 경우가 많습니다.
  2. 데이터베이스 파일 생성:
    • DB Browser for SQLite와 같은 GUI 도구를 사용하여 .s3db, .db, 또는 .sqlite 확장자를 가진 데이터베이스 파일을 미리 생성하고, 필요한 테이블과 데이터를 넣어줍니다.
    • 이렇게 생성된 파일을 유니티 프로젝트의 Assets 폴더나 StreamingAssets 폴더에 복사합니다. StreamingAssets 폴더는 빌드 후에도 파일에 접근하기 용이하다는 장점이 있습니다.
  3. C# 스크립트 작성:
    • C# 스크립트에서 Mono.Data.Sqlite 또는 사용한 SQLite 라이브러리의 네임스페이스를 using 문으로 선언합니다.
    • 데이터베이스 연결: SqliteConnection 객체를 사용하여 데이터베이스 파일의 경로를 지정하고 연결을 엽니다.

using Mono.Data.Sqlite; // 또는 다른 SQLite 라이브러리 네임스페이스
using System.Data; // IDataReader를 사용하기 위해 필요

// …

string dbPath = “URI=file:” + Application.dataPath + “/StreamingAssets/your_database_name.s3db”;
IDbConnection dbConnection = new SqliteConnection(dbPath);
dbConnection.Open();

SQL 쿼리 실행: IDbCommand 객체를 생성하여 SQL 쿼리를 작성하고 실행합니다.

  • 데이터 삽입/수정/삭제 (INSERT, UPDATE, DELETE): ExecuteNonQuery()를 사용합니다.

IDbCommand dbcmd = dbConnection.CreateCommand();
dbcmd.CommandText = “INSERT INTO YourTable (Column1, Column2) VALUES (‘Value1’, ‘Value2’)”;
dbcmd.ExecuteNonQuery();

데이터 조회 (SELECT): ExecuteReader()를 사용하여 IDataReader 객체를 얻고 데이터를 읽어옵니다.

IDbCommand dbcmd = dbConnection.CreateCommand();
dbcmd.CommandText = “SELECT * FROM YourTable”;
IDataReader reader = dbcmd.ExecuteReader();
while (reader.Read())
{
Debug.Log(“Data: ” + reader.GetString(0) + “, ” + reader.GetInt32(1));
}
reader.Close();

연결 종료: 작업이 끝나면 반드시 연결을 닫아줍니다.

dbConnection.Close();

장단점

  • 장점:
    • 오프라인 작동: 인터넷 연결 없이 게임을 플레이할 수 있습니다.
    • 간단한 구현: 별도의 서버 구축 없이 유니티 프로젝트 내에서 모든 것을 처리할 수 있어 구현이 비교적 쉽습니다.
    • 빠른 성능: 로컬 파일 시스템에 직접 접근하므로 데이터 처리 속도가 빠릅니다.
  • 단점:
    • 데이터 공유 불가: 여러 사용자가 동시에 동일한 데이터베이스에 접근하거나 데이터를 공유할 수 없습니다. (온라인 멀티플레이어 게임에는 부적합)
    • 보안 취약: 데이터베이스 파일이 클라이언트 기기에 저장되므로, 변조될 위험이 있습니다. 중요한 데이터(예: 게임머니, 사용자 점수)는 서버에 저장하는 것이 안전합니다.
    • 업데이트 어려움: 데이터베이스 구조나 내용이 변경되면 클라이언트 업데이트가 필요합니다.

2. 원격 데이터베이스 연결 (MySQL, MS SQL 등)

원격 데이터베이스는 별도의 서버에 데이터베이스를 구축하고, 유니티 클라이언트가 HTTP 통신을 통해 서버의 API를 호출하여 데이터에 접근하는 방식입니다. 이는 온라인 멀티플레이어 게임, 사용자 계정 관리, 순위표 시스템, 아이템 및 상점 정보 관리 등 여러 사용자가 데이터를 공유하고 실시간으로 상호작용해야 하는 환경에 필수적입니다.

구현 상세

  1. API 서버 구축:
    • 필수적인 이유: 유니티 클라이언트에서 데이터베이스에 직접 접근하는 것은 보안상 매우 위험합니다. 데이터베이스의 접속 정보가 노출되거나, 악의적인 SQL 쿼리(SQL Injection)로 인해 데이터가 손상될 수 있습니다.
    • 서버 기술 선택: PHP, Node.js(Express), Python(Django/Flask), ASP.NET Core, Java(Spring) 등 다양한 서버 기술 스택 중 하나를 선택하여 API 서버를 구축합니다.
    • RESTful API 설계: Unity 클라이언트가 HTTP GET, POST, PUT, DELETE 요청을 보낼 수 있도록 RESTful API를 설계하고 구현합니다.
    • 데이터베이스 연동: API 서버는 데이터베이스(MySQL, PostgreSQL, MS SQL Server, MongoDB 등)와 연결하여 데이터를 조회, 삽입, 수정, 삭제하는 로직을 구현합니다.
  2. Unity에서 서버 통신:
    • 유니티는 웹 통신을 위해 UnityWebRequest 클래스를 제공합니다. 이 클래스를 사용하여 API 서버에 HTTP 요청을 보냅니다.
    • 데이터 송수신: JSON, XML 등의 형식으로 데이터를 주고받는 것이 일반적입니다. 유니티에서 JSON 데이터를 직렬화/역직렬화하기 위해 JsonUtility 또는 Newtonsoft.Json 같은 라이브러리를 사용할 수 있습니다.
    • 예시 (GET 요청):

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

public class RemoteDBConnector : MonoBehaviour
{
public string apiBaseUrl = “http://your.api.server.com/”;

IEnumerator GetUserData(string userId)
{
    using (UnityWebRequest webRequest = UnityWebRequest.Get(apiBaseUrl + "users/" + userId))
    {
        yield return webRequest.SendWebRequest();

        if (webRequest.result == UnityWebRequest.Result.ConnectionError || webRequest.result == UnityWebRequest.Result.ProtocolError)
        {
            Debug.LogError("Error: " + webRequest.error);
        }
        else
        {
            Debug.Log("Received: " + webRequest.downloadHandler.text);
            // JSON 파싱 및 데이터 처리
        }
    }
}

// 예시: 버튼 클릭 시 호출
public void OnGetUserDataButtonClicked(string id)
{
    StartCoroutine(GetUserData(id));
}

}

예시 (POST 요청):

IEnumerator PostNewScore(string userName, int score)
{
WWWForm form = new WWWForm();
form.AddField(“userName”, userName);
form.AddField(“score”, score.ToString());

using (UnityWebRequest webRequest = UnityWebRequest.Post(apiBaseUrl + "scores/add", form))
{
    yield return webRequest.SendWebRequest();

    if (webRequest.result == UnityWebRequest.Result.ConnectionError || webRequest.result == UnityWebRequest.Result.ProtocolError)
    {
        Debug.LogError("Error: " + webRequest.error);
    }
    else
    {
        Debug.Log("Response: " + webRequest.downloadHandler.text);
    }
}

}

장단점

  • 장점:
    • 보안성: 데이터베이스 접속 정보가 클라이언트에 노출되지 않아 보안이 강화됩니다.
    • 다중 접속 환경: 여러 사용자가 동시에 데이터를 공유하고 상호작용할 수 있습니다.
    • 중앙 집중 관리: 데이터가 서버에 중앙 집중되어 관리되므로, 업데이트나 유지보수가 용이합니다.
    • 플랫폼 독립성: Unity 클라이언트는 HTTP 통신만 하므로, 서버 기술 스택에 구애받지 않습니다.
  • 단점:
    • 복잡한 구현: 별도의 API 서버를 구축하고 관리해야 하므로 개발 복잡도가 높습니다.
    • 인터넷 연결 필수: 데이터베이스에 접근하려면 클라이언트가 인터넷에 연결되어 있어야 합니다.
    • 네트워크 지연: 네트워크 환경에 따라 데이터 통신에 지연이 발생할 수 있습니다. 이는 실시간성이 중요한 게임에서 고려해야 할 부분입니다.

결론

어떤 데이터베이스 연결 방식을 선택할지는 개발하려는 게임의 특성과 요구사항에 따라 달라집니다.

  • 오프라인 싱글 플레이어 게임이나 로컬 데이터 저장이 주 목적이라면 SQLite가 간편하고 효율적인 선택입니다.
  • 온라인 멀티플레이어 게임, 사용자 간 데이터 공유, 중요 데이터의 보안이 필요하다면 API 서버를 통한 원격 데이터베이스 연결이 필수적입니다.

대부분의 상용 온라인 게임은 보안과 확장성을 위해 API 서버를 통한 원격 데이터베이스 방식을 채택하고 있습니다.

댓글 남기기