24.2. 프로그램언어 고(Go)의 라우팅과 핸들러

프로그램언어 고(Go)에서의 기본적인 라우트 생성

고(Go)언어에서 기본적인 라우트를 생성하는 방법을 쉽고 상세하게 설명드리겠습니다.


package main

import (
    "fmt"
    "net/http"
)

func main() {

    http.HandleFunc("/", home)

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

func home(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Welcome!") 
}

위의 코드는 고(Go)언어에서 가장 기본적인 라우트를 생성하는 예제입니다.

main 함수에서 http.HandleFunc를 사용하여 라우트를 생성합니다.

“/” 라우트에 home 핸들러 함수를 연결합니다.

그리고 http.ListenAndServe를 사용하여 8080 포트에서 웹서버를 시작합니다.

home 핸들러 함수는 단순히 “Welcome!” 문자열을 출력하는 역할을 합니다.

이처럼 고(Go)언어에서는 http 패키지를 활용하여 간단하게 라우트와 핸들러를 생성할 수 있습니다.

필요한 라우트별로 핸들러 함수를 정의하고 http.HandleFunc를 사용하여 연결하면 됩니다.

마지막으로 http.ListenAndServe로 웹서버를 구동하면 기본적인 라우팅 기능이 동작하는 웹애플리케이션을 만들 수 있습니다.

이해가 안가는 부분이 있다면 언제든지 질문 주십시오.

프로그램언어 고(Go)의 핸들러 함수 작성법

GO언어에서 핸들러 함수를 작성하는 방법은 다음과 같습니다.


package main

import (
    "fmt"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello World!") 
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil) 
}

위 예제코드에서 보다시피 핸들러 함수는 http.ResponseWriter와 *http.Request를 파라미터로 받습니다.

http.ResponseWriter는 응답에 대한 데이터를 쓰기 위해 사용되고,
*http.Request는 요청에 대한 정보를 가져오기 위해 사용됩니다.

핸들러 함수 내부에서는 응답 데이터를 작성할 수 있습니다. 위 예제에서는 간단히 “Hello World!” 문자열을 출력하고 있습니다.

메인 함수에서는 http.HandleFunc 함수를 사용하여 라우팅을 설정합니다.
“/” 라우트에 handler 함수를 매핑했습니다.

그리고 http.ListenAndServe 함수로 웹서버를 시작합니다.
“:8080″은 8080 포트를 사용한다는 의미입니다.

이렇게 핸들러 함수와 라우팅을 설정하면 / 요청이 오면 handler 함수가 실행되어 응답을 반환하는 웹애플리케이션이 구현됩니다.

핸들러 함수는 보통 한 가지 요청을 처리하기 위한 것이기 때문에 작고 간결하게 작성하는 것이 좋습니다.

더 복잡한 웹애플리케이션을 만들 경우 라우터, 컨트롤러, 서비스 계층 등으로 역할을 분리하는 것이 유지보수에 좋습니다.

이상으로 GO언어의 핸들러 함수 작성법에 대한 설명을 마치겠습니다.
추가로 궁금한 점이 있으시면 문의 주시기 바랍니다.

프로그램언어 고(Go)에서의 라우트별 핸들러 할당방법

Go 언어에서 라우터별 핸들러를 할당하는 방법은 다음과 같습니다.


package main

import (
    "fmt"
    "net/http"
)

func homePage(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Welcome to the HomePage!")
}

func aboutPage(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Welcome to the AboutPage!") 
}

