PHpullh
학습 라이브러리/Python/플러그인 아키텍처

PYTHON · 디자인패턴

플러그인 아키텍처

플러그인 시스템으로 애플리케이션을 확장 가능하게 설계합니다.

디자인패턴고급plugin플러그인확장아키텍처

핵심 설명

플러그인 시스템으로 애플리케이션을 확장 가능하게 설계합니다.

Python code

from abc import ABC, abstractmethod
from typing import Type

class Plugin(ABC):
    @property
    @abstractmethod
    def name(self) -> str: ...

    @abstractmethod
    def execute(self, data: dict) -> dict: ...

class PluginManager:
    def __init__(self):
        self._plugins: dict[str, Plugin] = {}

    def register(self, plugin: Plugin):
        self._plugins[plugin.name] = plugin
        print(f"  플러그인 등록: {plugin.name}")

    def unregister(self, name: str):
        self._plugins.pop(name, None)

    def execute_all(self, data: dict) -> dict:
        result = data.copy()
        for name, plugin in self._plugins.items():
            result = plugin.execute(result)
        return result

    def list_plugins(self) -> list[str]:
        return list(self._plugins.keys())

# 플러그인 구현
class UpperCasePlugin(Plugin):
    @property
    def name(self): return "uppercase"
    def execute(self, data):
        if "text" in data:
            data["text"] = data["text"].upper()
        return data

class TimestampPlugin(Plugin):
    @property
    def name(self): return "timestamp"
    def execute(self, data):
        from datetime import datetime
        data["processed_at"] = datetime.now().isoformat()
        return data

class ValidatorPlugin(Plugin):
    @property
    def name(self): return "validator"
    def execute(self, data):
        data["is_valid"] = bool(data.get("text"))
        return data

# 사용
manager = PluginManager()
manager.register(ValidatorPlugin())
manager.register(UpperCasePlugin())
manager.register(TimestampPlugin())

result = manager.execute_all({"text": "hello world"})
print(f"결과: {result}")
print(f"플러그인 목록: {manager.list_plugins()}")

학습 팁

importlibentry_points를 활용하면 외부 패키지에서 플러그인을 자동 발견할 수 있습니다.

주의할 점

플러그인 실행 순서에 의존하면 취약합니다. 명시적 우선순위 시스템을 구현하세요.

자주 묻는 질문

플러그인 아키텍처란 무엇인가요?

플러그인 시스템으로 애플리케이션을 확장 가능하게 설계합니다.

플러그인 아키텍처 학습 시 주의할 점은 무엇인가요?

플러그인 실행 순서에 의존하면 취약합니다. 명시적 우선순위 시스템을 구현하세요.