Go HTTP Server(서버) – 업무에 사용하는 Go 언어 응용편 2

Go HTTP Server(서버)
Go HTTP Server(서버)

Go 언어 문법을 익히고 나면 실제로 동작하는 무언가를 만들고 싶어집니다. 이때 가장 재밌고 간단하게 만들어 볼 것이 웹 서버 구현입니다. 본 글에서는 Go 언어의 기본 패키지인 net/http를 사용하여 간단한 go HTTP 서버를 만드는 방법을 소개합니다.


Go HTTP의 개요와 장점

Go는 간결한 문법과 뛰어난 성능 덕분에 서버 개발에 많이 사용됩니다. 특히 go http 패키지는 별도의 외부 라이브러리 없이도 HTTP 서버를 간단하게 구축할 수 있는 기능을 제공합니다. 비동기 처리를 위한 고루틴과 기본으로 제공되는 라우팅 처리 기능은 가벼운 서버 구현에 최적화되어 있습니다.

필자는 프론트엔드와 연동 테스트를 할 때 임시 서버를 빠르게 구축해야 하는 일이 많습니다. 그럴 때마다 go언어 http 패키지를 사용하여 JSON 응답을 반환하는 테스트 서버를 만들어 활용해 왔습니다.


go http를 이용한 기본 서버 예제

Go에서 가장 간단한 HTTP 서버를 만드는 코드는 다음과 같습니다:

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)
    fmt.Println("서버 실행 중: http://localhost:8080")
    http.ListenAndServe(":8080", nil)
}

이 코드는 루트 경로(/)로 접속했을 때 “Hello, World!”라는 문장을 출력하는 go server입니다. 복잡한 설정 없이도 몇 줄로 작동하는 웹 서버를 만들 수 있다는 점은 Go의 큰 장점입니다.

여기서 http.HandleFunc은 지정한 URL 경로와 해당 경로에 대한 요청을 처리할 함수를 연결하는 역할을 합니다. 두 번째 인자로는 핸들러 함수(handler)를 전달하며, 이 함수는 http.ResponseWriter와 http.Request 두 개의 파라미터를 받습니다. ResponseWriter는 클라이언트에 데이터를 반환하는 데 사용되고, Request는 요청에 대한 정보(메서드, 헤더, 본문 등)를 담고 있습니다.

fmt.Fprintf(w, …)는 ResponseWriter를 통해 클라이언트에게 응답을 쓰는 함수입니다. 이 예제에서는 단순히 “Hello, World!” 문자열을 브라우저에 출력합니다. http.ListenAndServe(“:8080”, nil)는 8080 포트에서 서버를 시작하고, 등록된 핸들러로 요청을 분배합니다. 세 번째 인자인 nil은 기본 ServeMux를 사용하겠다는 의미입니다.

필자는 처음 학습할 때 이 구조를 바탕으로 로그 출력, 요청 헤더 분석, 간단한 인증 구조 등을 추가하며 학습을 확장해 나갔습니다.


JSON 응답 처리

실제 웹 어플리케이션을 개발할 때는 단순한 텍스트가 아닌 JSON 형식의 응답이 필요합니다. go http를 활용하면 아래와 같이 간단하게 JSON 응답을 설정할 수 있습니다:

Go
func jsonHandler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    json := `{"message": "안녕하세요, Go 서버입니다."}`
    fmt.Fprint(w, json)
}

func main() {
    http.HandleFunc("/json", jsonHandler)
    fmt.Println("JSON 서버 실행 중: http://localhost:8080/json")
    http.ListenAndServe(":8080", nil)
}

필자는 텔레그램 봇 API를 구현하면서 외부 요청을 처리하기 위해 이와 같은 방식으로 go언어 server를 구현했습니다. 빠르게 테스트 가능한 환경을 만드는 데 매우 효과적이었습니다.


라우팅 처리와 구조화

단일 핸들러만으로는 다양한 요청을 처리하기 어렵기 때문에, URL 경로에 따라 다양한 핸들러를 설정하는 라우팅 구조가 필요합니다. net/http 패키지는 기본적인 라우팅 기능을 제공합니다:

Go
func home(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "홈 페이지입니다.")
}

func about(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "소개 페이지입니다.")
}

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

이러한 방식으로 go언어 http 기반의 간단한 라우팅 서버를 만들 수 있습니다. 실제 프로젝트에서는 더 복잡한 라우팅 구조와 미들웨어를 적용할 수도 있으며, 이 경우에는 외부 라우터 라이브러리(예: gorilla/mux)를 사용하는 것이 좋습니다.


에러 처리와 실전 팁

실제 운영 서버에서는 단순한 성공 응답 외에도 다양한 예외 처리가 필요합니다. http.Error() 함수를 활용하면 클라이언트에게 적절한 상태 코드와 메시지를 보낼 수 있습니다:

Go
func handler(w http.ResponseWriter, r *http.Request) {
    if r.Method != http.MethodGet {
        http.Error(w, "허용되지 않은 메서드입니다.", http.StatusMethodNotAllowed)
        return
    }
    fmt.Fprint(w, "GET 요청입니다.")
}

필자는 실제 서비스용 서버를 만들면서 위와 같은 방식으로 메서드 검사, 파라미터 유효성 검사 등을 수행하였습니다. go언어 server는 기본적인 기능만으로도 꽤 강력한 유효성 검사 및 에러 처리가 가능합니다.


go http를 사용한 텔레그램 봇 서버 구축 경험 공유

앞서 언급한 것처럼 필자는 Telegram 봇을 구축하면서 go http 기능을 적극 활용하였습니다. 외부에서 전송되는 웹훅 데이터를 수신하고, 이를 처리하여 다시 응답하는 구조를 구현하는 데 net/http 패키지가 큰 도움이 되었습니다. 초기에는 fmt.Fprint를 이용한 단순 응답부터 시작했지만, 점차 JSON 디코딩, 라우팅 구분, 응답 최적화 등의 기법을 익히며 실제 운영에 적용할 수 있었습니다.


Go HTTP 서버 배포

go http로 만든 서버를 외부에서 접근 가능하게 하려면 웹 서버나 프록시 서버를 통해 포트를 개방해야 합니다. 이때 Caddy, Nginx와 같은 WAS를 사용하면 매우 간편하게 HTTPS 적용까지 포함된 배포 환경을 구성할 수 있습니다.

예를 들어 다음과 같이 Caddyfile을 설정하면:

Go
http://example.com {
    reverse_proxy localhost:8080
}

go http 서버가 8080 포트에서 동작하고 있다면, Caddy가 example.com 도메인으로 들어오는 요청을 해당 서버로 포워딩해줍니다. Let’s Encrypt를 통한 자동 인증서 발급까지 지원되므로, 개인 프로젝트나 소규모 서비스의 배포에 매우 유용합니다.

이에 대해 본 시리즈에서 더 상세히 다루어 볼 예정입니다.


Go 언어 HTTP 서버의 실용성

Go 언어로 HTTP 서버를 만드는 일은 생각보다 어렵지 않습니다. go http 패키지를 활용하면 몇 줄의 코드로도 실용적인 서버를 구성할 수 있습니다. 특히 테스트 서버나 간단한 API 서버, 그리고 웹훅 처리를 위한 서비스 등을 구축할 때 유용하게 사용됩니다.

이 글에서는 go언어 http 기능을 활용하여 어떻게 서버를 만들 수 있는지 기본적인 예제부터 실전 경험까지 폭넓게 다루었습니다. 독자분들도 자신만의 go server를 만들어보며 Go 언어의 강력함을 체험해보시기 바랍니다.