hubts / moderate-nestjs

REST API Backend using NestJS, Prisma, PostgreSQL, and so on.
MIT License
1 stars 0 forks source link

CQRS 패턴을 위한 파일 생성 수를 줄이기 #9

Open hubts opened 1 month ago

hubts commented 1 month ago

📸 What is this issue?

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?

CommandHandler 대신, 어차피 검색해서 들어갈 수 있는 기능들이므로,

Controller > MainService 를 통해 1:1 매칭은 그대로 두되, 이 각 기능들이 우리가 구현한 CommandServiceQueryService 를 적절히 로직에 맞게 호출하도록 Depth를 하나 더 두면 어떨까요?

그렇다면 구현 순서는 다음과 같이 될 것입니다.

특정 Create, Update, Delete와 관련된 기능은 CommandService 에서 구현되는데, 이는 Repository 코드와 연결하여 기능을 수행합니다.

특정 Read 기능은 QueryService 에서 구현되는데, 이는 위처럼 Repository 코드와 연결하여 기능을 수행합니다.

만약, 특정 Create 도메인 기능을 구현하면서, 존재에 대한 여부도 검사하는 MainService 의 기능을 구현한다면, 이 기능은 QueryService.get 을 이용하게 될 것이고, 이 검사 여부에 따라 CommandService.create 을 이용하게 될 것입니다.

결국, QueryServiceCommandServiceRepository 를 로직으로 한 번 더 감싼 형태의 Provider 가 됩니다.

또한, 그 두 개의 Service 들은, Entity 를 Domain Model 로 바꾸는 책임을 가지고 있습니다. 즉, Repository 가 반환한 Entity 에 대해서, 상황에 따라 적절한 Model 로의 Mapping을 해주는 것입니다.