CQRS란?


CQRS

Command and Query


Responsibility Segregation



KakaoTalk_Photo_2021-11-08-15-03-01



CQRS가 왜 좋다는 걸까?

KakaoTalk_Photo_2021-11-08-15-15-42

위 이미지는 CQRS의 예를 간단하게 나타낸 것이다.

코드가 중복되는 느낌과 개발이 느려지는 느낌인데 CQRS는 뭐가 좋다는걸까?



명령과 조회에 단일 모델을 사용하는 경우


KakaoTalk_Photo_2021-11-08-15-21-39


한 모델에 이것 저것 기능을 추가하니 코드가 뒤섞였다.


Member 클래스는 더 이상 Member 테이블에 대응하는 모델이 아닌

로그인 로직, Order 테이블과도 엮여있다.

가장 나쁜 부분은 기능에 따라 사용하는 필드가 달라진다는 것이다.



단일 모델로 복잡해지는 예시) JPA

KakaoTalk_Photo_2021-11-08-15-26-51


기능에 따라 연관을 로딩하는 방식이 달라져야 한다.

이렇게 단일 모델을 유지하려고 노력하다 보면 다른 부분에서 복잡한 일이 발생한다.

1) 명령과 쿼리는 다루는 데이터가 다르기 때문이다.


2) 명령과 쿼리는 코드 변경 빈도, 사용자에 따라서도 다르다.

변경 빈도가 다른 기능이 한 코드에 있으면 서로 다른 이유로 코드가 바뀌고

이는 곧 책임의 크기가 적당하지 않다는 것이다.

(단일 책임 원칙을 따르지 않는 코드가 생성되는 것)


3) 기능마다 성능 요구가 다르다.



명령과 쿼리를 구분하자.

KakaoTalk_Photo_2021-11-08-15-34-13

명령과 쿼리를 위한 모델을 분리하면 모델의 모호함이 없어진다.

명령 영역의 모델과 쿼리 영역의 모델이 무엇을 표현하고 있는지 명확해져 코드 가독성과 유지보수성이 좋아질 가능성이 높아진다.

예를들어 쿼리는 캐시, 명령은 비동기를 사용하는 방식으로 성능 향상 기법을 다르게 적용하는 것도 가능해진다.



참고