- 주제
>> 네트워크 요청 최적화
>> 데이터 처리 효율성 강화
>> 오류 처리 및 안정성
>> 구글 시트 스크립트 최적화
>> 유지 관리 전략
- 공부내용
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 로그를 구글 시트나 별도의 로그 서버에 저장해 원격으로 분석할 수 있다.
별도의 로그 서버에 저장하기
구현 과정:
- 로그 수집용 간단한 서버를 준비한다. 예: Node.js + Express.
- 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을 업데이트해야 한다. - 사용자 피드백 수집
데이터 동기화 과정에서 사용자 경험을 개선하기 위해 피드백을 정기적으로 수집하고 반영한다.
'유니티' 카테고리의 다른 글
Day 59 - 유니티 구글 계정 로그인 시스템 실행(2부) (1) | 2024.12.15 |
---|---|
Day 58 - 유니티 구글 계정 로그인 시스템 구축(1부) (0) | 2024.12.14 |
Day 56 - Unity와 구글 시트 데이터 동기화 전략 (4) | 2024.12.13 |
Day 55 - Unity에서 구글 시트 데이터 수정 및 업데이트 (2) | 2024.12.12 |
Day 54 - Unity로 구글 시트 데이터 불러오기 (2) | 2024.12.12 |