파이썬 애플리케이션을 개발할 때, 특정 기능을 인터페이스화하고 이를 동적으로 로드할 수 있는 플러그인 아키텍처는 확장성 면에서 큰 이점을 제공합니다. Python의 entry_points 설정을 사용하면 설치된 패키지들로부터 특정 그룹에 속한 플러그인을 검색하고 실행할 수 있습니다. 본 문서에서는 pbr 라이브러리와 setuptools를 활용하여 이러한 시스템을 구축하는 방법을 설명합니다.
1. 프로젝트 구조 설계
먼저 플러그인 기능을 수행할 모듈과 설정 파일을 포함하는 디렉토리 구조를 다음과 같이 구성합니다.
project_root/
├── demo_app/
│ ├── __init__.py
│ └── extensions/
│ ├── __init__.py
│ ├── storage.py
│ └── welcome.py
├── setup.cfg
└── setup.py
2. 모듈 구현
각 확장 모듈 내에 실행될 로직을 정의합니다.
demo_app/extensions/storage.py
def run():
print("스토리지 엔진 모듈이 실행되었습니다.")
demo_app/extensions/welcome.py
def run():
print("환영 메시지 모듈이 실행되었습니다.")
3. 설정 파일 작성
pbr을 사용하면 setup.cfg 파일에 메타데이터와 진입점(Entry Points) 정보를 명시적으로 관리할 수 있습니다.
setup.cfg
[metadata]
name = demo_app
version = 1.0.0
summary = 확장 가능한 플러그인 데모 시스템
[files]
packages =
demo_app
[entry_points]
# 'demo.plugin.v1'이라는 그룹 이름으로 플러그인 등록
demo.plugin.v1 =
storage_handler = demo_app.extensions.storage:run
welcome_handler = demo_app.extensions.welcome:run
[pbr]
warnerrors = True
setup.py
import setuptools
setuptools.setup(
setup_requires=['pbr'],
pbr=True,
)
4. 플러그인 호출 방법
등록된 플러그인을 검색하고 실행하는 방법은 크게 세 가지가 있습니다.
방법 1: stevedore 라이브러리 사용
OpenStack 프로젝트에서 주로 사용하는 stevedore 라이브러리는 플러그인 관리를 위한 고수준 API를 제공합니다.
from stevedore import extension
def execute_with_stevedore():
# 'demo.plugin.v1' 그룹의 플러그인을 로드
mgr = extension.ExtensionManager(
namespace='demo.plugin.v1',
invoke_on_load=False,
)
print("발견된 플러그인:", mgr.names())
# 각 플러그인의 entry_point를 호출
for ext in mgr:
func = ext.plugin
func()
방법 2: pkg_resources를 활용한 동적 로딩
별도의 라이브러리 설치 없이 파이썬 표준 도구인 setuptools 내부의 pkg_resources를 활용하는 방식입니다.
import pkg_resources
def execute_with_pkg_resources():
group_name = 'demo.plugin.v1'
for entry_point in pkg_resources.iter_entry_points(group=group_name):
# 모듈 로드
plugin_func = entry_point.load()
print(f"실행 중인 플러그인: {entry_point.name}")
plugin_func()
방법 3: 특정 진입점 직접 로드
그룹 내의 특정 이름으로 정의된 함수를 직접 호출할 때 유용합니다.
from pkg_resources import load_entry_point
def direct_call():
# (패키지명, 그룹명, 식별자) 순서로 인자 전달
handler = load_entry_point('demo_app', 'demo.plugin.v1', 'storage_handler')
handler()
플러그인 시스템이 정상적으로 작동하려면 해당 패키지가 개발 모드(pip install -e .) 또는 일반 모드로 현재 환경에 설치되어 있어야 합니다. pbr은 setup.cfg에 정의된 내용을 기반으로 배포 패키지를 생성하고 Entry Points 정보를 올바르게 등록해주는 역할을 수행합니다.