인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

김민지님의 프로필 이미지
김민지

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

회원 수정 API

CQS

작성

·

994

0

관련 질문에 대한 답변을 읽어봤는데도 이해가 가지 않아서 질문드립니다.

커맨드와 쿼리를 분리해야한다는 CQS를 설명하신 말이었어요.

 

내부변경이 일어나는것은 커맨드, 명령어라고 부른다

커맨드는 결과값을 그대로 반환하면안된다

내부변경이 일어나지않는 것은 쿼리라고 부른다.

쿼리는 결과값을 반환한다

-> 1. 커맨드에서 결과값을 반환하면 안되는 이유가 뭘까요?

  1. update 메서드 안에서도 결국은 update하는것(커맨드)과 findOne(쿼리)하는 코드가 모두 들어가있는거잖아요? 근데 이게 왜 cqs를 지킨 사례인거죠?

@Transactinal

public vodi update(Long id, String name){

memberService.update(id,name);

Member member = memberService.findOne(id);

rreturn ~~~;

}

답변 1

1

안녕하세요. 김민지님, 공식 서포터즈 David입니다.

  1. Command-Query Separation은 상태 변경이 발생하지 않는 조회와 상태 변경이 발생하는 수정(command 대신 modifier라고 말하기도 합니다 [1])을 분리한 것이기 때문입니다. 수정의 책임은 상태를 변경하는 것에 있지 데이터를 반환하는데 있지 않습니다. 따라서, 수정에 해당하는 Command는 데이터를 반환하지 않습니다.

    Because the term 'command' is widely used in other contexts I prefer to refer to them as 'modifiers', you also see the term 'mutators'.

  2. update 메서드 내에서 어떤 메서드가 사용되었는지는 CQS의 기준이 아닙니다. update가 command에 해당하는 이유는 1. 결과를 반환하지 않았고 2.시스템(엔티티)의 상태를 변경했기 때문입니다.

     

조금 더 자세한 CQS 설명은 아래 글을 참고해주세요.

[1] https://martinfowler.com/bliki/CommandQuerySeparation.html

[2] https://hardlearner.tistory.com/383

감사합니다.

김민지님의 프로필 이미지
김민지
질문자

CQS 패턴을 사용하면 “읽기”와 “쓰기”를 분리할 수 있다는 장점이 있습니다. 즉, “읽기”와 “쓰기”가 동시에 일어나지 않기 때문에 성능을 최적화 하는데 도움을 줄 수 있습니다.

가 cqs패턴의 장점이라는데.. update 내에서 어떤 메서드가 사용되었는지가 왜 알 필요가 없는걸까요?
그리고 무언가를 update하려면 읽는게 필연적으로 필요한데, cqs의 장점이 무엇인지 궁금합니다.. 저게 장점이 아닌거죠?

CQS 패턴을 사용하면 “읽기”와 “쓰기”를 분리할 수 있다는 장점이 있습니다. 즉, “읽기”와 “쓰기”가 동시에 일어나지 않기 때문에 성능을 최적화 하는데 도움을 줄 수 있습니다.

 

해당 인용의 출처가 어딘지 알려주시면 답변 드리는 데 도움이 될 것 같습니다.

장점은 아래 글 답변도 참고해주세요.

https://www.inflearn.com/questions/27795

해당 글에서 제시한 코드 기준에서는 저렇게 말할 수 있을 것 같습니다.

command의 기준은 1. 결과를 반환하지 않았고 2.시스템(엔티티)의 상태를 변경했는가 입니다. 무언가를 조회하지 않아야 한다는 조건은 없음을 참고해주세요.

아울러, 글 내용과 관련된 의문이 있으시다면 해당 글쓴이에게 물어보시는 게 가장 정확하고 빠를 것 같습니다.

김민지님의 프로필 이미지
김민지

작성한 질문수

질문하기