커맨드와 쿼리를 분리하도록 코드를 수정해보았다.
그렇게 적용한 이유는 유지보수의 용이함을 위해 성격이 다른 두 기능 각각이 명확한 하나의 역할을 하도록 하기 위함이다.
또한 추후에 CQRS를 적용함에 있어서 초석을 다지기 위해 분리하는 과정을 거쳤다.
기존의 코드는 다음과 같이 생성하거나, 수정하였을 때 엔티티 전체를 반환하도록 했다.
위의 코드를 아래와 같이 상태만 반환하도록 하였다.
따라서 조회는 조회만, 명령은 명령만 수행하도록 코드를 작성하였다.
따라서 각각의 역할이 모호하지 않고 분명해지는 효과를 볼 수 있고, 이로 인해 서로간의 결합도를 보다 느슨하게 했다고 말할 수 있다.
JpaRepository의 Save()는 엔티티를 반환하는데...그럼 CQS를 위배한 것일까??
CQS에서 쿼리가 해야하는 일은 정보를 조회하고, 그 정보를 수정하지 않도록 하는것이 목적이다. JPA의 Save()는 엔티티를 반환하긴 하지만, 프로그래머가 Save()를 조회의 목적으로 사용하지 않는 한, CQS를 위배하지 않는다고 생각한다.
또한 CQS가 아무리 중요하다고 하더라도, 이점이 매우 도드라지는 경우엔 트레이드오프를 생각해서 과감히 포기해야한다고 생각한다. (ex 스택의 pop)