라우팅이란, 클라이언트의 요청을 특정한 핸들러 함수로 연결해주는 역할을 한다.
클라이언트가 HTTP 요청을 보내면, 서버가 해당하는 URL에 맞는 미들웨어들과 핸들러를 실행시켜준다.
URL(Uniform Resource Locator: 자원 위치 지정자)은 리소스의 위치를 가리키는 특별한 위치 지정자이다.
scheme://host:port/path?queryKey=queryValue&queryKey2=queryValue2#fragment
key=value형식을 가지고, 쿼리스트링 간에는 &로 구분된다.#으로 시작한다.URI: Uniform Resource Identifier - 자원 지정 식별자. 리소스들을 구분하기 위한 리소스들의 ID이다.
URL: Uniform Resource Locator - 자원 위치 지정자. URI의 한 종류로, 리소스의 위치를 표시하여 리소스의 고유한 주소를 만든다.
URL은 URI의 한 종류이고, 현재 가장 보편적으로 쓰이는 방식이다.
이제, Gin 애플리케이션에서 라우팅을 해보자.
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/hello", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "Hello, World!",
})
})
r.POST("/submit", func(c *gin.Context) {
name := c.PostForm("name")
c.JSON(200, gin.H{
"status": "submitted",
"name": name,
})
})
r.Run()
}
기본적인 사용법은 다음과 같다:
<gin엔진객체>.<HTTP메서드>("URL 포트이후부분", gin.Handlerfunc)
r.GET("/user/:name", func(c *gin.Context) {
name := c.Param("name")
c.JSON(200, gin.H{
"name": name,
})
})
:를 앞에 붙이면, 파라미터로 사용할 수 있어서 파라미터를 이용한 동적인 라우팅이 가능하다.
기본적으로 Gin은 Context.Param("key")를 통해서 경로 파라미터에 대한 값을 받아오는 것을 지원해준다.
r.GET("/search", func(c *gin.Context) {
query := c.Query("q")
c.JSON(200, gin.H{
"query": query,
})
})
Gin은 기본적으로 쿼리스트링 파싱을 지원한다.
Context.Query("key")를 통해서 경로에 있는 쿼리스트링의 value를 가져올 수 있다.
라우트를 구성하다보면, path의 앞쪽 부분, 즉 prefix들이 겹치는 경우가 있을 수도 있어서 정리하고 싶기도 하고, 라우트를 같이 묶어서 관리를 하고 싶은 때도 있다.
Gin은 라우트 그룹화를 지원한다.
v1 := r.Group("/v1")
{
v1.GET("/users", getAllUsers)
v1.GET("/users/:id", getUserByID)
}
v2 := r.Group("/v2")
{
v2.GET("/users", getAllUsersV2)
v2.GET("/users/:id", getUserByIDV2)
admin := v2.Group("/admin")
{
admin.GET("/", getAdminInfo)
}
}
groupName = r.Group("<prefix>")를 통해서 RouterGroup이라는 그룹 객체를 만들 수 있고,
각 그룹 객체에 서브라우트를 추가하면 된다.
RouterGroup객체에 또 RouterGroup을 중첩시킬 수도 있고, RouterGroup내 범위에만 미들웨어를 적용시킬 수도 있다.