무지개곰
article thumbnail
반응형

웹 서비스 설계에서 중요한 역할을 하는 RESTful API가 무엇인지, Go 언어에서는 어떻게 사용하는지 알아보겠습니다.

목차

RESTful API란?

net/http를 사용한 RESTful API

gorilla/mux를 사용한 RESTful API


RESTful API란?

RESTful API는 리소스를 표현하고, HTTP 메서드를 사용하여 리소스를 조작하는 웹 서비스 아키텍처 스타일입니다. 이러한 웹 서비스는 다양한 클라이언트와 서버 사이에서 데이터를 교환하는 데 사용됩니다.

RESTful API 주요 특징

리소스 : 모든 데이터는 리소스로 표현되며, 각 리소스는 도유한 URI를 가집니다.

HTTP 메서드 : HTTP 메서드(GET, POST, PUT, DELETE 등)를 사용하여 리소스를 조작합니다. 앞에 적은 4가지 이외에도 HTTP 메서드는 존재하지만 대표적으로 앞의 4가지를 사용합니다.

RESTful API 설계 원칙

명확한 URI : URI는 리소스를 나타내며 직관적이고 명확해야 합니다.

HTTP 메서드 사용 : 'GET'은 조회, 'POST'는 생성, 'PUT'은 업데이트, 'DELETE'는 삭제를 의미합니다.

상태 코드 활용 : 적절한 HTTP 상태 코드를 사용하여 응답합니다. 예를 들어, 200은 성공, 404는 리소스를 찾을 수 없음을 나타냅니다.


net/http를 사용한 RESTful API

Go에서 RESTful API를 설계하는 방법으로 기본 패키지인 net/http를 사용하는 방법이 있습니다. 간단한 예제코드와 'postman'을 이용한 요청과 응답을 확인해 보겠습니다.

예시 코드

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "net/http"
)

type UserInfo struct {
    Name string `json:"name"`
    Age int `json:"age"`
}

var userInfos []UserInfo = []UserInfo{{Name: "무지개곰", Age:100}}

func main() {
    port := 8080

    http.HandleFunc("/user",HandleUsers)

    log.Println("Rainbowbear Server Starting on port :", port)
    log.Fatal(http.ListenAndServe(fmt.Sprint(":", port), nil))
}

func HandleUsers(w http.ResponseWriter, r *http.Request) {
    switch r.Method {
    case http.MethodGet:
        GetUsers(w, r)
    case http.MethodPost:
        PostUsers(w, r)
    }
}

func GetUsers(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(userInfos)
}

func PostUsers(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    var userInfo UserInfo
    decoder := json.NewDecoder(r.Body)
    err := decoder.Decode(&userInfo)
    if err != nil {
        http.Error(w, "Bad Request", http.StatusBadRequest)
        return
    }
    userInfos = append(userInfos, userInfo)
    json.NewEncoder(w).Encode(userInfos)
}

예시 코드 설명

서버를 여는 것은 이전 글에서 다루었기에 생략하겠습니다.

1. 'http.HandleFunc'에서 경로가 '/user'로 접근하면 'HandleUsers'를 실행합니다.

2. 'HandleUser'는 요청에 대한 'Method'를 확인하여 Method에 따라 실행할 핸들러 함수를 분류하였습니다.

예시에서는 GET과 POST만 다루었습니다.

3. Method에 따라 다른 핸들러 함수를 호출하였고 'GetUsers'의 경우 서버의 UserInfos를 JSON화 하여 응답하고, 'PostUsers'의 경우 요청이 포함하고 있는 JSON의 정보를 UserInfos에 추가하여 응답합니다.

'json.NewEncoder(w).Encode(userInfos)'는 'userInfos'를 JSON형식으로 인코딩하고, HTTP응답에 JSON을 전달합니다.

GET 사용
POST 사용

GET의 경우 코드에서 작성해 둔 구조체가 출력된 것을 볼 수 있습니다.

POST의 경우 요청에 보낸 JSON이 추가되어 응답이 온 것을 볼 수 있습니다.


gorilla/mux를 사용한 RESTful API

외부 패키지인 'gorilla/mux'를 사용하여 HandleFunc에서 Method를 확인하여 핸들러 함수를 실행하는 것이 아닌 간결하고 유연한 라우팅을 구현할 수 있습니다.

gorilla/mux 설치

gorilla/mux는 외부 패키지입니다. 따라서 사용하려면 먼저 패키지를 설치하여야 합니다.

go get -u github.com/gorilla/mux

예시 코드

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "net/http"

    "github.com/gorilla/mux"
)

type UserInfo struct {
    Name string `json:"name"`
    Age int `json:"age"`
}
 
 var userInfos []UserInfo = []UserInfo{{Name: "고릴라", Age:100}}

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

    r.HandleFunc("/user", GetUsers).Methods("GET")
    r.HandleFunc("/user", PostUsers).Methods("POST")

    log.Println("Rainbowbear Server Starting on port :", port)
    log.Fatal(http.ListenAndServe(fmt.Sprint(":", port), r))
}

func GetUsers(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(userInfos)
}

func PostUsers(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    var userInfo UserInfo
    decoder := json.NewDecoder(r.Body)
    err := decoder.Decode(&userInfo)
    if err != nil {
        http.Error(w, "Bad Request", http.StatusBadRequest)
        return
    }
    userInfos = append(userInfos, userInfo)
    json.NewEncoder(w).Encode(userInfos)
}

예시 코드 설명

net/http와 달라진 부분만 설명드리겠습니다.

mux를 활용하여 서버를 열었던 것처럼 'gorilla/mux''NewRouter'를 사용하여 mux를 생성하고 'ListenAndServe'에게 전달합니다.

HandleFunc에서 핸들러를 실행하여 응답의 Method를 확인하지 않고 HandleFunc에 같은 경로에 대하여 실행할 핸들러 함수를 설정하고 'Methods'를 사용하여 Method를 분류합니다.

 

GET 사용
POST 사용

GET의 경우 코드에서 작성해 둔 구조체가 출력된 것을 볼 수 있습니다.

POST의 경우 요청에 보낸 JSON이 추가되어 응답이 온 것을 볼 수 있습니다.

반응형
profile

무지개곰

@무지개곰

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!