250x250
Notice
Recent Posts
Recent Comments
Link
관심쟁이 영호
[#11.1] Spring Boot ㅣ 스프링 부트 ㅣ 주문 도메인 개발 본문
반응형
이번 시간에는 주문 도메인을 개발할거다.
개발자님께서 이 부분이 가장 중요하다고 하신다.
실제 비즈니스 로직들이 JPA로 어떻게 풀어나갈 수 있는지 볼 수 있다고 하신다.
1. 구현 기능
- 상품 주문
- 주문 내역 조회
- 주문 취소
2. 구현 순서
- 주문 엔티티, 주문상품 엔티티 개발
- 주문 리포지토리 개발
- 주문 서비스 개발
- 주문 검색 기능 개발
- 주문 기능 테스트
구현에 대한 기초 To Do List이다.
시작해보자.
3. 먼저 코드를 살펴보자.
// Order.class
@Entity
@Table(name = "orders")
@Getter @Setter
public class Order {
@Id
@GeneratedValue
@Column(name = "order_id")
private Long id;
@ManyToOne(fetch = FetchType.LAZY)// 다대일 관계 명시
@JoinColumn(name = "member_id") // 매핑 - FK 지정
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; // 주문상태 (ORDER, CANCEL)
// == 연관관계 메서드 ==//
public void setMember(Member member){
this.member = member;
member.getOrders().add(this);
}
public void addOrderItem(OrderItem orderItem){
orderItems.add(orderItem);
orderItem.setOrder(this);
}
public void setDelivery(Delivery delivery){
this.delivery = delivery;
delivery.setOrder(this);
}
/*
생성 메서드
*/
public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems){
Order order = new Order();
order.setMember(member);
order.setDelivery(delivery);
for (OrderItem orderItem : orderItems){
order.addOrderItem(orderItem);
}
order.setStatus(OrderStatus.ORDER);
order.setOrderDate(LocalDateTime.now());
return order;
}
// == 비즈니스 로직 == //
public void cancel(){
if(delivery.getStatus() == DeliveryState.COMP){ //COMP 는 이미 배송이 완료된 상품이다.
throw new IllegalStateException("이미 배송완료된 상품은 취소가 불가능합니다.");
}
this.setStatus(OrderStatus.CANCEL);
for(OrderItem orderItem: orderItems){
//주문에 담은 각 상품들에 cancel을 날려주어 상품도메인에 각 상품에 갯수를 + 해주어야 한다.
orderItem.cancel();
}
}
// == 조회 로직 == //
/*
전체 주문 가격 조회
*/
public int getTotalPrice(){
int totalPrice = 0;
for (OrderItem orderItem: orderItems){
totalPrice += orderItem.getTotalPrice();
}
return totalPrice;
}
}
(1) 생성 매서드 추가
- 생성 매서드를 추가해준 이유는 Order 같은 경우에는 Member, Delivery, OrderItem과 같이 여러가지의 요소들이 복합적으로 있어서, 이것을 생성해주는 매서드를 따로 생성해주는 것이 좋다.
- 실무에 가면 훨씬 많은 요소들이 엉켜있어서 만들어 놓지 않으면 헷갈린다.
(2) 비즈니스 로직 추가
- Cancel() 매서드를 추가 해주었다. "주문 취소"의 경우에 해당하는 경우인데, 배송이 이미 완료된 상품이면 취소가 불가능하다.
- getTotalPrice() 매서드를 추가 했다. OrderItems에 들어있는 상품들 각각 수량과 가격을 계산해주어야 하기 때문에, OrderItem에도 조회 로직을 추가 해놓아야 한다.
본 강의는 인프런의 김영한 개발자님이 강의하고 계신
"실전! 스프링 부트와 JPA활용1 - 웹 애플리케이션 개발"을 수강하면서 정리한 글입니다.
300x250
'Bank-End > 인프런- Spring 공부' 카테고리의 다른 글
[#12] Spring Boot ㅣ 스프링 부트 ㅣ 주문 검색기능 기발, 동적 쿼리 (0) | 2021.04.17 |
---|---|
[#11.2] Spring Boot ㅣ 스프링 부트 ㅣ 주문 리포지토리 및 서비스 클래스 개발 (0) | 2021.04.16 |
[#10] 스프링 부트 ㅣ Spring Boot ㅣ 상품 도메인 개발 (0) | 2021.04.14 |
[#9.3] 스프링 부트 ㅣ Spring Boot ㅣ 기능 테스트, 테스트 코드 짜기 (0) | 2021.04.13 |
[#9.2] 스프링 부트 ㅣ Spring Boot ㅣ Member 서비스 개발 (0) | 2021.04.12 |
Comments