지난 포스팅


웹 프로그래밍 with Golang 1 - Hello, World!

웹 프로그래밍 with Golang 2 - 템플릿 문법

웹 프로그래밍 with Golang 3 - 정적 파일

라우팅 (Routing)


라우팅은 Restful API를 구축하기 위해 필수적인 기능이라고 할 수 있습니다.

라우트(route)는 사전적 의미로 (특정한 루트를 따라 무엇을) 보내다[전송하다]라는 의미를 가지고 있습니다.

즉, 라우팅은 사용자 요청이 들어왔을 때 해당 요청을 처리할 수 있는 서비스로 보내는 것을 의미합니다.

라우터 패키지


라우터를 만들기 위해서는 http.ServeMux를 사용하면 됩니다.

하지만 편리한 방법이 아니기 때문에 서드파티 패키지를 주로 사용합니다.

유명한 패키지로는

가 있습니다.

gin은 Node.js의 Express 수준의 프레임워크로 내장 패키지인 net/http를 대체합니다.

반면에 gorilla/mux는 라우터 기능이 중점이며 net/http 모듈과 함께 사용됩니다.

라우팅에 대해 이해하기 위하여 이번 튜토리얼에서는 gorilla/mux를 사용하겠습니다.

gin은 추후 챕터에서 다루겠습니다.

Gorilla Mux 설치


1
go get -u github.com/gorilla/mux

go get으로 패키지를 설치합니다.

라우터 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main

import (
"fmt"
"net/http"
"github.com/gorilla/mux"
)

func main() {
r := mux.NewRouter()

r.HandleFunc("/books/{title}/page/{page}", func(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
title := vars["title"]
page := vars["page"]

fmt.Fprintf(w, "You've requested the book: %s on page %s\n", title, page)
})

http.ListenAndServe(":8080", r)
}

라우터는 기존에 알고있던 http.HandleFunc와 유사합니다.

mux.Vars 메서드를 이용하여 URL의 Path Parameter를 가져올 수 있습니다.

이밖에도 정규식을 활용하여 다양한 형태의 URL을 파싱할 수 있습니다.

라우터 테스트


{title}과 {page}를 임의로 설정하여 요청을 보내겠습니다.

주소/books/Harry Poter/page/5

Parameter Path

메서드 제한하기


별도로 메서드(Method)를 제한하지 않으면 패턴이 일치하는 모든 요청에 대해 응답할 것입니다.

Restful API에는 4가지의 메서드를 사용합니다. (GET, POST, DELETE, PATCH)

용도에 맞게 메서드를 다음과 같이 제한시킬 필요가 있습니다.

1
2
3
4
r.HandleFunc("/books/{title}", CreateBook).Methods("POST")
r.HandleFunc("/books/{title}", ReadBook).Methods("GET")
r.HandleFunc("/books/{title}", UpdateBook).Methods("PUT")
r.HandleFunc("/books/{title}", DeleteBook).Methods("DELETE")

Restful API에 대한 이해가 부족하다면 좋은 REST API 설계 방법에 대한 고찰이라는 포스팅을 한번 보시길 바랍니다.

다음 시간에는 구조화된 Data를 주고 받기 위해 Form Value & JSON을 활용하는 법에 대해 배워보겠습니다.

참고


https://gowebexamples.com/routes-using-gorilla-mux/