본문 바로가기

CS 잡지식

CQS(Command Query Separation) Policy

Command :  상태(필드, 객체 등)를 [수정]하는 메서드

Query상태(필드,객체 등)를 반환하는 메서드

-> 즉 [수정] 메서드를 정의를 할 때를 Command라고 하며,

[수정] 메서드가 아니더라도, 어떠한 메서드에 있어서 무언가를 반환하는 메서드를 Query라고 한다. 

 

- Command와 Query는 철저하게 분리시켜서 설계를 하자 -

public void update(Long id, String name) { // [회원 수정] Rest API 

    Member findMember = memberRepository.findOne(id); 
    
    findMember.setName(name);
	
    // return member; 
}

 

위와 같은 Command가 있다고 하자. 

근데 반환형을 void로 말고, Query 형식으로 Member형을 반환하도록 해도 되지 않을까???

-> Command는 [수정] 메서드라고 하였다. 

만약 Memer 객체를 반환한다고 해보자. 

그러면, update() 메서드는, 

1] [수정]을 실행하는 기능

2] id를 통해 상태를 [조회]하는 기능

위 2가지 기능이 같이 구현된 메서드가 되버린다.( Command이면서 Query인 메서드 )

[수정] 메서드이면, 객체나 필드를 변경시키고 끝나야 한다.(이건 개발자마다 생각이 다를 수가 있음)

[조회] 메서드이면, 객체나 필드를 DB로부터 객체 등을 읽어 들여 반환을 하고 끝내야 한다(이건 개발자마다 생각이 다를

수가 있음)

- 고로, [수정] 메서드, 즉 Command는 반환형이 없어야 한다.

( 이 말을, CQS, 즉 Command Query Separation Policy 라고 한다 )