27.1. 프로그램언어 고(Go)의 REST API 개발 방법

프로그램언어 고(Go)에서의 Handler 함수 생성하기

프로그램언어 고(Go)에서 Handler 함수를 생성하는 방법에 대해 최대한 친절하고 쉽게 설명드리겠습니다.

Go언어에서 핸들러 함수는 HTTP 요청을 처리하는 함수입니다. 웹 애플리케이션에서 클라이언트의 요청을 받아서 응답을 보내주는 서버 로직을 구현할 때 사용합니다.

핸들러 함수는 아래와 같은 규칙을 따릅니다.

func (t *T) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    // ...
}

– ServeHTTP 라는 이름의 메소드입니다.
– *http.ResponseWriter와 *http.Request를 파라미터로 받습니다.
– 포인터 리시버(*T)를 사용합니다. Struct 타입일 경우 리시버가 포인터여야 합니다.

다음은 간단한 핸들러 함수의 예제입니다.

package main

import (
    "fmt"
    "net/http"
)

type HelloHandler struct{}

func (h *HelloHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Hello World!") 
}

func main() {
    handler := &HelloHandler{}
    http.ListenAndServe(":8080", handler)
}

위 예제에서는 HelloHandler struct를 정의하고 ServeHTTP 메소드를 구현했습니다.

main 함수에서 핸들러를 인스턴스화하고 http.ListenAndServe에 전달하고 있습니다.

http.ListenAndServe는 지정한 포트에서 HTTP 서버를 시작하는 함수입니다.

클라이언트가 / 경로로 요청하면 HelloHandler의 ServeHTTP 메소드가 호출되며 “Hello World!” 문자열을 응답합니다.

이처럼 Go언어의 HTTP 서버에서 요청을 처리할 핸들러를 구현할 때는 ServeHTTP 메소드를 가진 struct타입을 정의하고 메소드에 요청과 응답을 조작하는 로직을 개발하면 됩니다.

이상으로 프로그램언어 고(Go)에서 핸들러 함수를 생성하는 방법에 대해 간단히 설명드렸습니다. 보다 자세한 사항이나 예제코드가 필요하시면 문의 부탁드립니다.

프로그램언어 고(Go)에서의 REST API route 설정 방법

Go언어에서 REST API의 route를 설정하는 방법은 주로 net/http 패키지의 Handler와 ServeMux를 사용합니다.


package main

import (
    "fmt"
    "net/http"
)

