backend/springboot

도메인 모델 패턴, 트랜잭션 스트립트 패턴

ssoheeh 2024. 4. 4. 17:40

도메인 모델 패턴

  • 도메인을 모든 사람이 이해하고 공유 가능하도록 단순화시킨 모델
  • DDD(Domain Driven Design) 개발 방식을 따르는 패턴
  • 서비스 계층에 비즈니스 로직이 거의 없고 엔티티 내부에 비즈니스 로직을 구현해 엔티티의 객체지향 활용
  • 엔티티 안 비즈니스 로직이 구현되어 있어 DTO와 엔티티의 차이를 쉽게 파악 가능하지만 각 객체들의 관계를 정립해야 하며 DB 사이 매핑 관계를 더 고려해야함

 

 

도메인 모델 패턴을 적용한 코드 (김영한 실전 스프링부트와 JPA와 활용1 중 일부)

@Entity
@Table(name = "orders")
@Getter @Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Order {
    @Id @GeneratedValue
    @Column(name = "order_id")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "member_id") //연관관계 주인
    private Member member;

    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
    private List<OrderItem> orderItems = new ArrayList<>();

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "delivery_id")
    private Delivery delivery;

    private LocalDateTime orderDate;

    @Enumerated(EnumType.STRING)
    private OrderStatus status;


   

    //==비지니스 로직==//
    //cancel
    public void cancel(){
        if(delivery.getStatus()==DeliveryStatus.COMP){
            throw new IllegalStateException("이미 배송완료된 상품은 취소가 불가능합니다.");

        }

        this.setStatus(OrderStatus.CANCEL);
        for (OrderItem orderItem:orderItems){
            orderItem.cancel();
        }
    }

    //==조회==//
    //전체주문가격 조회
    public int getTotalPrice(){
        int totalPrice = 0;
        for (OrderItem orderItem:orderItems){
            totalPrice+=orderItem.getTotalPrice();
        }
        return totalPrice;
    }


}

 

 

 

 

트랜잭션 스크립트 패턴

  • 엔티티에 비즈니스 로직이 거의 없고 Getter, Setter만 가지고 서비스 계층에서 비즈니스 로직을 처리
  • 구현 방법이 쉬움
  • 엔티티 설계/분석 개념이 약해져 중복 코드 발생할 수 있다는 단점
  • 엔티티를 객체보다 자료구조(DTO) 개념으로 이용