Skip to content

IP-7072: [compose] EventBus 타입 기반 의존성 해결로 전환#537

Merged
novdov merged 5 commits intomainfrom
ip-7072
Mar 10, 2026
Merged

IP-7072: [compose] EventBus 타입 기반 의존성 해결로 전환#537
novdov merged 5 commits intomainfrom
ip-7072

Conversation

@novdov
Copy link
Copy Markdown
Contributor

@novdov novdov commented Mar 9, 2026

목적

EventBus의 핸들러 해결 방식을 이름 기반(str, sync)에서 타입 기반(type, async)으로 전환하여 DI 라이브러리 중립적으로 변경하고, compose.di 패키지를 라이브러리별 서브패키지로 재구성

변경 사항

  • compose.di 패키지 구조 재구성

    • compose/di/{container,provider,wiring}.pycompose/di/dependency_injector/로 이동
    • compose/di/dishka/ 서브패키지 신규 생성
    • compose.di.__init__에서 기존 심볼 re-export 유지하여 하위호환 보장
    • compose.dependency, compose.fastapi 내부 import 경로 업데이트
  • DI 라이브러리별 EventHandler resolver 팩토리 제공

    • compose.di.dependency_injector.wiring.create_event_handler_resolver 추가
    • compose.di.dishka.create_event_handler_resolver 추가
  • EventBus 타입 기반 async resolver 전환

    • dependency_resolver 시그니처: Callable[[str], EventHandler] -> Callable[[type[EventHandler]], Awaitable[EventHandler]]
    • _event_handlers 저장소: dict[str, set[str]] -> dict[str, set[type[EventHandler]]]
    • with_container 클래스메서드 및 create_lazy_resolver 제거
    • EventBus 모듈에서 compose.di import 제거 (DI 라이브러리 비의존)

사용법

EventBus 생성 (dependency-injector)

from compose.di.dependency_injector.wiring import create_event_handler_resolver
from compose.messaging.event_bus import EventBus

resolver = create_event_handler_resolver(container)
event_bus = EventBus(dependency_resolver=resolver)

EventBus 생성 (dishka)

from compose.di.dishka import create_event_handler_resolver
from compose.messaging.event_bus import EventBus

resolver = create_event_handler_resolver(container)
event_bus = EventBus(dependency_resolver=resolver)

핸들러 등록 (변경 없음)

@event_bus.register(SomethingHappened)
class SomethingHappenedHandler:
    async def handle(self, evt: SomethingHappened) -> None:
        ...

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • 이벤트 핸들러 비동기 해석을 위한 새로운 resolver 기능 추가
  • 리팩토링

    • 의존성 주입 모듈 구조 개선 및 재조직
    • 이벤트 핸들러 해석을 문자열 기반에서 타입 기반으로 변경
    • EventBus 비동기 패턴 업데이트
  • 테스트

    • 새로운 이벤트 핸들러 resolver 단위 테스트 추가
    • 기존 테스트 비동기 패턴에 맞춰 업데이트

@novdov novdov self-assigned this Mar 9, 2026
@linear
Copy link
Copy Markdown

linear bot commented Mar 9, 2026

IP-7072 [compose] EventBus 타입 기반 의존성 해결로 전환

배경

  • EventBus의 핸들러 해결 방식이 이름 기반(str, sync)으로 되어 있어 dependency-injector에 강결합
  • compose.di 패키지가 단일 DI 라이브러리 구조로 되어 있어 dishka 등 다른 DI 라이브러리 지원이 어려움

목표

  • EventBus가 DI 라이브러리에 의존하지 않고 타입 기반 async resolver만 받도록 전환
  • compose.di 패키지를 DI 라이브러리별 서브패키지로 재구성하여 dependency-injector와 dishka를 대칭적으로 지원

완료 조건

  • EventBus가 Callable[[type[EventHandler]], Awaitable[EventHandler]] 시그니처의 resolver만 받음
  • compose.di.dependency_injector/, compose.di.dishka/ 서브패키지 구조로 재구성
  • 각 DI 라이브러리별 create_event_handler_resolver 팩토리 제공
  • 기존 compose.dependency 공개 API 하위호환 유지

@pozalabs-workspace pozalabs-workspace bot added the Improvement New feature or request label Mar 9, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 9, 2026

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Free

Run ID: 8d428104-aeed-412e-97bd-855303ee445c

📥 Commits

Reviewing files that changed from the base of the PR and between 9446c86 and d7939ca.

