(Unity) NetworkManager
포스트
취소

(Unity) NetworkManager

구현한 코드를 정리한 글입니다.

웹서버와 협업을 한다면 꼭 접하는 내용이 API이다.

API는 서버와 통신할 수 있는 수단으로 서버에서 만들어준 API를 통해 Data를 주고 받을 수 있다.

나는 첫 협업을 통해 Network를 관리하는 Manager를 만들어 보았다.

💻 코드

Data Class

API를 통해 통신하기 위해선 Data의 이름과 목록을 맞춰야한다.

간단하게 idpassword를 보내면 status를 뱉어주는 API가 있다 가정하겠다.

statusData의 성공유무를 알려준다.

클라이언트는 이에 맞게 클래스를 만들어줘야 한다. (클래스 이름은 자유)

1
2
3
4
5
6
7
8
9
10
11
12
[System.Serializable]
public class LoginData
{
    public string id;
    public string password;
}

[System.Serializable]
public class MembarData
{
    public string status;
}

NetworkManager

본격적으로 API와 통신을 하려면 APIurl주소를 알아야한다.

해당 주소를 얻었다면 다음과 같이 진행한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class NetworkManager
{
    public string baseURL = "https://<API 주소>";

    // 서버 송수신
    string ServerRequest<TRequest>(TRequest requestData)
    {
        // string -> byte[]로 변환
        string str = JsonUtility.ToJson(requestData);
        var bytes = System.Text.Encoding.UTF8.GetBytes(str);

        // 요청 보낼 주소와 세팅
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(baseURL);
        request.Method = "POST";
        request.ContentType = "application/json";
        request.ContentLength = bytes.Length;

        // Stream 형식으로 데이터를 보냄
        using(var stream = request.GetRequestStream()){
            stream.Write(bytes, 0, bytes.Length);
            stream.Flush();
            stream.Close();
        }

        // 응답 데이터를 StremaReader로 받음
        // HTTPWebResponse가 에러 뜨면 예외로 null 리턴
        string json = null;
        try
        {
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            StreamReader reader = new StreamReader(response.GetResponseStream());
            json = reader.ReadToEnd();
        }
        catch
        {
            return json;
        }

        return json;
    }
}

Data의 종류와 이름은 다양하기 때문에 <TRequest> 제네릭을 선언하고 이곳에는 LoginData가 들어갈 것이다.

서버에 전송할때는 Byte로 주고 받아야되기 때문에 Json형태로 만든 후 Byte로 변환시켜준다.

HttpWebRequest로 보낼 주소와 어떤식으로 진행할지 세팅해준다.

세팅한 requestGetRequestStream을 통해 서버에 전송한다.

HttpWebResponse로 서버로 부터 data를 받아준다.

혹시라도 Error가 뜨는 것에 대비해 try catch를 넣어 준다.

받은 값은 json 형태로 오기 때문에 string으로 리턴해준다.

사용하기 편리하게 구현

만들어진 ServerRequest를 사용해보도록 한다.

보내고 받을때의 데이터 구조는 각 상황마다 다르니 제네릭을 통해 클래스를 받아준다.

TRequest는 보내는 데이터 클래스, TResponse는 받는 데이터 클래스이다.

ServerRequest를 통해 json 값을 받으면 JsonUtility를 통해 string 값을 양식에 맞게 클래스에 넣어준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static class NetworkManager
{
    public TResponse GetMemberData<TRequest, TResponse>(TRequest data) where TResponse : new()
    {
        string jsonData = ServerRequest<TRequest>(data);
        
        TResponse responseData;
        if (jsonData != null)
            responseData = GetJson<TResponse>(jsonData);
        else
            responseData = new TResponse();

        return responseData;
    }

    TResponse GetJson<TResponse>(string json)
    {
        // string 값을 JsonUtility로 커스텀 클래스
        TResponse info = JsonUtility.FromJson<TResponse>(json);

        return info;
    }
}

사용하기

LoginData를 생성하여 보낼 값을 넣어준다.

NetworkManager에서 만든 GetMemeberData를 사용하여 detail에 넣어준다.

detail 안에는 status가 있기 때문에 잘 전송 됐다면 서버에서 true 관련 문자열을 보내줄 것이다. (여기선 Success)

1
2
3
4
5
6
7
8
9
10
public class Login
{
    LoginData data = new LoginData(){ id = "testID", password = "test1234" };
    MembarData detail = NetworkManager.GetMemberData<LoginData, MembarData>(data);

    if (detail.status == "Success")
        Debug.Log("서버 전송 성공!");
    else
        Debug.Log("서버 전송 실패!");
}


💡 참고

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

(Unity) Login 문자열 검사

(Github) 유실된 커밋 복구하기