본문 바로가기

Studies/Languages

Go: 테스트용 간단 REST API 앱

유니티 엔진에서의 리서치 도중 REST API를 통한 로그인 기능 구현을 할 일이 생겼습니다. 작년이었더라면 웬만한 작업들은 C#으로 해결하려고 ASP.NET Core로 눈을 돌렸을텐데요. 복잡한 기능 명세가 필요하지 않았고 이를 위해 적합한 새로운 언어가 있을거라는 생각에 GoLang을 이용해보기로 했습니다. 

 

유니티 클라이언트에서는 HTTP로 적절한 헤더를 포함시킨 요청을 작성하여 보내고 응답을 받아 처리하는 로직을, GoLang에서는 라우팅에 따라 적절한 요청을 처리하고 결과를 응답하는 로직을 작성합니다. 라우터로는 메인테이닝이 이루어지지 않은지 꽤 된 것 같지만 13K의 Star를 보유하고 있는 julienschmidt/httprouter를 사용했습니다. 

 

https://github.com/julienschmidt/httprouter

 

GitHub - julienschmidt/httprouter: A high performance HTTP request router that scales well

A high performance HTTP request router that scales well - GitHub - julienschmidt/httprouter: A high performance HTTP request router that scales well

github.com

 

본격적 구현에 앞서 원하는 기능이 제대로 동작하는지 테스트를 진행했습니다. 

 

간단한 유니티 클라이언트 요청

public class RequestRouteDemo : MonoBehaviour
{
	public string user = "calci";
		
	private IEnumerator Start()
	{
		UnityWebRequest request = UnityWebRequest.Get("localhost:8080/api/user/" + user);
		request.method = "GET";
			
		yield return request.SendWebRequest();
			
		if (request.result is UnityWebRequest.Result.ConnectionError or UnityWebRequest.Result.ProtocolError)
		{
			Debug.LogError(request.error);
		}
		else
		{
			Debug.Log(request.downloadHandler.text);
		}
	}
}
public class RequestDemo : MonoBehaviour
{
	private IEnumerator Start()
	{
		UnityWebRequest request = UnityWebRequest.Get("localhost:8080/api/check");
		request.method = "GET";
			
		yield return request.SendWebRequest();
			
		if (request.result is UnityWebRequest.Result.ConnectionError or UnityWebRequest.Result.ProtocolError)
		{
			Debug.LogError(request.error);
		}
		else
		{
			Debug.Log(request.downloadHandler.text);
		}
	}
}

Go REST API 서버

package main

import (
	"fmt"
	"github.com/julienschmidt/httprouter"
	"net/http"
	"log"
)

func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
	fmt.Fprint(w, "Welcome!\n")
}

func Hello(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
	fmt.Fprintf(w, "hello, %s!\n", ps.ByName("name"))
}

func Check(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
	fmt.Fprintf(w, "check!")
}

func main() {
	router := httprouter.New()
	router.GET("/", Index)
	router.GET("/api/user/:name", Hello)
	router.GET("/api/check", Check)

	log.Fatal(http.ListenAndServe(":8080", router))
}

 

go run main.go로 실행해서 테스트했고, 정상작동을 확인했습니다. 

 

기본 기능 테스트는 거쳤습니다.

그러나 아직 세부적인 라우터 추가와 헤더 관리, CORS 관련 테스트를 마쳐야 합니다.

 

다음 기록으로 이어집니다.

'Studies > Languages' 카테고리의 다른 글

[백준] 11050 이항계수 1 - GoLang  (0) 2022.05.01