Golang을 이용해 멀티게임 만들기 (1)

2022년 02월 14일
제작기간 2022년 02월 14일
태그 Unity

간단한 실시간 온라인 멀티 프로그램을 만들어보려고 한다. 클라이언트는 유니티, 서버는 Go를 이용해 만들 예정이다. 기능은 가볍게 이동과 상호작용 정도로 생각하고 있다. 온라인 환경을 경험해보는데에 의의를 두고 진행한다.

클라이언트

HTTP를 이용한다. 아직 게임 시스템을 만들기 전이라 버튼으로만 동작하고 있다.

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

        if (www.result != UnityWebRequest.Result.Success)
        {
            Print(www.error);
        }
        else
        {
            Print(www.downloadHandler.text);
        }
    }
}
IEnumerator Post(object data, string url)
{
    var jsonfile = JsonConvert.SerializeObject(data);

    using (UnityWebRequest www = new UnityWebRequest(url, "POST"))
    {
        www.uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(jsonfile));
        www.downloadHandler = new DownloadHandlerBuffer();
        www.SetRequestHeader("Content-Type", "application/json");
        yield return www.SendWebRequest();

        if (www.result != UnityWebRequest.Result.Success)
        {
            Print(www.error);
        }
        else
        {
            Print(www.downloadHandler.text);
        }
    }
}

유니티에서 제공하는 UnityEngine.Networking이 제공해주는 기능으로 간단하게 만들 수 있었다. 유저 정보와 게임 데이터로 나누어서 관리하였다.

Client
DB

서버

아주 심플한 서버도 경험해본 적이 없어서 언어 선택에 고민이 많았다. 그러던 중, 가볍고 깔끔하다는 이유로 Go를 추천받아 선택하게 되었다. 기존에 csharp만 사용하다보니 많이 어색했던 것 같다. (ing…!🧐)

.
├── db
│   └── db.go
├── server
│   └── server.go
├── go.mod
├── go.sum
├── main.go
└── README.md

echogorm을 사용했다.

👉 echo

👉 gorm

func New() (*Server, error) {
    e := echo.New()
    db, err := db.New()

    // ...

    svr := &Server{
        Echo: e,
        db:   db,
    }

    e.GET("/health", svr.healthCheck)

    // ...
}

func (svr *Server) healthCheck(c echo.Context) error {
    return c.String(http.StatusOK, "OK")
}

echo를 이용하니 이렇게 간단하게 GET과 POST를 구현할 수 있었다.

func New() (*Server, error) {

    // ...

    v1Api := e.Group("/v1")
    svr.registerHandler(v1Api.Group("/path"))

    // ...

}

func (svr *Server) registerAuthHandler(g *echo.Group) {
    g.POST("/path1", svr.method1)
    g.POST("/path2", svr.method2)
}

그룹으로 path를 관리할 수 있어 편했다. 처음엔 잘 모르고 path를 용도에 따라서만 지정했었는데 배포를 생각하면 반드시 버전 관리가 필요하다고 한다. 🤭 영원히 업데이트 못 할 뻔했다.

언어가 너무 안 익숙해서 적응하기까지 난항이 예상되지만, 볼 수록 읽기도 편하고 명확해보여 쓰기 좋아보인다. 모듈 임포트도 간단해서 쓸데없는 시간 낭비를 하지 않게 해준다. 이번 기회에 많이 배울 수 있으면 좋겠다는 생각이 든다.

그 외의 툴

database GUI client로 DBeaver를 사용하였다. 매번 새로고침해야 업데이트 된다는 점이 좀 불편하긴 했지만 관계도를 보기 용이해 보여서 사용 중이다.

Docker를 이용해 환경을 세팅했는데 너무 편하게 쓰고 있다. 커맨드 하나 작성해놓고 정말 쾌적하고 멀끔한 환경에서 개발 중이다. 빌드와 배포까지 잘 사용할 예정이어서 더 친해질 필요가 있는데 아직은 컨테이너 하나 띄워두는 용도로만 사용하고 있다.😑

후기

저녁이나 주말에나 조금씩 만들고 있어서 매우 천천히 진행될 예정이다! 👍 상반기 안에는 핸드폰으로 접속하는 것이 목표.