insert는 id 반환, update는 void(혹은 id), 조회는 객체를 반환하되 내부 변경이 없도록 설계하는 것
Command Service(ex, join, update, delete) 와 Query Service(ex, find)를 분리하는 것
내부에서 변경(Side Effect)가 일어나는 메서드인지, 아니면 내부에서 변경이 전혀 일어나지 않는 메서드인지 명확히 분리하는것
간단히 말해, 단순 조회를 하는것은 내부에서 변경이 일어나지 않지만, 정보의 업데이트나 삭제, 추가와 같은 경우에는 내부에서 변경이 일어나는 경우인데, 이를 분리하고자 하는 것
이점 : 데이터의 변경과 관련된 이슈가 발생했을 경우, 변경이 일어나는 메서드들만 살펴보면 된다. (유지보수성 향상)
Command & Query란?
이러한 점들을 고려하여서, 변경 메서드의 반환 값은
void나 id(PK) 값으로 변경에만 집중할 수 있도록 하고,
조회의 경우 객체의 정보를 반환하여 각 역할에 집중할 수 있도록 하는게 포인트라고 할 수 있을 것 같다.
요약 : 항상 하던대로 Service 클래스를 하나만 만들고 그 안에 모든 CRUD 를 설계하려고 하지 말고, CommandService와 QueryService로 분류하는 것을 고려해 보는것은 어떨까? (단순히 디자인 패턴이기 때문에,
무조건 필요하다는 것이 아닌, 왜 이렇게 하는지 이해하는것이 중요할 듯)