Spring

주문 도메인 개발

date
Oct 20, 2023
slug
스프링부트-JPA-활용1-6
status
Public
tags
실전! 스프링 부트와 JPA 활용 1
author
summary
[실전! 스프링 부트와 JPA 활용 1] 강의 정리
type
Post
thumbnail
updatedAt
May 28, 2024 12:34 PM
category
Spring
김영한
인프런

🍯 꿀팁


 

📝 강의 정리


[1]. 주문, 주문상품 엔티티 개발


생성 메서드

  • 주문 생성시 필요한 비즈니스 로직은 주문 엔티티 외부가 아닌 엔티티 내부에서 처리한다
    • → 생성에 필요한 로직 수정이 용이해진다.
 

[2]. 주문 서비스 개발


[2-1]. @연관관계(CascadeType.ALL)

public class Order { @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List<OrderItem> orderItems = new ArrayList<>(); } public class OrderItem { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "order_id") private Order order; } // OrderService public Long 주문생성() { // 3. 주문상품 생성 OrderItem orderItem = OrderItem.createOrderItem(item, item.getPrice(), count); // 4. 주문 생성 Order order = Order.createOrder(member, delievery, orderItem); orderRepository.save(order); }
  • Order : OrderItem → 1 : N 연관관계
  • cascade = CascadeType.ALL : 옵션으로 인해 orderRepository.save(order)를 호출할 때,
    • orderItem도 em에 persist된다 !
 
💡
cascade의 범위는 어떻게 설정할까?
  • 정확한 기준은 애매하지만, 위의 order-orderitem, order-delievery의 관계처럼 order만이 orderitem과 delieve를 참조하는 관계일 때.
    • → 엔티티간의 연관관계가 복잡해지면, 로직 수행 중 값이 변경될 수 있으므로 조심해서 써야함
 

[2-2]. 주문 취소 with. Dirty Checking


  • 주문 취소 메서드
    • /** * 주문 취소 */ @Transactional public void cancelOrder(Long orderId) { // 배송 정보 조회 Order order = orderRepository.findOne(orderId); // 주문 취소 // 스프링에서 더티체킹으로 인해, 데이터의 변경이 일어나면 DB에 update 쿼리를 자동으로 날린다. // 따라서, 부가적인 SQL 코드를 짤 필요가 없어진다. order.cancel(); }
 
 
💡
더티체킹(Dirty Checking) ?
 
 
 
 

[3]. 주문 검색 기능 개발


💡 JPA에서 동적 쿼리를 어떻게 해결할까?

     

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


     

    📎 출처