CQRS??

윤태호·2023년 3월 2일
0

TechTalk

목록 보기
3/8

1.CORS는 들어봤는데...

필자도 CORS는 들어봤는데, CQRS는 머고?
CQRS는 Command and Query Responsibility Segregation(명령과 조회의 책임 분리)의 줄임말로 우리가 알던 CRUD에서 R을 분리해냈다고 생각하시면 편합니다.

2.어떻게 구현하나요?

- 1. Model의 분리

  • 동일한 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.
}

- 2. DB의 분리

  • Database 까지 분리를 시키는 것이 두번째 사례입니다. 예를 들면, MYSQL 의 Master, Slave 구조가 있습니다.
  • 위에 CommandController 는 Master db 를 붙도록 설정해 CUD 를 행하고, QueryController 는 Slave DB 를 붙도록 설정해 조회를 제공합니다.
  • 단, 이 패턴은 두 DB 간의 동기화 처리를 위한 문제점을 해결해야만 합니다.

-3. System의 분리

DB의 분리를 넘어 System까지 완전히 분리를 하는 것입니다.

  • 드디어 Redis와 NoSql들이 빛을 보는 순간이 옵니다. Webtoon이나 단순 게시물을 조회하는 서비스들이 주를 이루는 웹,앱 서비스는 조회가 주를 이룰 것입니다. 이 때 우리는 CQRS를 적용하고 기존의 RDBS에서의 조회보다 훨씬 빠르다는 이점을 가져갈 수 있습니다.
  • 추가적으로 완전히 분리되었기에 장애 발생시 격리가 가능하므로 추가적인 이점이 있습니다.
  • 하지만 개발자들은 데이터를 조회하기 위해 Key,Value와 추가적으로 CUD를 위한 Entity, DTO 등 코드가 복잡해질 수도 있습니다.

CQRS를 정리하면서

  • 사실 Mysql과 MariaDB만 사용하면서 NoSQL과 Redis가 도대체 언제 왜 사용하는지 이해를 못하고 있었지만, CQRS를 정리하면서 이해가 갔습니다.
    대형 엔터프라이즈의 서비스들은 다양한 부분까지 고려해야한다는 것을 알았습니다.
profile
성장하는것을 제일 즐깁니다.

0개의 댓글