Skip to content
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

Merged
merged 3 commits into from
May 2, 2021
Merged

Conversation

cloudeyes
Copy link
Contributor

No description provided.

pubsub: Optional[AbstractPubsubClient] = None # Dependency Injection

@property
def msa(self) -> Optional[AbstractFastMSA]:
Copy link
Contributor Author

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,
Copy link
Contributor Author

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]):
Copy link
Contributor Author

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):
Copy link
Contributor Author

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,
Copy link
Contributor Author

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(
Copy link
Contributor Author

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):
Copy link
Contributor Author

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:
Copy link
Contributor Author

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
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

변경된 AbstractMessageHandler 프로토콜을 준수하도록 클래스 속성을 직접 할당하는 대신 프로퍼티(getter/setter) 인터페이스로 사용하도록 바꿨습니다.

@cloudeyes cloudeyes linked an issue May 1, 2021 that may be closed by this pull request
7 tasks
@cloudeyes cloudeyes added architecture enhancement New feature or request labels May 1, 2021
@cloudeyes cloudeyes self-assigned this May 1, 2021
uow: SqlAlchemyUnitOfWork,
):
with uow:
uow.session.execute(
Copy link

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패턴으로 하는 방법도 있을거같습니다.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@lyonmoon 저도 좀 의아한 부분인데 책에 잘 설명되어 있습니다. 요는 ORM 으로 하는건 성능상 좋지 않고 이해하기 어려운 ORM 코드를 작성하는것보다 SQL 코드가 명확하다는 건데요, 오늘 스터디 모임때 다시 설명드릴게요.

Copy link

@lyonmoon lyonmoon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

엄청난 내용들이 추가되고있네요, 실제 구현된코드를보니 공부가 정말 많이 됩니다.
교재완료후 종합적으로 계속 보면서 익숙해져야할거같아요

@cloudeyes cloudeyes merged commit cbd05f8 into main May 2, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
architecture enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

이벤트 드리븐 아키텍처로 프레임웍 개선
2 participants