GO · 패턴
핸들러 패턴
HTTP 핸들러를 구조체로 구현하여 의존성을 주입합니다. 테스트하기 쉬운 구조입니다.
패턴중급handlerhttpdependency-injectiontestable
핵심 설명
HTTP 핸들러를 구조체로 구현하여 의존성을 주입합니다. 테스트하기 쉬운 구조입니다.
Go code
package main
import (
"encoding/json"
"fmt"
"net/http"
)
type UserService interface {
GetByID(id string) (map[string]string, error)
}
type mockService struct{}
func (s *mockService) GetByID(id string) (map[string]string, error) {
return map[string]string{"id": id, "name": "Gopher"}, nil
}
// 핸들러 구조체
type UserHandler struct {
svc UserService
}
func NewUserHandler(svc UserService) *UserHandler {
return &UserHandler{svc: svc}
}
func (h *UserHandler) Get(w http.ResponseWriter, r *http.Request) {
id := r.PathValue("id")
user, err := h.svc.GetByID(id)
if err != nil {
http.Error(w, err.Error(), 404)
return
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(user)
}
func (h *UserHandler) RegisterRoutes(mux *http.ServeMux) {
mux.HandleFunc("GET /users/{id}", h.Get)
}
func main() {
svc := &mockService{}
handler := NewUserHandler(svc)
mux := http.NewServeMux()
handler.RegisterRoutes(mux)
fmt.Println("핸들러 등록 완료: GET /users/{id}")
}학습 팁
핸들러 구조체에 서비스 인터페이스를 주입하면 테스트 시 목 서비스로 교체할 수 있습니다.
주의할 점
핸들러에서 비즈니스 로직을 직접 구현하면 테스트와 재사용이 어렵습니다. 서비스 계층으로 분리하세요.
자주 묻는 질문
핸들러 패턴란 무엇인가요?
HTTP 핸들러를 구조체로 구현하여 의존성을 주입합니다. 테스트하기 쉬운 구조입니다.
핸들러 패턴 학습 시 주의할 점은 무엇인가요?
핸들러에서 비즈니스 로직을 직접 구현하면 테스트와 재사용이 어렵습니다. 서비스 계층으로 분리하세요.