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() 를 호출하지 않으면 잘못된 필드를 조용히 무시합니다.