무지개곰
article thumbnail
반응형

Go 언어의 기초 문법을 이전 시간까지 다루었습니다. 앞에서 배운 문법과 패키지를 이용하여 웹 서버에 대한 공부를 시작하려고 합니다.

웹 서버 개발에 대한 참고는 'Go 언어를 활용한 마이크로서비스 개발'이라는 책을 참고하여 공부하였습니다.

목차

net/http 패키지

서버 생성

net/http 라우팅


net/http 패키지

net/http 패키지는 Go 언어에서 HTTP 웹 서버와 클라이언트를 구현하고 사용하기 위한 핵심 패키지입니다. 이 패키지는 다양한 HTTP 메서드 (GET, POST, PUT, DELETE 등)를 처리하고, 요청 및 응답을 다루며, 라우팅 및 핸들링을 담당합니다.


서버 생성

net/http 패키지를 사용하여 서버를 생성하는 방법은 아래와 같습니다.

func main(){
    port := 8080
    
    http.HandleFunc("/", webHandler)
    
    log.Println("Rainbowbear Server Starting on port :", port)
    log.Fatal(http.ListenAndServe(fmt.Sprint(":", port), nil))
}

func webHandler(w http.ResponseWriter, r *http.Request){
    fmt.Fprintln(w, "Rainbowbear world")
}

1. port라는 변수에 사용할 포트 번호를 지정합니다.

 

2. http.HandleFunc를 사용하여 라우터를 지정하고 해당하는 라우터에 접근하였을 때 실행될 핸들러 함수를 지정합니다.

위의 예시에서 핸들러 함수는 webHandler로 작성을 해두었습니다. 매개변수로 http.ResponseWriter와 *http.Request를 받아서 요정에 대한 응답을 처리합니다. 자세한 내용은 Router에서 다루겠습니다.

위의 예시는 응답으로 "Rainbowbear world"를 보내게 됩니다.

 

3. log.Println은 main함수를 실행하면 띄울 log를 작성합니다.

log.Prinln 결과

4. log.Fatal은 os.Exit(1) 함수를 호출하여 프로그램을 종료하며 지정할 메시지를 에러 출력으로 출력합니다.

 

5. http.ListenAndServer은 서버가 사용할 ip주소와 port를 작성하고 루트경로가 응답할 HandlerFunc를 입력합니다.

위의 예시처럼 ":8080"으로 작성하면 localhost주소를 사용합니다. HandlerFunc를 nil로 설정하면 DefaultServeMux 메서드가 사용됩니다.

 

http.ResponseWriter와 *http.Request에 대한 자세한 내용은 다음에 자세히 다루겠습니다.


net/http 라우팅

net/http 패키지에서 HTTP 요청 라우팅을 처리하기 위한 도구로 ServeMux가 있습니다. ServeMux를 사용하면 웹 서버에서 어떤 경로로 들어오는 HTTP 요청을 어떤 핸들러 함수로 라우팅 할지 간편하게 설정할 수 있습니다. 이를 통하여 다양한 URL 경로에 대하여 다양한 핸들러를 등록하고 사용할 수 있습니다.

혹은 위의 예시에서 ListenAndServe에서 두 번째 매개변수에 nil로 설정하면 DefaultServeMux를 사용하여 라우팅을 처리할 수 있습니다.

아직 두 방법에 대한 자세한 차이는 모르겠지만 mux는 변수에 라우팅을 저장된다는 점이 다른 것 같습니다. 변수에 저장하여 다양한 활용이 가능한 것으로 보입니다.

DefaultServeMux 예시

func main(){
    port := 8080
    
    http.HandleFunc("/", welcomeHandler)
    http.HandleFunc("/rainbow", rainbowHandler)
    http.HandleFunc("/bear", rainbowHandler)
    
    log.Println("Rainbowbear Server Starting on port :", port)
    log.Fatal(http.ListenAndServe(fmt.Sprint(":", port), nil))
}
func welcomeHandler(w http.ResponseWriter, r *http.Request){
    fmt.Fprintln(w, "Welcome")
}
func rainbowHandler(w http.ResponseWriter, r *http.Request){
    fmt.Fprintln(w, "Rainbow Area")
}
func bearHandler(w http.ResponseWriter, r *http.Request){
    fmt.Fprintln(w, "Bear Area")
}

DefaultServeMux를 이용하면 http.HandleFunc를 이용하여 라우팅을 할 수 있습니다.

http.HandleFunc는 첫 번째 매개변수로 경로를 입력받고 두 번째 매개변수로 핸들러 함수를 받습니다.

핸들러 함수는 요청에 대한 처리를 담당하는 함수로 위의 예시에서는 단순히 문자열을 출력하도록 하였습니다.

아래의 사진을 통하여 경로에 따라 출력이 다른 것을 확인할 수 있습니다.

ServeMux 예시

func welcomeFunc(w http.ResponseWriter, r *http.Request){
	fmt.Fprintln(w, "welcome")
}

func rainbowFunc(w http.ResponseWriter, r *http.Request){
	fmt.Fprintln(w, "Rainbow Area")
}

type BearHandler struct {
	name string
}

func (b *BearHandler) ServeHTTP(w http.ResponseWriter, r *http.Request){
	fmt.Fprintf(w, "bear name is %s", b.name)
}

func main(){
    port := 8080
    mux := http.NewServeMux()

    myBear := &BearHandler{name:"GoodBear"}

    mux.HandleFunc("/",welcomeFunc)
    mux.HandleFunc("/rainbow",rainbowFunc)
    mux.Handle("/bear",myBear)

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

위의 코드에서 http의 NewServeMux를 이용하여 Mux를 생성하여 ListenAndServe에 전달하였습니다.

 

반응형
profile

무지개곰

@무지개곰

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