📒 Files selected for processing (19)
  • compose/dependency/__init__.py
  • compose/dependency/container.py
  • compose/dependency/provider.py
  • compose/dependency/wiring.py
  • compose/di/__init__.py
  • compose/di/dependency_injector/__init__.py
  • compose/di/dependency_injector/container.py
  • compose/di/dependency_injector/provider.py
  • compose/di/dependency_injector/wiring.py
  • compose/di/dishka/__init__.py
  • compose/fastapi/routing.py
  • compose/fastapi/wiring.py
  • compose/messaging/event_bus.py
  • tests/di/__init__.py
  • tests/di/unit/__init__.py
  • tests/di/unit/test_dependency_injector_event_handler_resolver.py
  • tests/di/unit/test_dishka_event_handler_resolver.py
  • tests/messaging/unit/test_event_bus_with_container.py
  • tests/messaging/unit/test_message_consumer_asgi_middleware.py

Walkthrough

의존성 주입 모듈 구조가 재구성되었습니다. 기존 문자열 기반의 컨테이너 경로 조회에서 타입 기반의 비동기 해석 방식으로 전환되었으며, 새로운 이벤트 핸들러 리졸버 팩토리가 도입되었습니다. EventBus API가 업데이트되어 with_container 클래스메서드가 제거되었습니다.

Changes

Cohort / File(s) Summary
Import Path Restructuring
compose/dependency/__init__.py, compose/dependency/container.py, compose/dependency/provider.py, compose/dependency/wiring.py
Import 소스가 개별 모듈에서 중앙화된 compose.di.dependency_injector로 변경됨. 공개 API 표면은 유지되며 경로만 업데이트.
DI 모듈 중앙화
compose/di/__init__.py, compose/di/dependency_injector/__init__.py
공개 심볼들이 dependency_injector 패키지로 재집계됨. 새로운 dependency_injector/__init__.py가 12개의 공개 심볼을 집계하며 모듈의 공개 API 표면을 정립함.
Event Handler Resolver 구현
compose/di/dependency_injector/wiring.py, compose/di/dishka/__init__.py
새로운 create_event_handler_resolver 팩토리가 추가되어 타입 기반 비동기 핸들러 해석을 제공함. create_lazy_resolver는 제거되고 create_resolver는 직접 컨테이너 기반 해석으로 업데이트됨.
EventBus 리팩토링
compose/messaging/event_bus.py
문자열 기반 해석에서 타입 기반 비동기 해석으로 전환. with_container 클래스메서드 제거, __init__ 서명 업데이트 (Callable[[str], EventHandler]Callable[[type[EventHandler]], Awaitable[EventHandler]]), 핸들러 저장소가 이름 기반에서 타입 기반으로 변경됨.
FastAPI 통합 업데이트
compose/fastapi/routing.py, compose/fastapi/wiring.py
Provider import 경로가 ..di.wiring에서 ..di.dependency_injector.wiring으로 업데이트됨.
Test Suite 업데이트
tests/di/unit/test_dependency_injector_event_handler_resolver.py, tests/di/unit/test_dishka_event_handler_resolver.py, tests/messaging/unit/test_event_bus_with_container.py, tests/messaging/unit/test_message_consumer_asgi_middleware.py
새로운 resolver 기반 패턴을 검증하는 테스트 추가. 기존 문자열 기반 테스트가 타입 기반 비동기 해석으로 업데이트됨.

Sequence Diagram(s)

sequenceDiagram
    participant Client
    participant EventBus
    participant Resolver
    participant Container

    Client->>EventBus: register(event_cls)<br/>decorator: `@register`(event_cls)
    activate EventBus
    EventBus->>EventBus: store handler_type in<br/>event→handler_types set
    deactivate EventBus

    Client->>EventBus: handle_event(event)
    activate EventBus
    EventBus->>EventBus: get handler_types for event
    loop for each handler_type
        EventBus->>Resolver: resolver(handler_type)
        activate Resolver
        Resolver->>Container: resolve by type
        Container-->>Resolver: handler_instance
        deactivate Resolver
        EventBus->>EventBus: await handler_instance.handle(event)
    end
    deactivate EventBus
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 Types over strings, async flows divine,
Handler resolvers now align,
Dependency paths find their way,
A cleaner DI architecture today! 🎉


Note

🎁 Summarized by CodeRabbit Free

Your organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Pro by visiting https://app.coderabbit.ai/login.

Comment @coderabbitai help to get the list of available commands and usage tips.

@novdov novdov merged commit 83d311e into main Mar 10, 2026
5 checks passed
@novdov novdov deleted the ip-7072 branch March 10, 2026 03:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Improvement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant