GO · 패턴
플러그인 시스템
인터페이스 기반 플러그인 시스템으로 확장 가능한 아키텍처를 구현합니다.
패턴고급pluginregistryextensibleinterface
핵심 설명
인터페이스 기반 플러그인 시스템으로 확장 가능한 아키텍처를 구현합니다.
Go code
package main
import "fmt"
// 플러그인 인터페이스
type Plugin interface {
Name() string
Init() error
Execute(data map[string]any) (map[string]any, error)
}
// 플러그인 레지스트리
type Registry struct {
plugins map[string]Plugin
}
func NewRegistry() *Registry {
return &Registry{plugins: make(map[string]Plugin)}
}
func (r *Registry) Register(p Plugin) error {
if err := p.Init(); err != nil {
return fmt.Errorf("플러그인 %s 초기화 실패: %w", p.Name(), err)
}
r.plugins[p.Name()] = p
return nil
}
func (r *Registry) Execute(name string, data map[string]any) (map[string]any, error) {
p, ok := r.plugins[name]
if !ok { return nil, fmt.Errorf("플러그인 없음: %s", name) }
return p.Execute(data)
}
// 플러그인 구현
type LogPlugin struct{}
func (p *LogPlugin) Name() string { return "logger" }
func (p *LogPlugin) Init() error { fmt.Println("로거 초기화"); return nil }
func (p *LogPlugin) Execute(data map[string]any) (map[string]any, error) {
fmt.Printf("[LOG] %v\n", data)
return data, nil
}
type TransformPlugin struct{}
func (p *TransformPlugin) Name() string { return "transform" }
func (p *TransformPlugin) Init() error { return nil }
func (p *TransformPlugin) Execute(data map[string]any) (map[string]any, error) {
data["transformed"] = true
return data, nil
}
func main() {
reg := NewRegistry()
reg.Register(&LogPlugin{})
reg.Register(&TransformPlugin{})
result, _ := reg.Execute("transform", map[string]any{"key": "value"})
reg.Execute("logger", result)
}학습 팁
플러그인 인터페이스를 작게 유지하면 새 플러그인을 쉽게 추가할 수 있습니다. Init()과 Execute()만으로 충분합니다.
주의할 점
플러그인 간 의존성을 관리하지 않으면 초기화 순서 문제가 발생합니다. 의존성 그래프를 구축하여 순서를 보장하세요.
자주 묻는 질문
플러그인 시스템란 무엇인가요?
인터페이스 기반 플러그인 시스템으로 확장 가능한 아키텍처를 구현합니다.
플러그인 시스템 학습 시 주의할 점은 무엇인가요?
플러그인 간 의존성을 관리하지 않으면 초기화 순서 문제가 발생합니다. 의존성 그래프를 구축하여 순서를 보장하세요.
Continue Learning
Go 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.