-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
12장 - CQRS(커맨드-쿼리 책임 분리) 구현 #14
Conversation
pubsub: Optional[AbstractPubsubClient] = None # Dependency Injection | ||
|
||
@property | ||
def msa(self) -> Optional[AbstractFastMSA]: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
동적으로 MSA 구성을 셋팅하고, 읽을 수 있는 기능을 추상 인터페이스로 추가했습니다.
@@ -46,9 +48,32 @@ def __init__( | |||
self, | |||
handlers: MessageHandlerMap, | |||
msa: Optional[AbstractFastMSA] = None, | |||
uow: Optional[AbstractUnitOfWork] = None, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
MessageBus
생성자에서 의존성들을 Explicit 하게 주입할 수 있도록 개선했습니다.
return self._msa | ||
|
||
@msa.setter | ||
def msa(self, new_msa: Optional[AbstractFastMSA]): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
FastMSA
구성 설정이 변경된 경우, FastMSA
설정에서 참조하는 의존성인 uow
, broker
, pubsub
등의 의존성을 메세지 버스에도 업데이트 하도록 개선했습니다.
@@ -107,14 +108,20 @@ def rollback(self) -> None: | |||
pass | |||
|
|||
|
|||
class FakePubsubCilent(AbstractPubsubClient): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
단위 테스트 중에 메세지 핸들러가 외부 메세지 브로커로 메세지를 발송하는 경우를 가짜로 처리하기 위한 Fake 클래스입니다.
@@ -70,7 +72,50 @@ def change_batch_quantity(e: commands.ChangeBatchQuantity, uow: AbstractUnitOfWo | |||
@on_event(events.Allocated) | |||
def publish_allocated_event( | |||
event: events.Allocated, | |||
broker: AbstractMessageBroker, | |||
pubsub: AbstractPubsubClient, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
broker
의존성이 참조하는 AbstractPubsubClient
를 사용하는 대신 pubsub
로 명시적인 의존성이 주입 가능하도록 했습니다. 이를 통해 FakePubsubClient
등으로 의존성을 교체해서 단위 테스를 쉽게할 수 있습니다.
|
||
|
||
@on_event(events.Allocated) | ||
def add_allocation_to_read_model( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이벤트 처리에 의해 자동으로 View를 동기화 하는 코드입니다. 교재를 읽어보세요. (자세한 설명은 생략합니다. 😅 )
from fastmsa.uow import SqlAlchemyUnitOfWork | ||
|
||
|
||
def get_allocations_by(orderid: str, uow: SqlAlchemyUnitOfWork): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
커맨드에서 쿼리를 분리한 서비스 함수 예제입니다.
Denormalization 된 allocation_view
를 이용해 결과를 조회 및 리턴하고 있습니다.
@@ -182,49 +190,14 @@ class AbstractFastMSA(abc.ABC): | |||
def api(self) -> AbstractAPI: | |||
raise NotImplemented | |||
|
|||
def get_api_host(self) -> str: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
설계 초기에 추상화 없이 작성했던 코드들이 불필요하게 남아있어서 제거했습니다.
@@ -129,14 +129,22 @@ def __init__( | |||
|
|||
self._broker = messagebroker | |||
self.conn_info = conn_info | |||
self.msa = msa or self.msa | |||
self._msa = msa |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
변경된 AbstractMessageHandler
프로토콜을 준수하도록 클래스 속성을 직접 할당하는 대신 프로퍼티(getter/setter) 인터페이스로 사용하도록 바꿨습니다.
uow: SqlAlchemyUnitOfWork, | ||
): | ||
with uow: | ||
uow.session.execute( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
allocations_view를 통해 작업을 db에 insert하고, 이것을 메시지 받는곳에서 조회하는듯한데,
이런경우 이벤트마다 테이블을 따록 가져야하는걸까요?
이벤트에 직접 데이터를 싫어서 보내는걸로 생각했는데, 테이블을 만들어 처리하신부분이 새로웠습니다.
Repository패턴으로 하는 방법도 있을거같습니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@lyonmoon 저도 좀 의아한 부분인데 책에 잘 설명되어 있습니다. 요는 ORM 으로 하는건 성능상 좋지 않고 이해하기 어려운 ORM 코드를 작성하는것보다 SQL 코드가 명확하다는 건데요, 오늘 스터디 모임때 다시 설명드릴게요.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
엄청난 내용들이 추가되고있네요, 실제 구현된코드를보니 공부가 정말 많이 됩니다.
교재완료후 종합적으로 계속 보면서 익숙해져야할거같아요
No description provided.