PHpullh
학습 라이브러리/Go/플러그인 시스템

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()만으로 충분합니다.

주의할 점

플러그인 간 의존성을 관리하지 않으면 초기화 순서 문제가 발생합니다. 의존성 그래프를 구축하여 순서를 보장하세요.

자주 묻는 질문

플러그인 시스템란 무엇인가요?

인터페이스 기반 플러그인 시스템으로 확장 가능한 아키텍처를 구현합니다.

플러그인 시스템 학습 시 주의할 점은 무엇인가요?

플러그인 간 의존성을 관리하지 않으면 초기화 순서 문제가 발생합니다. 의존성 그래프를 구축하여 순서를 보장하세요.