Golang Gin Gonic - 4. Grouping API
간단한 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은 왜 하는 걸까?
- API들이 하위 호환이 안될 정도로(backward compatibility) 변경되어 서비스 된다면 동일한 이름의 endpoint에 대해 prefix로 v1, v2로 구분을 할 필요가 있다.
- 여러 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로 전달하였다.