PHpullh
학습 라이브러리/Go/핸들러 패턴

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 핸들러를 구조체로 구현하여 의존성을 주입합니다. 테스트하기 쉬운 구조입니다.

핸들러 패턴 학습 시 주의할 점은 무엇인가요?

핸들러에서 비즈니스 로직을 직접 구현하면 테스트와 재사용이 어렵습니다. 서비스 계층으로 분리하세요.

Continue Learning

Go 학습을 이어가세요

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