필자도 CORS는 들어봤는데, CQRS는 머고?
CQRS는 Command and Query Responsibility Segregation(명령과 조회의 책임 분리)의 줄임말로 우리가 알던 CRUD에서 R을 분리해냈다고 생각하시면 편합니다.
- 동일한 Database 에 조회 하는 Model 과 CUD 하는 Model 을 분리하는 것입니다.
- REST API 를 예로 들어보면 조회하는 Api 를 담당하는 controller 를 QueryController, CUD 를 담당하는 controller 를 CommandController 라고 만듭니다.
- 각 controller, service 별로 사용하는 DTO 도 다릅니다. 이렇게 작성하게 된다면 조회와 CUD 에 대한 api 를 분리하기에 유지 보수성이 편리해지고 요구사항이 추가되도 변화에 유연해질 수 있다고 할 수 있습니다.
- 또한, spring 을 사용한다면 QueryService 쪽에 @Transactional(ReadOnly) 를 붙여 성능 향상을 쉽게 얻을 수 있습니다.
@RestController @RequiredArgsConstructor public class QueryController { private final QueryService xxx. } @RestController @RequiredArgsConstructor public class CommandController { private final CommandService xxx. }
- Database 까지 분리를 시키는 것이 두번째 사례입니다. 예를 들면, MYSQL 의 Master, Slave 구조가 있습니다.
- 위에 CommandController 는 Master db 를 붙도록 설정해 CUD 를 행하고, QueryController 는 Slave DB 를 붙도록 설정해 조회를 제공합니다.
- 단, 이 패턴은 두 DB 간의 동기화 처리를 위한 문제점을 해결해야만 합니다.
DB의 분리를 넘어 System까지 완전히 분리를 하는 것입니다.
- 드디어 Redis와 NoSql들이 빛을 보는 순간이 옵니다. Webtoon이나 단순 게시물을 조회하는 서비스들이 주를 이루는 웹,앱 서비스는 조회가 주를 이룰 것입니다. 이 때 우리는 CQRS를 적용하고 기존의 RDBS에서의 조회보다 훨씬 빠르다는 이점을 가져갈 수 있습니다.
- 추가적으로 완전히 분리되었기에 장애 발생시 격리가 가능하므로 추가적인 이점이 있습니다.
- 하지만 개발자들은 데이터를 조회하기 위해 Key,Value와 추가적으로 CUD를 위한 Entity, DTO 등 코드가 복잡해질 수도 있습니다.