Hansel

스프링부트 기초 / 도메인 설정 2 본문

Spring/기초

스프링부트 기초 / 도메인 설정 2

핑슬 2022. 2. 21. 17:16

 

Order 엔티티 개발
@Entity @Getter @Setter
@Table(name = "ORDERS")
@NoArgsConstructor(access = AccessLevel.PROTECTED) //생성자 차단
public class Order {

    @Id @GeneratedValue
    @Column(name = "ORDER_ID")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "MEMBER_ID") //join하는 FK의 이름을 적어준다. 연관관계의 주인
    private Member member;

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

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

    private LocalDateTime OrderTime;

    @Enumerated(EnumType.STRING)
    private OrderStatus status;

기본 필드와 연관 관계는 위 코드와 같이 작성되어 있다.

 

Order의 비즈니스 로직

order 엔티티와 연관관계가 형성된 엔티티들을 매개변수로 받아서 연관관계를 잡아준다.

1. CreateOrder

creaetOrder 메서드는 static으로 작성되었는데 여기서 해당 메서드는 어느 특정 Order 객체를 위해서만 작동하는게 아니라 주문 자체를 생성해서 그 주문 정보를 반환해야 한다. 그리고 반환된 주문 객체를 리포지토리 계층에 전달해 db에 저장하는 방식으로 진행한다. 따라서 static으로 작성되었다.

 

 

2. Cancel

주문을 취소하는 메서드로 '다'에 속한 orderitem들을 같이 취소해준다.

 

3. getTotalPrice

해당 주문에 대한 전체 가격을 조회하는 메서드

 

 

Order_Item의 비즈니스 로직

 

1. CreateOrderItem

주문된 상품의 정보를 받아 값을 세팅해주고 반환한다.

removeStock의 경우 해당 저렇게 한다고 필드 값이 변경되는지 의아하겠지만 변경 감지 기능으로 영속성 컨텍스트에 의해 관리되는 엔티티는 데이터 값의 변경이 감지되어 commit 하는 시점에 반영된다.

 

2. cancel 
취소된 해당 아이템의 수량을 다시 복구한다.

 

3. getTotalPrice
수량에 맞춰 가격을 반환한다.

 

여기선 createOrderItem을 통해 주문된 객체를 반환하고 그 객체를 Order의 매개변수로 넣어 주문을 생성하는데 이렇게 하면 주문이 담는 상품의 수량은 다수일 수 있어도 상품의 종류는 항상 1개로 고정이 된다.

쇼핑몰에서 장바구니가 괜히 있는게 아니라는 생각이 들었다.

 

Order Service

대부분의 비즈니스 로직이 엔티티에 있어 엔티티에 위임하는 형태를 띄고 있다. (도메인 모델 패턴)

 

 

Order Test