Language/Java

[Java] 도메인 모델 패턴, 트랜잭션 스크립트 패턴

마볼링 2023. 9. 1. 15:17
마틴 파울러가 재창한 두개의 개념으로, 비즈니스 로직을 처리하는 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)

📗 트랜잭션 스크립트 패턴이란?

  • 엔티티에 비지니스 로직이 거의 없고 서비스 계층에서 비즈니스 로직을 처리하는 방법
  • 엔티티는 단순하게 데이터를 전달하는 역할이 되면서 서비스 로직이 커짐

 

📗 장단점

장점

  • 구현 방법의 단순함

단점

  • 비즈니스 로직이 복잡해질수록 난잡한 코드가됨
  • 코드의 중복 발생 다수