func main() {

    http.HandleFunc("/users", getUsers)
    http.HandleFunc("/users/", getUserByID)

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

func getUsers(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Getting all users") 
}

func getUserByID(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
    id := vars["id"]
    fmt.Fprintf(w, "Getting user %s\n", id) 
}

위의 코드에서 http.HandleFunc 함수를 사용하여 각 route에 대한 handler 함수를 등록합니다.

예를 들어 “/users” 경로에 대해서는 getUsers 핸들러 함수를, “/users/” 경로에 대해서는 getUserByID 핸들러 함수를 연결합니다.

그리고 http.ListenAndServe 함수로 특정 포트(여기서는 8080)에서 서버를 시작합니다.

요청이 들어오면 등록된 핸들러 함수가 호출되어 응답을 생성합니다.

– getUsers 함수는 단순히 “Getting all users” 문자열을 출력
– getUserByID 함수는 요청 경로에서 ID 변수를 추출하여 “Getting user {id}” 포맷의 문자열 출력

이처럼 HandleFunc을 사용하여 원하는 핸들러를 등록하는 방식으로 REST API의 route를 손쉽게 설정할 수 있습니다.

주의할 점은 한 route에 대해 여러 핸들러를 등록할 수 없다는 것입니다.

동일한 route에 대한 처리를 추가하고 싶다면 하나의 핸들러에서 각 기능을 호출하는 방식을 사용해야 합니다.

프로그램언어 고(Go)에서의 JSON 응답 작성 방법

Go 언어에서 JSON 응답을 작성하는 방법은 다음과 같습니다.


package main

import "encoding/json"

type Response struct {
    Message string `json:"message"`
}

func main() {

    // JSON 응답 구조체 정의
    res := Response{
        Message: "Hello World", 
    }

    // encoding/json 패키지의 Marshal 함수를 사용하여 Go 구조체를 JSON으로 인코딩
    jsonBytes, _ := json.Marshal(res)

    // []byte를 string으로 변환
    jsonString := string(jsonBytes)
    
    // JSON 응답 출력
    println(jsonString)
    // {"message":"Hello World"}
}

위 예제코드에서 Go의 struct를 사용하여 JSON 응답의 구조를 정의합니다.

struct 태그로 json:”message” 과 같이 지정하면 Go struct의 필드 이름을 JSON 객체의 키로 매핑할 수 있습니다.

그리고 encoding/json 패키지의 Marshal 함수를 사용하여 Go struct 인스턴스를 JSON 바이트 슬라이스로 인코딩할 수 있습니다.

마지막으로 바이트 슬라이스를 string으로 변환하여 JSON 텍스트 문자열을 얻을 수 있습니다.

이 문자열을 HTTP 응답 본문으로 사용하면 JSON API 서버를 구현할 수 있습니다.

이외에도 Go 언어 기본 패키지들과 외부 패키지를 사용하여 보다 편리하고 다양한 방법으로 JSON API 서버를 구현할 수 있습니다.

예를 들어 net/http 패키지의 Request와 ResponseWriter를 활용할 수도 있고,
gin, echo 등의 Web 프레임워크를 사용할 수도 있습니다.

이상으로 Go언어에서 JSON 응답 작성 방법에 대한 간략한 설명을 드렸습니다.
좀 더 자세한 사용 방법과 예제 코드는 Go언어 공식 문서나 각종 참고 자료를 확인해보시기 바랍니다.

프로그램언어 고(Go)에서의 HTTP request 처리 방법

Go언어에서 HTTP request를 처리하는 방법은 주로 net/http 패키지를 사용합니다.


package main

import (
    "fmt"
    "net/http"
)

func main() {

    // HTTP 서버 생성
    http.HandleFunc("/", handler) 
    http.ListenAndServe(":8080", nil)
}

func handler(w http.ResponseWriter, r *http.Request) {
    
    // 요청 처리 로직 작성
    fmt.Fprint(w, "Hello World") 
}

위 예제코드에서 보다시피 net/http 패키지의 http.HandleFunc 함수를 사용하여 요청 경로와 핸들러 함수를 매핑합니다.

그리고 http.ListenAndServe 함수로 HTTP 서버를 생성합니다. 이 함수는 지정한 포트(여기서는 8080)에서 서버를 시작합니다.

handler 함수가 HTTP 요청을 처리하는 핸들러 함수입니다. http.ResponseWriter와 *http.Request 타입의 매개변수를 받아들입니다.

http.Request에는 클라이언트의 요청 데이터가 들어있고, http.ResponseWriter로 응답을 보냅니다.

위 예제는 간단하게 “Hello World” 문자열을 클라이언트에 응답으로 보내는 예제입니다.

프로그램언어 고(Go)에서의 REST API 테스트 방법

고(Go)에서 REST API를 테스트하는 방법에 대해 설명드리겠습니다.

우선 고(Go)에서 제공하는 테스트 패키지를 사용하여 REST API를 테스트할 수 있습니다. 주로 net/http/httptest 패키지가 자주 사용됩니다.

이 패키지에는 NewRequest, NewRecorder 등의 유틸리티 함수들이 제공되는데, 이를 이용해 요청과 응답을 가상으로 생성할 수 있습니다. 그리고 이를 기반으로 해당 REST API로 요청을 보내고 응답을 검증할 수 있죠.


func TestGetUser(t *testing.T) {

    // 1. 가상 요청 만들기 
    req := httptest.NewRequest("GET", "/users/1", nil)

    // 2. 응답 기록器 만들기
    w := httptest.NewRecorder()

    // 3. 핸들러 호출하기
    myHandler(w, req)

    // 4. 응답 검증
    if w.Code != 200 {
        t.Errorf("Expected status code 200, got %d", w.Code) 
    }

    ...
}

위 코드처럼 요청과 응답을 직접 제어할 수 있습니다. 또한 대응하는 핸들러를 직접 호출하여 테스트할 수도 있지요. 주로 테스트 케이스 단위로 작성하며 table driven test 방식도 많이 사용합니다.

이 외에도 httptest 패키지를 사용한 mock server 생성, 요청/응답 추적 등 고급 기능도 제공합니다. 실제 서버와 비슷한 테스트 환경을 만들 수 있죠.

따라서 Go언어로 개발된 REST API 서버의 경우 httptest 패키지를 기반으로 단위테스트와 통합테스트를 작성하는 것이 일반적입니다. 테스트의 포괄 범위에 따라 다양한 기능을 유연하게 사용할 수 있습니다.

마지막으로 별도의 테스트 프레임워크를 활용하는 방법도 있습니다. 대표적으로 Ginkgo, GoConvey 등이 있는데요. 이들은 테스트 구조화, 반복 실행, 병렬 실행 등 추가 기능을 제공하므로 규모가 큰 서비스의 자동화된 테스트에 적합합니다.

지금까지 고(Go)언어로 작성된 REST API 서버를 테스트하는 다양한 방법에 대해 간략히 설명드렸습니다. 보다 자세한 사용 예시가 필요하다면 별도로 문의 주시기 바랍니다.

Leave a Comment