본문 바로가기
Golang

[Golang]Go 언어로 웹 서버 만들기, 정말 쉬워요! 🚀 net/http 패키지 완벽 가이드

by 다다면체 2025. 2. 12.
728x90
반응형

개발자 여러분, 웹 서버 개발, 어렵게 생각하셨나요? 🤔 Go 언어의 강력한 net/http 패키지만 있다면, 복잡한 설정 없이도 간결하고 효율적인 웹 서버를 뚝딱 만들 수 있다는 사실, 알고 계셨나요? 마치 레고 블록 조립하듯, 필요한 기능만 쏙쏙 골라 나만의 웹 서비스를 구축할 수 있습니다. 🧱✨

이번 가이드에서는 Go의 net/http 패키지를 속속들이 파헤쳐 보겠습니다. 기본 웹 서버 구축부터, HTTP 요청 처리, 똑똑한 라우팅, 미들웨어 활용, RESTful API 서버까지, 웹 개발의 핵심 내용을 실습과 함께 차근차근 알려드릴게요. 준비되셨나요? 💨


🔹 Go의 net/http 패키지 개요

Go의 net/http 패키지는 웹 서버 개발에 필요한 거의 모든 것을 제공하는 든든한 친구입니다. 이 패키지 하나면 다음과 같은 강력한 기능들을 손쉽게 활용할 수 있어요.

  • HTTP 요청과 응답: 웹 브라우저와 서버 간의 소통을 책임지는 핵심 기능! 요청을 받고, 응답을 보내는 과정을 완벽하게 제어할 수 있습니다. 🗣️ ➡️ 👂
  • 똑똑한 라우팅: 다양한 URL 경로에 따라 원하는 핸들러 함수를 연결! 웹 서비스의 길을 깔끔하게 정리해줍니다. 🛣️
  • 미들웨어 마법: 요청과 응답 사이에 추가 기능을 덧입히는 미들웨어! 로깅, 보안, 인증 등 다양한 기능을 손쉽게 확장할 수 있어요. ✨
  • RESTful API: 현대 웹 서비스의 대세, RESTful API 서버 구축도 문제없어요! 효율적이고 확장 가능한 API를 Go로 빠르게 만들 수 있습니다. 🌐

자, 그럼 이제 net/http 패키지의 강력한 기능들을 직접 경험해 볼까요? 기본 웹 서버부터 차근차근 만들어 봅시다! 🛠️


🛠️ 기본 웹 서버 구축하기

Go에서 기본 웹 서버를 구현하는 것은 매우 간단합니다.

package main

import (
    "fmt"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Hello, Go Web Server!")
}

func main() {
    http.HandleFunc("/", handler)
    fmt.Println("서버 시작: http://localhost:8080")
    http.ListenAndServe(":8080", nil)
}

✅ 코드 설명

http.HandleFunc("/", handler): 루트 경로 (/) 로 접속하면 handler 함수가 실행되도록 설정하는 부분입니다. 마치 웹 사이트의 대문을 설정하는 것과 같아요! 🚪

http.ListenAndServe(":8080", nil): 8080 포트에서 웹 서버를 시작하는 핵심 코드입니다. 웹 서버가 문을 열고 손님을 맞이할 준비를 하는 거죠! 🚪🔑

handler 함수: 웹 서버로 요청이 들어왔을 때 실제로 응답을 처리하는 함수입니다.

  • w http.ResponseWriter: 응답을 보낼 때 사용하는 도구입니다. fmt.Fprintln(w, ...) 를 통해 클라이언트에 텍스트 응답을 전달합니다. 마치 편지 봉투와 같아요! ✉️
  • r *http.Request: 요청에 대한 정보를 담고 있는 구조체입니다. 요청 방식, URL, 헤더 등 다양한 정보를 확인할 수 있습니다. 마치 편지 내용과 같아요! 📜

이 코드를 실행하고 웹 브라우저에서 http://localhost:8080 에 접속해 보세요! "Hello, Go Web Server!" 라는 멋진 메시지가 화면에 짠! 하고 나타날 겁니다. 🎉 정말 간단하죠?


🔀 라우팅 기능 구현

웹 서비스가 복잡해질수록, 다양한 경로를 효율적으로 관리하는 라우팅 기능이 중요해집니다. Go의 net/http는 라우팅 기능도 아주 쉽게 구현할 수 있도록 도와줍니다.

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

func aboutHandler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintln(w, "About Page")
}

func main() {
	http.HandleFunc("/hello", helloHandler)
	http.HandleFunc("/about", aboutHandler)
	fmt.Println("서버 시작: http://localhost:8080")
	http.ListenAndServe(":8080", nil)
}

📌 핵심 개념

  • http.HandleFunc("/hello", helloHandler): 이제 /hello 경로로 접속하면 helloHandler 함수가,
  • http.HandleFunc("/about", aboutHandler): /about 경로로 접속하면 aboutHandler 함수가 실행됩니다.

웹 브라우저에서 http://localhost:8080/hello 와 http://localhost:8080/about 에 각각 접속해 보세요. 경로에 따라 다른 메시지가 출력되는 것을 확인할 수 있습니다. 웹 서비스의 여러 페이지를 손쉽게 구성할 수 있겠죠? 😉


