PHpullh
학습 라이브러리/Go/HTTP 서버 고급 패턴

GO · 파일/IO

HTTP 서버 고급 패턴

구조화된 핸들러, 의존성 주입, 에러 처리를 결합한 프로덕션급 HTTP 서버 패턴입니다.

파일/IO고급http-handlerdependency-injectionstructuredapi

핵심 설명

구조화된 핸들러, 의존성 주입, 에러 처리를 결합한 프로덕션급 HTTP 서버 패턴입니다.

Go code

package main

import (
	"encoding/json"
	"fmt"
	"net/http"
)

// 에러를 반환하는 핸들러
type AppHandler func(w http.ResponseWriter, r *http.Request) error

func (fn AppHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	if err := fn(w, r); err != nil {
		w.Header().Set("Content-Type", "application/json")
		w.WriteHeader(500)
		json.NewEncoder(w).Encode(map[string]string{"error": err.Error()})
	}
}

// 핸들러 그룹 (의존성 주입)
type Handlers struct {
	// db *sql.DB  // 실제 의존성
}

func (h *Handlers) GetUser(w http.ResponseWriter, r *http.Request) error {
	id := r.PathValue("id")
	if id == "" {
		http.Error(w, "ID 필요", 400)
		return nil
	}
	w.Header().Set("Content-Type", "application/json")
	return json.NewEncoder(w).Encode(map[string]string{
		"id": id, "name": "Gopher",
	})
}

func (h *Handlers) CreateUser(w http.ResponseWriter, r *http.Request) error {
	var input struct{ Name string }
	if err := json.NewDecoder(r.Body).Decode(&input); err != nil {
		http.Error(w, "잘못된 JSON", 400)
		return nil
	}
	w.WriteHeader(201)
	return json.NewEncoder(w).Encode(input)
}

func main() {
	h := &Handlers{}
	mux := http.NewServeMux()
	mux.Handle("GET /api/users/{id}", AppHandler(h.GetUser))
	mux.Handle("POST /api/users", AppHandler(h.CreateUser))

	fmt.Println("구조화된 HTTP 서버 패턴")
	// http.ListenAndServe(":8080", mux)
}

학습 팁

AppHandler 패턴은 핸들러가 에러를 반환하게 하여 중앙 집중 에러 처리를 가능하게 합니다.

주의할 점

json.NewDecoder(r.Body)에서 DisallowUnknownFields()를 호출하지 않으면 잘못된 필드를 조용히 무시합니다.

자주 묻는 질문

HTTP 서버 고급 패턴란 무엇인가요?

구조화된 핸들러, 의존성 주입, 에러 처리를 결합한 프로덕션급 HTTP 서버 패턴입니다.

HTTP 서버 고급 패턴 학습 시 주의할 점은 무엇인가요?

json.NewDecoder(r.Body) 에서 DisallowUnknownFields() 를 호출하지 않으면 잘못된 필드를 조용히 무시합니다.

Continue Learning

Go 학습을 이어가세요

총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.