마틴 파울러가 재창한 두개의 개념으로, 비즈니스 로직을 처리하는 2가지 패턴을 말한다.
책임 소재가 Domain Level이냐 Script Level이냐의 차이에 따라 구분된다.
📕 도메인 모델 패턴 (Domain Model Pattern)
📗 도메인 모델 패턴이란?
- Domain 부분에서 비즈니스 로직을 가지고 있는 패턴
- 대부분의 비즈니스 로직이 엔티티 안에 구성되어 있어 객체지향의 특성을 적극 활용
📗 장단점
장점
- 객체 지향에 기반한 재사용성, 확장성, 유지 보수의 편리함
단점
- 하나의 도메인 모델을 구축하는 데 많은 노력필요
📗 예시
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class DayTodo {
private String chaosName;
@Size(max = 2)
private int chaosCheck; //일일숙제 카오스던전 돌았는지 체크(0, 1, 2)
@Size(max = 100)
private int chaosGauge; //카오스던전 휴식게이지(0~100)
private double chaosGold; // 예상골드
private String guardianName;
@Size(max = 2)
private int guardianCheck; //일일숙제 가디언토벌 돌았는지 체크(0, 1, 2)
@Size(max = 100)
private int guardianGauge; //가디언토벌 휴식게이지(0~100)
private double guardianGold;
private boolean eponaCheck; //에포나
/**
* 일일컨텐츠 업데이트 메서드
*/
public void updateDayContent(CharacterCheckDto characterCheckDto) {
this.chaosCheck = characterCheckDto.getChaosCheck();
this.guardianCheck = characterCheckDto.getGuardianCheck();
this.eponaCheck = characterCheckDto.isEponaCheck();
}
/**
* 카오스던전 휴식게이지 계산 후 초기화
*/
public void calculateChaos() {
switch (chaosCheck) {
case 0:
chaosGauge = add(chaosGauge, 20);
break;
case 1:
if (chaosGauge >= 20) {
chaosGauge = subtract(chaosGauge, 10);
} else {
chaosGauge = add(chaosGauge, 10);
}
break;
case 2:
chaosGauge = subtract(chaosGauge, 40);
break;
}
chaosCheck = 0;
}
/**
* 가디언토벌 휴식게이지 계산 후 초기화
*/
public void calculateGuardian() {
switch (guardianCheck) {
case 0:
guardianGauge = add(guardianGauge, 10);
break;
case 1:
guardianGauge = subtract(guardianGauge, 20);
break;
}
this.guardianCheck = 0;
}
/**
* 휴식게이지 업데이트
*/
public void updateGauge(CharacterDayTodoDto characterDayTodoDto) {
Integer dtoChaosGauge = characterDayTodoDto.getChaosGauge();
validateGauge(dtoChaosGauge); //검증
this.chaosGauge = dtoChaosGauge;
Integer dtoGuardianGauge = characterDayTodoDto.getGuardianGauge();
validateGauge(dtoGuardianGauge); //검증
this.guardianGauge = dtoGuardianGauge;
}
/**
* 휴식게이지 검증
*/
private void validateGauge(Integer gauge) {
if (gauge < 0 || gauge > 100 || gauge % 10 != 0) {
throw new IllegalArgumentException("휴식게이지는 0~100 사이이며, 10단위여야 합니다.");
}
}
// 두 숫자 더하기
// 단, 음수가 되면 0을 리턴하는 메서드
public int subtract(int a, int b) {
int result = a - b;
if (result < 0) {
result = 0;
}
return result;
}
// 두 숫자 빼기
// 단, 100이 넘으면 100을 리턴하는 메서드
public int add(int a, int b) {
int result = a + b;
if (result > 100) {
result = 100;
}
return result;
}
}
📕 트랜잭션 스크립트 패턴 (Transaction Script Pattern)
📗 트랜잭션 스크립트 패턴이란?
- 엔티티에 비지니스 로직이 거의 없고 서비스 계층에서 비즈니스 로직을 처리하는 방법
- 엔티티는 단순하게 데이터를 전달하는 역할이 되면서 서비스 로직이 커짐
📗 장단점
장점
- 구현 방법의 단순함
단점
- 비즈니스 로직이 복잡해질수록 난잡한 코드가됨
- 코드의 중복 발생 다수