육각형 아키텍처는 도메인 중심의 아키텍처에 적합하므로 도메인 엔티티를 만든 후 유스케이스를 구현한다.

송금하기 예제

4-1. 도메인 모델 구현하기

package com.woowa.cleanarchitecture.account.domain;

@AllArgsConstructor
public class Account {
    private AccountId id;
    private Money baselineBalance;  // activityWindow의 첫번째 활동 바로 전의 잔고
    private ActivityWindow activityWindow;  // 최근 모든 입출금 활동

    public boolean withdraw(Money money, AccountId targetAccountId) {
				if (!mayWithdraw(money)) return false;

        Activity withdrawal = new Activity(id, id, targetAccountId, now(), money);
        activityWindow.addActivity(withdrawal);  // 새로운 활동을 활동창에 추가
        return true;
		}

    public boolean deposit(Money money, AccountId sourceAccountId) {
				Activity deposit = new Activity(id, sourceAccountId, id, now(), money);
        activityWindow.addActivity(deposit);
        return true;
		}

    public Money calculateBalance() {
        // 현재 잔고 = 기준 잔고 + 최근 활동의 입출금 내역
        return Money.add(
                baselineBalance,
                activityWindow.calculateBalance(id)
        );
    }
}

4-2. 유스케이스 둘러보기

유스케이스 처리 방법

  1. 인커밍 어댑터로 입력을 받는다.
  2. 입력이 비즈니스 규칙을 충족하면
  3. 도메인 객체의 상태를 바꾼다.
  4. 아웃고잉 포트를 통해 영속성 어댑터로 전달해서 저장한다.
  5. 아웃고잉 어댑터에서 온 출력값을 유스케이스를 호출한 인커밍 어댑터로 반환할 출력 객체로 변환한다.