육각형 아키텍처는 도메인 중심의 아키텍처에 적합하므로 도메인 엔티티를 만든 후 유스케이스를 구현한다.
송금하기 예제
Account
엔티티: 실제 계좌의 현재 스냅샷. 입금과 출금을 할 수 있다.Account.baselineBalance
필드: Account.activityWindow
의 첫번째 활동 바로 전의 잔고ActivityWindow
엔티티: 계좌에 대한 최근 모든 활동
Activity
엔티티: 입금, 출금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)
);
}
}