CQS 원칙 (Command QUery Separation)
강의 듣던 와중 JPA 실전 편에서 회원 정보 수정을 위해 MemberService에 update 메서드를 추가하는데 갓영한님이
"update 메서드는 엔티티를 바꾸겠다는 변경성 메서드인데,
이 메서드의 return type 을 Member로 한다면 update로 조회를 하는 꼴이 돼요.
command와 query 가 같이 있는 꼴이 되죠.
그래서 저는 update 메서드의 return type을 void로 하거나 id 값 정도로 해줘요."
이렇게 말씀하셨다.
무슨 소리인가 싶어서 질의응답을 찾아보니 여러 사람들이 의문을 품고 질문을 했는데
즉 CQS는 기능 구분을 통해 불필요한 side effect를 줄이는 것이다.
여기서 command(명령)는 결과를 반환하지 않고, 시스템의 상태를 변화시키는 것이고 Query(조회)는 결과값을 반환하고 시스템의 상태를 변화시키지 않는 것이다.
side effect는 함수의 외부 상태를 변경하거나, 함수로 전달된 인자의 상태를 변경하는 것을 뜻한다. 다시 말해 함수 내부의 행위로 인해서 함수 외부가 영향 받을 때 side effect가 존재한다고 말한다.
query는 조회만을 하기 때문에 side effect가 발생하지 않지만 command는 상태를 변경 시키기 떄문에 side effect에 주의를 해야한다. 고로 둘의 역할을 분리하는 것이 좋은(안전한) 방법이다.
그렇다면 CQRS는 무엇인가 찾아보면 CQS의 원리에 기원하기는 하지만 CQS는 명령과 조회를 연산 수준에서 분리하는 반면에 CQRS는 개체(object)나 시스템(혹은 하위 시스템) 수준에서 분리를 한다.
즉, CQS 원리와 같지만 객체를 2가지로 분리한다.
1. command끼리 모아둔 객체
2. query끼리 모아둔 객체
참초 : https://www.msaschool.io/operation/integration/integration-six/