반응형

⚡ 미들웨어 적용하기

미들웨어는 요청과 응답 처리 과정에 추가적인 로직을 끼워 넣는 강력한 도구입니다. 마치 웹 서버에 다양한 마법을 부리는 것과 같아요! ✨ 로그 기록, 사용자 인증, 데이터 압축, CORS 설정 등, 정말 다양한 기능을 미들웨어를 통해 간편하게 추가할 수 있습니다.

이번에는 요청 로깅 미들웨어를 만들어 보겠습니다. 웹 서버에 어떤 요청이 들어왔는지 로그를 남기는 기능이죠.

func loggingMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Printf("%s %s\n", r.Method, r.URL.Path)
        next.ServeHTTP(w, r)
    })
}

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "Welcome to the Go Web Server!")
    })

    server := &http.Server{
        Addr:    ":8080",
        Handler: loggingMiddleware(mux),
    }

    fmt.Println("서버 시작: http://localhost:8080")
    server.ListenAndServe()
}

📌 핵심 개념

loggingMiddleware 함수: 미들웨어 함수는 http.Handler 를 인자로 받고, http.Handler 를 반환하는 형태를 가집니다.

  • http.HandlerFunc 를 사용하여 http.Handler 인터페이스를 구현하는 함수를 쉽게 만들 수 있습니다.
  • next.ServeHTTP(w, r) 를 호출하여 다음 핸들러를 실행하는 것이 미들웨어의 핵심입니다. 미들웨어가 여러 개 연결될 수 있기 때문에, next 를 통해 요청과 응답이 다음 단계로 전달되도록 해야 합니다. ➡️

 

http.NewServeMux(): 여러 개의 핸들러를 등록하고 관리할 수 있는 ServeMux 를 새로 생성합니다.

http.Server: 웹 서버 설정을 담는 구조체입니다.

  • Handler: loggingMiddleware(mux): loggingMiddleware 로 mux 를 감싸서 미들웨어를 적용합니다. 이제 모든 요청은 loggingMiddleware 를 거쳐 mux 로 전달됩니다.

이제 서버를 실행하고 웹 브라우저에서 접속해 보세요. 콘솔에 요청 메서드와 경로가 로깅되는 것을 확인할 수 있습니다. 미들웨어를 활용하면 로깅 외에도 인증, 권한 관리, 에러 처리 등 다양한 기능을 웹 서버에 손쉽게 추가할 수 있습니다. 정말 편리하죠? 👍

 

 


🌐 RESTful API 서버 구축

최근 웹 서비스는 대부분 RESTful API 형태로 데이터를 주고받습니다. Go의 net/http 패키지를 사용하면 JSON 기반의 API 서버도 아주 쉽게 만들 수 있습니다.

func getUserHandler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    w.Write([]byte(`{"id": 1, "name": "Alice"}`))
}

func main() {
    http.HandleFunc("/user", getUserHandler)
    fmt.Println("REST API 서버 실행: http://localhost:8080/user")
    http.ListenAndServe(":8080", nil)
}

✅ REST API 서버 특징

  • w.Header().Set("Content-Type", "application/json"): 응답 헤더의 Content-Type 을 application/json 으로 설정하여, 클라이언트에게 JSON 형식으로 응답할 것임을 알려줍니다. 마치 택배 상자에 "JSON 데이터" 라고 큼지막하게 표시하는 것과 같아요! 📦
  • **w.Write([]byte(\{"id": 1, "name": "Alice"}`))**:w.Write를 사용하여 JSON 데이터를 응답으로 보냅니다. Go에서는 문자열을[]byte로 변환하여Write` 함수에 전달해야 합니다.

이제 서버를 실행하고 웹 브라우저 또는 Postman 같은 API 툴로 http://localhost:8080/user 에 접속해 보세요. JSON 형식의 사용자 정보가 응답으로 오는 것을 확인할 수 있습니다. 이 코드를 기반으로 사용자 생성, 수정, 삭제 등 다양한 API 엔드포인트를 추가하여 полноцен한 RESTful API 서버를 구축할 수 있습니다. 🚀


🔥 마무리

이번 가이드에서는 Go 언어의 net/http 패키지를 활용하여 웹 서버를 구축하는 기본적인 방법들을 살펴봤습니다. 어떠셨나요? Go의 net/http 패키지는 강력하면서도 사용하기 쉬워서, 웹 개발 입문자도 금방 익숙해질 수 있습니다.

✅ 핵심 요약:

  • net/http 패키지: Go 웹 서버 개발의 핵심 도구!
  • http.HandleFunc: 경로별 핸들러 함수 연결! 라우팅 설정!
  • 미들웨어: 요청-응답 처리 과정에 기능 추가! 확장성 UP!
  • RESTful API: JSON 기반 API 서버 구축! 현대 웹 서비스 개발!

Go의 강력한 웹 서버 기능을 적극 활용하여, 여러분만의 멋진 웹 애플리케이션을 만들어 보세요! Go 웹 개발은 정말 즐겁습니다! 🚀🎉

궁금한 점이나, 더 자세히 알고 싶은 내용이 있다면 언제든지 댓글로 문의해주시고, 좋아요와 구독 부탁드려요! 🙌

728x90
반응형