func main() {
    http.HandleFunc("/", homePage)
    http.HandleFunc("/about", aboutPage)

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

위 예제코드에서 보면 ‘/’ 및 ‘/about’와 같은 특정 라우트로 오는 요청에 대해 각각 별도의 핸들러 함수를 할당하고 있습니다.

‘http.HandleFunc’ 함수를 사용하여 특정 라우트별로 원하는 핸들러를 등록할 수 있습니다. 첫 번째 인자로 경로를, 두 번째 인자로 해당 경로에 대한 요청이 왔을 때 실행할 핸들러 함수를 넘겨줍니다.

예제에서 ‘/’ 경로 요청에 대해서는 homePage 핸들러 함수를, ‘/about’ 경로 요청에 대해서는 aboutPage 핸들러 함수를 각각 할당했습니다.

이런 식으로 Go의 http 패키지를 활용하여 원하는 대로 라우트별 다른 핸들러를 할당할 수 있습니다. 핸들러 함수의 정의에 유의하시기 바랍니다. 반드시 http.ResponseWriter와 *http.Request를 인자로 받아야 합니다.

이렇게 라우트별로 핸들러 함수를 정의하고 http.HandleFunc을 통해 할당한 후, http.ListenAndServe 함수로 서버를 실행하면 각 라우트 경로에 따라 정의한 핸들러 함수가 호출되어 실행될 것입니다.

코드에 대한 더 자세한 설명이나 예제가 필요하시다면 별도로 문의 주시기 바랍니다.

프로그램언어 고(Go)에서의 동적 라우트 생성

고(Go)언어에서 동적 라우트 생성은 URI 패턴에 매개변수를 사용하여 동적 라우트를 만드는 기법입니다.


package main

import (
    "fmt"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello %s!", r.URL.Path[1:])
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil) 
}

위 예제코드에서 ‘/’ 패턴 라우트 핸들러에 http.Request의 r.URL.Path 값을 출력하고 있습니다.

r.URL.Path는 요청된 URI의 경로부분을 가리키며 이를 통해 동적 라우트 매개변수를 얻을 수 있습니다.

예를 들어 “/john”이라는 URI로 요청이 오면 handler 함수 내에서 r.URL.Path는 “/john” 값을 가지며 [1:]를 통해 “john” 문자열을 얻을 수 있습니다.

이를 통해 URI 경로의 일부를 가변적인 값으로 사용할 수 있기 때문에 동적 라우트를 생성할 수 있습니다.

즉 고(Go)의 http 패키지를 사용하여 URI 패턴 안에서 일부 경로를 매개변수처럼 활용함으로써 동적 라우트를 유연하게 생성할 수 있답니다.

지금 설명드린 내용이 잘 이해가 되시는지 궁금합니다. 더 자세한 부분이나 예제가 필요하시면 문의 부탁드립니다.

프로그램언어 고(Go)의 핸들러에서 요청 정보 처리


// 핸들러 함수
func handleRequest(w http.ResponseWriter, r *http.Request) {
    // 요청 정보 가져오기
    username := r.FormValue("username") 
    age := r.FormValue("age")
    
    // 요청 정보 처리
    if username == "" {
        // username이 비어있다면 에러 응답
        w.WriteHeader(http.StatusBadRequest)
        w.Write([]byte("username은 필수값입니다"))
        return
    }
    
    // 연령 확인
    ageNum, err := strconv.Atoi(age)
    if err != nil {
        // 연령 형식이 잘못되었다면 에러 응답
        w.WriteHeader(http.StatusBadRequest)
        w.Write([]byte("age 값이 숫자 형식이 아닙니다"))  
        return  
    }
    
    if ageNum < 18 {
        // 미성년자인 경우 에러 응답
        w.WriteHeader(http.StatusForbidden)
        w.Write([]byte("18세 미만 사용자는 접근할 수 없습니다"))
        return 
    }
    
    // 정상 요청 처리
    w.WriteHeader(http.StatusOK)
    w.Write([]byte("정상 요청입니다"))
}

이 예제 코드는 Go 언어의 HTTP 핸들러 함수입니다.

핸들러 함수는 HTTP 요청을 처리하고 응답을 보내는 기능을 합니다.

handleRequest 함수가 HTTP 요청을 받으면 우선 username과 age 파라미터를 가져옵니다.

그리고 나서 값의 유효성을 검사합니다. username이 비어있다면 400 에러를, age 가 숫자 형식이 아니라면 400 에러를 반환합니다.

또 age가 18세 미만이면 403 에러를 반환하는 로직을 확인할 수 있습니다.

마지막으로 정상 요청일 경우 200 성공 응답을 반환하는 것을 확인할 수 있습니다.

주석과 코드를 통해 핸들러의 요청 처리 과정을 단계별로 쉽고 자세하게 설명하고 있다고 생각합니다.

질문이 있다면 추가로 답변 드리겠습니다.

Leave a Comment