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)[2-2]. 주문 취소 with. Dirty Checking[3]. 주문 검색 기능 개발💡 JPA에서 동적 쿼리를 어떻게 해결할까?도메인 모델 패턴과 트랜잭션 스크립트 패턴📎 출처
🍯 꿀팁
📝 강의 정리
[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) ?