[Gin] 라우팅

riveroverflow·2024년 9월 2일

라우팅이란?

라우팅이란, 클라이언트의 요청을 특정한 핸들러 함수로 연결해주는 역할을 한다.
클라이언트가 HTTP 요청을 보내면, 서버가 해당하는 URL에 맞는 미들웨어들과 핸들러를 실행시켜준다.

URL구조

URL(Uniform Resource Locator: 자원 위치 지정자)은 리소스의 위치를 가리키는 특별한 위치 지정자이다.

scheme://host:port/path?queryKey=queryValue&queryKey2=queryValue2#fragment

  • scheme: 스킴이라고 하며, 자원에 접근하는 프로토콜을 말한다.
    ex) http, https, ftp, mailto 등..
  • host: 자원이 위치한 서버의 도메인 이름이나 ip주소를 사용한다.
    ex) example.com, 192.168.0.1 등등..
  • port: 서버에서 사용하는 포트 번호
    ex) well-known 포트(~1023)로 http:80, https:443, ftp(control):21, ftp(data):20, smtp:25
  • path: 서버 내에서 자원이 위치한 경로를 지정한다. 슬래시(/)로 구분된 계층 구조를 가진다.
    리눅스 파일 시스템과 거의 유사하다고 보면 된다.
    ex) /apple
  • query: 자원에 대한 추가적인 파라미터를 전달한다. ?로 구분되며, key=value형식을 가지고, 쿼리스트링 간에는 &로 구분된다.
    ex) search=apple&sort=desc
  • fragment: 문서 내에서 특정 부분을 가리키는 식별자를 나타낸다. #으로 시작한다.
    브라우저 안에서만 다뤄지고, 실제 서버로 보내지는 않는다.
    ex) #section2

URL vs URI

URI: Uniform Resource Identifier - 자원 지정 식별자. 리소스들을 구분하기 위한 리소스들의 ID이다.
URL: Uniform Resource Locator - 자원 위치 지정자. URI의 한 종류로, 리소스의 위치를 표시하여 리소스의 고유한 주소를 만든다.

URL은 URI의 한 종류이고, 현재 가장 보편적으로 쓰이는 방식이다.

Gin에서 라우팅하기

이제, 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내 범위에만 미들웨어를 적용시킬 수도 있다.

0개의 댓글