CQS와 CQRS

오목조목·2023년 10월 13일
post-thumbnail

CQS

insert는 id 반환, update는 void(혹은 id), 조회는 객체를 반환하되 내부 변경이 없도록 설계하는 것


CQRS

Command Service(ex, join, update, delete) 와 Query Service(ex, find)를 분리하는 것


사용하는 이유

  • 내부에서 변경(Side Effect)가 일어나는 메서드인지, 아니면 내부에서 변경이 전혀 일어나지 않는 메서드인지 명확히 분리하는것

  • 간단히 말해, 단순 조회를 하는것은 내부에서 변경이 일어나지 않지만, 정보의 업데이트나 삭제, 추가와 같은 경우에는 내부에서 변경이 일어나는 경우인데, 이를 분리하고자 하는 것

  • 이점 : 데이터의 변경과 관련된 이슈가 발생했을 경우, 변경이 일어나는 메서드들만 살펴보면 된다. (유지보수성 향상)


Command & Query란?

  • Command란 객체를 바꾸는 쓰기 (변경 메서드)
  • Query란 객체의 정보만을 반환하는 함수 (정보 조회 등)

이러한 점들을 고려하여서, 변경 메서드의 반환 값은
void나 id(PK) 값으로 변경에만 집중할 수 있도록 하고,
조회의 경우 객체의 정보를 반환하여 각 역할에 집중할 수 있도록 하는게 포인트라고 할 수 있을 것 같다.


요약 : 항상 하던대로 Service 클래스를 하나만 만들고 그 안에 모든 CRUD 를 설계하려고 하지 말고, CommandService와 QueryService로 분류하는 것을 고려해 보는것은 어떨까? (단순히 디자인 패턴이기 때문에,
무조건 필요하다는 것이 아닌, 왜 이렇게 하는지 이해하는것이 중요할 듯)


참고 링크 - CoRaveler님 벨로그

profile
자그마한 것이 모여서 야무진 느낌을 주는 모양

0개의 댓글