golang

Golang Gin Gonic - 4. Grouping API

주먹불끈 2021. 10. 4. 23:51

 

간단한 API 서버를 제외하고는 웹서비스의 전형적인 HTTP API server 실무에서 개발한 적이 없다. 유튜브에서 Golang 대표적인 web framework Gin 이용한 좋은 강좌를 만나 이를 하나씩 따라하려고 한다. 

 

번째로 API들을 묶어서 그룹처리하는 방법을 알아본다.

 

Playlist: Rest API in Golang using Gin Gonic: https://bit.ly/3hsZKbv

YouTube. Grouping Rest API's in Golang using Gin: Grouping Rest API's in Golang using Gin

 

구현해본 GitHub repo: https://github.com/nicewook/gin-gonic-study

이번 블로그 포스팅 소스코드: https://github.com/nicewook/gin-gonic-study/tree/main/api-group-4

 

Grouping 하는 걸까?

 

  1. API들이 하위 호환이 안될 정도로(backward compatibility) 변경되어 서비스 된다면 동일한 이름의 endpoint 대해 prefix v1, v2 구분을 필요가 있다.
  2. 여러 endpoint 들이 유사한 기능을 제공하거나, 동일한 미들웨어를 적용해야 한다면 grouping 해주면 편리하다

 

코드를 보자

 

회신할 데이터를 아래와 같이 버전별로 준비해 두었다

 

type TestModel struct {
	ID   int    `json:"id" binding:"required"`
	Name string `json:"name" binding:"required"`
}

var V1Users = []TestModel{
	{
		ID:   1,
		Name: "user v1 - one",
	},
	{
		ID:   2,
		Name: "user v1 - two",
	},
}

var V1Products = []TestModel{
	{
		ID:   1,
		Name: "product v1 - one",
	},
	{
		ID:   2,
		Name: "product v1 - two",
	},
}

var V2Users = []TestModel{
	{
		ID:   1,
		Name: "user v2 - one",
	},
	{
		ID:   2,
		Name: "user v2 - two",
	},
}

var V2Products = []TestModel{
	{
		ID:   1,
		Name: "product v2 - one",
	},
	{
		ID:   2,
		Name: "product v2 - two",
	},
}

Grouping 핸들러들을 아래와 같이 구현해 두었다. 여기서는 user product 그룹이 각각 하나밖에 없지만 PUT, POST, DELETE 등으로 핸들러를 추가하거나, 추가적인 endpoint 만들 수도 있다.

 

func newServer() *gin.Engine {
	r := gin.Default()
	v1 := r.Group("v1")
	{
		user := v1.Group("user")
		{
			user.GET("", func(c *gin.Context) {
				c.JSON(http.StatusOK, gin.H{
					"data": V1Users,
				})
			})

		}
		product := v1.Group("product")
		{
			product.GET("", func(c *gin.Context) {
				c.JSON(http.StatusOK, gin.H{
					"data": V1Products,
				})
			})

		}
	}
	v2 := r.Group("v2")
	{
		user := v2.Group("user")
		{
			user.GET("", func(c *gin.Context) {
				c.JSON(http.StatusOK, gin.H{
					"data": V2Users,
				})
			})

		}
		product := v2.Group("product")
		{
			product.GET("", func(c *gin.Context) {
				c.JSON(http.StatusOK, gin.H{
					"data": V2Products,
				})
			})
		}
	}
	return r
}

curl 테스트 해보자

 

아래와 같이 curl 테스트 해보면 v1, v2 user, product 조합에 따라 거기에 맞는 response 받은 것을 있다.

참고로, curl -s 옵션(== silent) 줘서 불필요한 추가 정보를 제거하였고, JSON 보기 좋게 출력하도록 jq 설치하여 response jq 전달하였다.

 

 

반응형