본문 바로가기
유니티

Day 57 - Unity와 구글 시트 연동 유지 관리

by shin0707 2024. 12. 13.
728x90

 

  • 주제

>>  네트워크 요청 최적화

>>  데이터 처리 효율성 강화

>>  오류 처리 및 안정성

>>  구글 시트 스크립트 최적화

>>  유지 관리 전략


  • 공부내용

Unity와 구글 시트를 연동하는 프로젝트는 데이터를 효율적으로 관리할 수 있는 장점이 있지만, 성능과 안정성 문제를 간과하면 사용성에 영향을 줄 수 있다.

이번 글에서는 성능 최적화를 위한 전략과 프로젝트 유지 관리를 위한 팁을 공유한다.

 

1. 네트워크 요청 최적화

 

문제: 구글 시트와의 빈번한 네트워크 통신은 속도 저하와 서버 부하를 초래할 수 있다.

해결방법 1: 캐싱 활용

데이터를 한 번 불러온 후, 일정 시간 동안 캐싱하여 재사용한다.

private GoogleDataList cachedData;
private float cacheTime = 300f; // 5분
private float lastSyncTime;

public void SyncData()
{
    if (Time.time - lastSyncTime < cacheTime && cachedData != null)
    {
        Debug.Log("Using cached data");
        DisplayData(cachedData);
        return;
    }

    StartCoroutine(SyncCoroutine());
    lastSyncTime = Time.time;
}

 

 

해결방법 2: 비동기 처리

네트워크 요청은 반드시 비동기로 처리하고, 사용자 경험을 위해 로딩 애니메이션을 제공한다.


 

2. 데이터 처리 효율성 강화

 

문제: 대규모 데이터를 처리할 경우 로직이 복잡해지고 성능이 저하될 수 있다.

해결방법 1: 최소 데이터 전송

필요한 데이터만 요청하거나 업데이트한다.

예를 들어, 점수만 변경되었을 경우 이름 목록을 다시 전송할 필요가 없다.

 

해결방법 2: JSON 데이터 압축

JSON 데이터를 전송하기 전, 데이터를 압축하거나 중복 필드를 제거한다.

private string CompressData(GoogleDataList dataList)
{
    var compressed = new System.Text.StringBuilder();
    foreach (var data in dataList.data)
    {
        compressed.Append($"{data.name}:{data.score},");
    }
    return compressed.ToString().TrimEnd(',');
}

 


 

3. 오류 처리 및 안정성

 

문제: 네트워크 오류, 서버 다운 등으로 인해 동기화가 중단될 수 있다.

해결방법 1: 재시도 로직

네트워크 요청 실패 시 일정 횟수까지 재시도한다.

private IEnumerator RetryRequest(string url, int maxRetries)
{
    int attempts = 0;
    while (attempts < maxRetries)
    {
        UnityWebRequest request = UnityWebRequest.Get(url);
        yield return request.SendWebRequest();

        if (request.result == UnityWebRequest.Result.Success)
        {
            Debug.Log("Request succeeded");
            yield break;
        }

        attempts++;
        Debug.LogWarning($"Retry {attempts}/{maxRetries}");
        yield return new WaitForSeconds(2f);
    }
    Debug.LogError("All retry attempts failed");
}

 

해결방법 2: 오류 로그 기록

Unity의 Debug 로그를 구글 시트나 별도의 로그 서버에 저장해 원격으로 분석할 수 있다.

 

별도의 로그 서버에 저장하기

구현 과정:

  1. 로그 수집용 간단한 서버를 준비한다. 예: Node.js + Express.
  2. Unity에서 오류를 서버로 전송한다.

Node.js 서버 작성 아래는 간단한 Node.js 로그 서버 예제다:

const express = require("express");
const app = express();
const fs = require("fs");

app.use(express.json());

app.post("/log", (req, res) => {
    const log = req.body;
    const logMessage = `[${new Date().toISOString()}] [${log.type}] ${log.message}\n`;

    // 로그 파일에 저장
    fs.appendFile("logs.txt", logMessage, (err) => {
        if (err) {
            console.error("Failed to write log:", err);
            res.status(500).send("Failed to save log");
        } else {
            console.log("Log saved:", logMessage);
            res.status(200).send("Log saved successfully");
        }
    });
});

const PORT = 3000;
app.listen(PORT, () => {
    console.log(`Log server running on port ${PORT}`);
});

 

 

Unity 스크립트 작성 Unity에서 오류 발생 시 서버로 로그를 전송하는 스크립트:

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

public class ServerLogger : MonoBehaviour
{
    private string serverUrl = "http://your-server-address/log";

    private void Start()
    {
        // Unity 로그 메시지 이벤트 등록
        Application.logMessageReceived += HandleLog;
    }

    private void OnDestroy()
    {
        // 이벤트 해제
        Application.logMessageReceived -= HandleLog;
    }

    private void HandleLog(string logString, string stackTrace, LogType type)
    {
        // JSON 데이터 생성
        string logData = JsonUtility.ToJson(new LogMessage(logString, stackTrace, type.ToString()));

        // 서버로 로그 전송
        StartCoroutine(SendLogToServer(logData));
    }

    private IEnumerator SendLogToServer(string jsonData)
    {
        UnityWebRequest request = new UnityWebRequest(serverUrl, "POST");
        byte[] bodyRaw = System.Text.Encoding.UTF8.GetBytes(jsonData);
        request.uploadHandler = new UploadHandlerRaw(bodyRaw);
        request.downloadHandler = new DownloadHandlerBuffer();
        request.SetRequestHeader("Content-Type", "application/json");

        yield return request.SendWebRequest();

        if (request.result == UnityWebRequest.Result.Success)
        {
            Debug.Log("Log successfully sent to server");
        }
        else
        {
            Debug.LogError($"Failed to send log: {request.error}");
        }
    }

    [System.Serializable]
    private class LogMessage
    {
        public string message;
        public string stackTrace;
        public string type;

        public LogMessage(string message, string stackTrace, string type)
        {
            this.message = message;
            this.stackTrace = stackTrace;
            this.type = type;
        }
    }
}

 

4. 구글 시트 스크립트 최적화

 

문제: Google Apps Script의 속도가 느려질 수 있다.

해결방법 1: 필요한 데이터만 처리

구글 시트에서 전체 데이터를 읽지 말고, 필요한 범위만 선택적으로 처리한다.

const range = sheet.getRange("A1:B10");
const data = range.getValues();

 

해결방법 2: 스크립트 제한 관리

Google Apps Script는 초당 실행 제한이 있으므로 요청 빈도를 줄이고, 복잡한 계산은 Unity에서 처리한다.


 

5. 유지 관리 전략

 

  • 코드 분리와 모듈화
    네트워크 요청, UI 업데이트, 데이터 처리 등을 별도의 클래스로 분리해 유지 보수를 용이하게 한다.
  • 구글 스크립트 버전 관리
    Google Apps Script는 주요 변경 사항이 있을 때마다 새 버전을 배포하고, URL을 업데이트해야 한다.
  • 사용자 피드백 수집
    데이터 동기화 과정에서 사용자 경험을 개선하기 위해 피드백을 정기적으로 수집하고 반영한다.

 

728x90
반응형