What is an issue? Please explain with some screenshots.
기존에는 CQRS 패턴을 사용하여 다음과 같은 이점을 보고 있습니다.
Controller 에서 하나의 CommandBus 를 호출하고, 각 Command 로 하여금 Handler 를 찾아가게 해줍니다. 이로써, 각 Controller 의 기능에 1:1 매칭되는 Handler 를 따로 구현할 수 있습니다.
이렇게 하면 특정 기능에 문제가 생기면 Controller > Handler 로 바로 문제를 1:1로 해결할 수 있습니다. 즉, 디렉토리를 찾기에 편합니다.
반면, 이를 위해 다음과 같은 파일 생성과 연결을 요구합니다.
Command, Handler, Service, Controller
이와 같은 깊어진 구조로 인해 파일 찾기는 쉬우나, 아키텍처 이해 난도가 높은 편입니다.
✨ Expected Results
What result do you expect?
Command 와 Handler 대신, 어차피 검색해서 들어갈 수 있는 기능들이므로,
Controller > MainService 를 통해 1:1 매칭은 그대로 두되, 이 각 기능들이 우리가 구현한 CommandService 와 QueryService 를 적절히 로직에 맞게 호출하도록 Depth를 하나 더 두면 어떨까요?
그렇다면 구현 순서는 다음과 같이 될 것입니다.
특정 Create, Update, Delete와 관련된 기능은 CommandService 에서 구현되는데, 이는 Repository 코드와 연결하여 기능을 수행합니다.
특정 Read 기능은 QueryService 에서 구현되는데, 이는 위처럼 Repository 코드와 연결하여 기능을 수행합니다.
만약, 특정 Create 도메인 기능을 구현하면서, 존재에 대한 여부도 검사하는 MainService 의 기능을 구현한다면, 이 기능은 QueryService.get 을 이용하게 될 것이고, 이 검사 여부에 따라 CommandService.create 을 이용하게 될 것입니다.
결국, QueryService 와 CommandService 는 Repository 를 로직으로 한 번 더 감싼 형태의 Provider 가 됩니다.
또한, 그 두 개의 Service 들은, Entity 를 Domain Model 로 바꾸는 책임을 가지고 있습니다. 즉, Repository 가 반환한 Entity 에 대해서, 상황에 따라 적절한 Model 로의 Mapping을 해주는 것입니다.
📸 What is this issue?
기존에는 CQRS 패턴을 사용하여 다음과 같은 이점을 보고 있습니다.
Controller
에서 하나의CommandBus
를 호출하고, 각Command
로 하여금Handler
를 찾아가게 해줍니다. 이로써, 각Controller
의 기능에 1:1 매칭되는Handler
를 따로 구현할 수 있습니다.이렇게 하면 특정 기능에 문제가 생기면
Controller
>Handler
로 바로 문제를 1:1로 해결할 수 있습니다. 즉, 디렉토리를 찾기에 편합니다.반면, 이를 위해 다음과 같은 파일 생성과 연결을 요구합니다.
Command
,Handler
,Service
,Controller
이와 같은 깊어진 구조로 인해 파일 찾기는 쉬우나, 아키텍처 이해 난도가 높은 편입니다.
✨ Expected Results
Command
와Handler
대신, 어차피 검색해서 들어갈 수 있는 기능들이므로,Controller
>MainService
를 통해 1:1 매칭은 그대로 두되, 이 각 기능들이 우리가 구현한CommandService
와QueryService
를 적절히 로직에 맞게 호출하도록 Depth를 하나 더 두면 어떨까요?그렇다면 구현 순서는 다음과 같이 될 것입니다.
특정 Create, Update, Delete와 관련된 기능은
CommandService
에서 구현되는데, 이는Repository
코드와 연결하여 기능을 수행합니다.특정 Read 기능은
QueryService
에서 구현되는데, 이는 위처럼Repository
코드와 연결하여 기능을 수행합니다.만약, 특정 Create 도메인 기능을 구현하면서, 존재에 대한 여부도 검사하는
MainService
의 기능을 구현한다면, 이 기능은QueryService.get
을 이용하게 될 것이고, 이 검사 여부에 따라CommandService.create
을 이용하게 될 것입니다.결국,
QueryService
와CommandService
는Repository
를 로직으로 한 번 더 감싼 형태의 Provider 가 됩니다.또한, 그 두 개의
Service
들은, Entity 를 Domain Model 로 바꾸는 책임을 가지고 있습니다. 즉,Repository
가 반환한 Entity 에 대해서, 상황에 따라 적절한 Model 로의 Mapping을 해주는 것입니다.