유니티와 자바 서버 연동하기: REST API 통신 가이드
유니티 게임에서 데이터를 저장하거나 온라인 기능을 구현할 때, 백엔드 서버와의 연동은 필수적인 과정입니다. 유니티는 C#을 사용하고, 서버는 자바(Java)를 사용하는 경우가 많은데, 이 둘을 어떻게 연결할 수 있을까요?
가장 보편적이고 효과적인 방법은 RESTful API를 사용하는 것입니다. 유니티(C#)에서 HTTP 요청을 보내면, 자바 서버가 이를 처리하고 응답을 보내주는 방식으로 통신이 이루어집니다. 이 가이드에서는 자바의 대표적인 프레임워크인 Spring Boot를 예시로 들어 유니티 클라이언트와 자바 서버를 연동하는 방법을 단계별로 소개합니다.
1. 자바(Spring Boot) 서버 개발: REST API 만들기
먼저, 유니티 클라이언트의 요청을 받을 자바 서버를 구축해야 합니다. 여기서는 플레이어의 점수를 저장하는 간단한 API를 만들어 보겠습니다.
데이터 전송 객체(DTO) 정의
유니티에서 보낼 데이터를 담을 자바 클래스를 만듭니다. 유니티의 JSON 데이터와 매핑될 것입니다.
Java
public class UserData {
private String username;
private int score;
// Getter와 Setter는 생략
}
REST API 컨트롤러 구현
@RestController
와 @PostMapping
어노테이션을 사용해 /api/save_data
엔드포인트를 만듭니다. 이 엔드포인트는 POST
요청으로 JSON 데이터를 받습니다.
Java
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DataController {
@PostMapping("/api/save_data")
public String saveData(@RequestBody UserData userData) {
System.out.println("유니티로부터 데이터 수신:");
System.out.println("사용자 이름: " + userData.getUsername());
System.out.println("점수: " + userData.getScore());
// 실제로는 이 데이터를 데이터베이스에 저장하는 로직을 추가합니다.
return "데이터 저장 성공!";
}
}
@RequestBody
는 유니티에서 보낸 JSON 데이터를 자동으로 UserData
객체로 변환해주는 역할을 합니다.
2. 유니티(C#) 클라이언트 개발: 서버에 데이터 보내기
이제 자바 서버의 API를 호출하는 유니티 스크립트를 작성합니다. 유니티는 UnityWebRequest
클래스를 사용해 HTTP 통신을 처리합니다.
C# 데이터 구조 클래스
자바 서버로 보낼 데이터를 C# 클래스로 정의합니다. [System.Serializable]
속성을 추가하여 JsonUtility
를 이용한 JSON 변환이 가능하게 합니다.
C#
using System;
[Serializable]
public class UserData
{
public string username;
public int score;
}
서버 통신 스크립트 구현
아래 코드는 UnityWebRequest
를 사용해 JSON 데이터를 자바 서버로 전송하는 기능을 구현합니다. 이 과정은 **코루틴(Coroutine)**을 사용하여 게임의 흐름을 방해하지 않으면서 비동기적으로 처리됩니다.
C#
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
public class JavaServerClient : MonoBehaviour
{
// 자바 서버의 API 주소
private const string serverUrl = "http://localhost:8080/api/save_data";
public void SendGameData(string username, int score)
{
// 보낼 데이터를 C# 객체에 담기
UserData data = new UserData
{
username = username,
score = score
};
// 데이터를 JSON 문자열로 변환
string jsonData = JsonUtility.ToJson(data);
// 코루틴으로 서버에 데이터 전송 시작
StartCoroutine(PostData(jsonData));
}
private IEnumerator PostData(string jsonData)
{
// UnityWebRequest 객체 생성: 서버 URL과 POST 방식 지정
UnityWebRequest request = new UnityWebRequest(serverUrl, "POST");
// JSON 데이터를 바이트 배열로 변환하여 요청 본문에 담기
byte[] bodyRaw = System.Text.Encoding.UTF8.GetBytes(jsonData);
request.uploadHandler = new UploadHandlerRaw(bodyRaw);
request.downloadHandler = new DownloadHandlerBuffer();
// 헤더 설정: JSON 콘텐츠임을 서버에 알리기
request.SetRequestHeader("Content-Type", "application/json");
// 요청 전송
yield return request.SendWebRequest();
// 요청 결과 확인
if (request.result != UnityWebRequest.Result.Success)
{
Debug.LogError("서버 연결 실패: " + request.error);
}
else
{
Debug.Log("서버 응답: " + request.downloadHandler.text);
}
}
}
이 스크립트는 UnityWebRequest.Post
대신 new UnityWebRequest(...)
를 사용해 더 유연하게 HTTP 요청을 구성합니다.
연동 과정 요약
- 자바 서버에서 Spring Boot를 이용해 REST API를 만듭니다. 이 API는 JSON 데이터를 받아서 처리하도록 구현합니다.
- 유니티 클라이언트에서
UnityWebRequest
를 사용해 서버의 API 주소로 요청을 보냅니다. - C#의 **
JsonUtility
**는 C# 객체를 JSON 문자열로 변환하고, 자바의 Spring Boot는 받은 JSON을 자동으로 자바 객체로 변환해줍니다.
이 방법은 유니티와 자바 서버 간의 통신을 안정적으로 구현하는 가장 일반적인 패턴입니다. 이 기본 구조를 바탕으로 게임에 필요한 로그인, 랭킹, 아이템 관리 등 다양한 기능을 구현해 보세요.