[Unity] 유니티에 데이터베이스(MySQL) 연결

민지홍·2024년 10월 10일

Unity

목록 보기
2/4
post-thumbnail

Unity로 게임 개발을 하면 게임 클라이언트를 종료할 때 모든 데이터가 없어지기 때문에 데이터베이스에 저장해야 할 경우가 있다. 가장 대표적인 예로 유저 데이터가 있다. Unity로 클라이언트에 데이터베이스(MySQL)를 연결하여 정보를 저장하고, DB에서 정보를 가져오는 방법을 간단하게 알아보았다.

유니티에 MySQL을 연결하는 방법은 크게 두 가지가 있다.

MySQL Connector 사용

장점:

  1. 직접 연결:
    • 데이터베이스에 직접 연결하여 작업할 수 있어 중간 서버를 거치지 않기 때문에 응답 시간이 빠를 수 있습니다.
  2. 단순한 데이터 처리:
    • 데이터베이스와 직접 통신하므로 데이터 전송과 처리가 단순할 수 있습니다.

단점:

  1. 보안 문제:
    • 데이터베이스 인증 정보가 클라이언트 애플리케이션에 포함되므로 보안 문제가 발생할 수 있습니다.
    • 데이터베이스에 대한 직접 접근이 외부에 노출될 수 있습니다.
  2. 방화벽 및 네트워크 제약:
    • 많은 네트워크 환경에서 외부에서 데이터베이스 서버에 직접 접근하는 것이 허용되지 않을 수 있습니다.
  3. 플랫폼 의존성:
    • 모든 플랫폼에서 MySQL Connector를 지원하는 것은 아니며, 설정 및 사용법이 복잡할 수 있습니다.

PHP 사용 (중간 서버 스크립트)

장점:

  1. 보안 강화:
    • 데이터베이스 인증 정보는 서버 측에만 저장되어 있어 보안이 강화됩니다.
    • 데이터베이스 서버는 외부에 직접 노출되지 않으므로 공격에 대한 노출이 줄어듭니다.
  2. 네트워크 유연성:
    • 데이터베이스 서버와 클라이언트 사이에 있는 방화벽이나 네트워크 제한을 우회할 수 있습니다.
    • HTTP를 통해 데이터 전송이 이루어지므로 더 많은 네트워크 환경에서 호환될 수 있습니다.
  3. 비즈니스 로직의 분리:
    • 서버 측에서 비즈니스 로직을 처리하여 클라이언트 코드를 간소화할 수 있습니다.

단점:

  1. 추가적인 서버 관리:
    • 중간 서버 스크립트를 관리하고 유지보수해야 합니다.
    • 추가적인 서버 리소스가 필요할 수 있습니다.
  2. 응답 시간 지연:
    • 중간 서버를 거치기 때문에 응답 시간이 약간 더 길어질 수 있습니다.

From GPT

Connector 보다는 PHP를 사용하는 것이 더 낫다고 판단하여 PHP 스크립트로 구현하였다.

원래는 PHP 스크립트를 돌리기 위해 PHP와 Apache24와 MySQL을 따로 설치하여 설정해야하는 아주 귀찮은 일을 해야하지만 이를 한번에 통합하여 설치하고 자동으로 설정까지 해주는 프로그램이 있는데 AutoSet이다. 이 프로그램 하나만 설치하면 Apache2.4, PHP7, MariaDB10을 동시에 설치하고 연동까지 시켜준다.

[Windows]AutoSet 설치 및 AutoSet 매니저 사용하기

AutoSet

AutoSet 설치 후 hospital 데이터베이스를 만들고 staff 테이블을 만들어 이름, 직원 ID 값을 저장한다.

이후 AutoSet10/public_html(웹 서버 홈 디렉토리)에 get_users.php 스크립트를 생성한다.

get_users.php

<?php
$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "hospital";

// 데이터베이스 연결
$conn = new mysqli($servername, $username, $password, $dbname);

// 연결 확인
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// SQL 쿼리 실행
$sql = "SELECT id, name, number FROM staff";
$result = $conn->query($sql);

$users = array();

if ($result->num_rows > 0) {
    // 결과를 배열로 저장
    while($row = $result->fetch_assoc()) {
        $users[] = $row;
    }
}

// JSON 형식으로 결과 반환
echo json_encode($users, JSON_UNESCAPED_UNICODE);

$conn->close();
?>

유니티에도 연결하는 코드를 작성한다.

MySQLConnector.cs

using UnityEngine;
using System.Text;
using MySql.Data.MySqlClient;
using UnityEngine.Networking;
using System.Collections;
using System.Collections.Generic;

[System.Serializable]
public class User
{
    public int id;
    public string name;
    public string number;
}

public class MySQLConnector : MonoBehaviour
{
    private string url = "http://localhost/get_users.php";

    void Start()
    {
        StartCoroutine(GetUsersData());
    }

    IEnumerator GetUsersData()
    {
        UnityWebRequest www = UnityWebRequest.Get(url);
        yield return www.SendWebRequest();

        if (www.result != UnityWebRequest.Result.Success)
        {
            Debug.Log(www.error);
        }
        else
        {
            byte[] result = www.downloadHandler.data;
            string jsonResponse = Encoding.UTF8.GetString(result);
            Debug.Log("JSON Response: " + jsonResponse); // JSON 응답 확인
            User[] users = JsonHelper.FromJson<User>(jsonResponse);
            foreach (User user in users)
            {
                Debug.Log("ID: " + user.id + ", Name: " + user.name + ", Number: " + user.number);
            }
        }
    }
}
// JsonHelper class to handle array responses
public static class JsonHelper
{
    public static T[] FromJson<T>(string json)
    {
        string newJson = "{ \"array\": " + json + "}";
        Wrapper<T> wrapper = JsonUtility.FromJson<Wrapper<T>>(newJson);
        return wrapper.array;
    }

    [System.Serializable]
    private class Wrapper<T>
    {
        public T[] array;
    }
}

데이터베이스 연결에 성공하였다.

0개의 댓글