CQS 에 대해 정리해보려고 한다.
CQS는 먼저 디자인 패턴 중 하나이다.
디자인 패턴이라는 것이 말로보면 어려운데, 쉽게 얘기하자면 소프트웨어를 개발하는데, 이러이러한 특정 패턴으로 개발을 하니 복잡성을 줄이고 재사용성, 유지보수성 등등이 좋아지더라.. 하고 발견된 여러 패턴들을 묶어서 디자인 패턴이라고 부른다.
1. 커맨드와 쿼리를 분리하라
글 제목과 같이 커맨드와 쿼리를 분리하라가 이 패턴의 핵심이다.
해당 개념을 처음으로 소개한 Martin Fowler 는 command와 query를 다음과 같이 정의했다.
Queries: Return a result and do not change the observable state of the system (are free of side effects).
쿼리는 시스템의 상태를 변경하지 않고, 그 결과를 반환하는 함수를 말하며,
Commands: Change the state of a system but do not return a value.
커맨드는 시스템의 상태를 변경하지만 그 결과를 반환하지 않는 함수를 말한다.
우리가 흔히 쓰는 자바의 getter / setter 함수가 각각 쿼리, 커맨드에 해당한다.
예시를 보자
(1) 위 코드는 시스템 내부 상태를 변경하는 update 함수이며, 커맨드에 속한다.
(2) 위 코드는 시스템 내부 상태를 변경하면서 Member 객체를 반환한다. CQS가 지켜지지 않은 경우이다.
그렇다면 CQS 를 지켰을 때 얻을 수 있는 효과는 어떤 것이 있을까?
1. 각 메서드의 의미가 더 명확해진다.
2. 디버깅이 편리해 진다.
3. 유지보수가 편리해 진다.
side effect의 정의는 맥락마다 다르지만 여기서 쓰이는 side effect란 내부에 변경이 일어나는지 아닌지를 말한다. 즉 내부에 변경이 일어나지 않으면 side effect가 없는 것 이다.
먼저 쿼리는 조회만을 하기 때문에 side effect를 발생시키지 않는다. 하지만 커맨드는 상태를 변경시키기 때문에 side effect 에 주의해야 한다.
결국 CQS 의 핵심은 메서드 내의 side effect가 명확히 드러나 인지하고 사용할 수 있게 하는 것이 중요하고 그렇기 때문에 둘의 역할을 분리하는 것이 좋다가 핵심인 것 같다.
참고