CQS - 명령 조회 분리

박재빈·2024년 12월 11일
1

1. CQS란 무엇인가?

CQS는 Command(명령)과 Query(질의)의 역할을 구분하는 설계 원칙입니다.

  • Command(명령) : 변경하는 작업을 수행하며 값을 반환하지 않습니다.
  • Query(질의) : 조회하는 작업을 수행하며 값을 반환합니다.

2. CQS를 적용해보자

명령과 질의가 혼합된 코드

class Account {
	private int balance;
    
    public int withdraw(int amount) {
        if (amount > balance) {
            throw new IllegalArgumentException("잔액 부족");
        }
        balance -= amount; // Command
        return balance; // Query
    }
}

Account 클래스의 withdraw 메서드는 명령과 질의가 혼합되어 있습니다.

  • Command(명령) : balance값을 감소시켜 상태를 변경합니다.
  • Query(질의) : 변경된 balance 값을 반환합니다.

문제점

  • 메서드의 역할이 불분명하여 코드 가독성이 떨어집니다.
  • 잔액 감소잔액 반환 두 가지를 동시에 검증해야 합니다. 테스트 범위가 넓어지고 복잡해집니다.

CQS원칙을 적용한 코드

public class Account {
	private int balance;
    
    // command
    public void withdraw(int amount) {
    	if (amount > balance) {
        	throw new IllegalArgumentException("잔액 부족");
        }
        balance -= amount;
    }
    
    // query
    public int getBalance() {
    	return balacne;
    }
}

코드 동작 설명

  1. withdraw 메서드 (command)
    • 잔액 감소라는 작업만 수행합니다.
    • 상태를 변경하지만, 어떠한 값도 반환하지 않습니다.
  2. getBalance 메서드 (query)
    • 잔액 조회 작업만 수행합니다.
    • 객체의 상태를 변경하지 않습니다.

적용 후 장점

  1. withdraw는 상태를 변경하고, getBalance는 상태를 조회합니다. 각 메서드의 역할이 분명하므로 코드의 가독성이 향상됩니다.
  2. getBalance를 호출한다고 해서 객체의 상태가 변경될 가능성이 없습니다. 따라서 호출자는 안전하게 상태를 조회할 수 있습니다.
  3. withdrawgetBalance를 개별적으로 테스트할 수 있습니다.

0개의 댓글