1. 조회용 샘플 데이터 입력
@Component
@RequiredArgsConstructor
public class InitDB {
private final InitService initService;
@PostConstruct
public void init() {
initService.dbInit1();
initService.dbInit2();
}
@Component
@Transactional
@RequiredArgsConstructor
static class InitService {
private final EntityManager em;
public void dbInit1() {
Member member = createMember("userA", new Address("seoul", "1", "11111"));
em.persist(member);
Book book1 = createBook("JPA1 BOOK", 10000, 100);
em.persist(book1);
Book book2 = createBook("JPA2 BOOK", 20000, 100);
em.persist(book2);
OrderItem orderItem1 = OrderItem.createOrderItem(book1, 10000, 1);
OrderItem orderItem2 = OrderItem.createOrderItem(book2, 20000, 2);
Delivery delivery = createDelivery(member);
Order order = Order.createOrder(member, delivery, orderItem1, orderItem2);
em.persist(order);
}
public void dbInit2() {
Member member = createMember("userB", new Address("newyork", "2", "11111"));
em.persist(member);
Book book1 = createBook("SPRING1 BOOK", 20000, 200);
em.persist(book1);
Book book2 = createBook("SPRING2 BOOK", 40000, 300);
em.persist(book2);
OrderItem orderItem1 = OrderItem.createOrderItem(book1, 20000, 3);
OrderItem orderItem2 = OrderItem.createOrderItem(book2, 40000, 4);
Delivery delivery = createDelivery(member);
Order order = Order.createOrder(member, delivery, orderItem1, orderItem2);
em.persist(order);
}
}
private static Delivery createDelivery(Member member) {
Delivery delivery = new Delivery();
delivery.setAddress(member.getAddress());
return delivery;
}
private static Book createBook(String name, int price, int stockQuantity) {
Book book1 = new Book();
book1.setName(name);
book1.setPrice(price);
book1.setStockQuantity(stockQuantity);
return book1;
}
private static Member createMember(String name, Address address) {
Member member = new Member();
member.setName(name);
member.setAddress(address);
return member;
}
}
- 샘플 데이터를 입력해주는 클래스 InitDB를 jpashop 패키지에 따로 팠다.
- @Component를 통해 스프링이 자동으로 빈으로 등록해준다.
- @RequiredArgsConstructor를 통해 InitService를 자동으로 주입 받을 수 있다.
- init()은 @PostConstruct를 통해 InitDB에 대한 빈이 등록된 직후에 자동으로 호출된다.
- init()에서 호출하는 dbInit1()과 dbInit2()는 트랜잭션 안에서 실행되기 때문에 persist()를 통해 DB에 샘플 데이터를 등록할 수 있다.
- 객체 초기화 관련해서 dbInit1()과 dbInit2()가 겹치기 때문에 스태틱 메서드로 중복을 피했다.
- 그래서 결과적으로 스프링을 돌려보면,
- JPA1과 JPA2를 각각 1권, 2권 주문한 userA와
- SPRING1과 SPRING2를 각각 3권, 4권 주문한 userB가
- DB에 등록되는 것을 확인할 수 있다.
'스프링 (인프런) > 스프링부트' 카테고리의 다른 글
API 개발 고급 - 컬렉션 조회 최적화 1 (0) | 2023.07.15 |
---|---|
API 개발 고급 - 지연 로딩과 조회 성능 최적화 (0) | 2023.07.14 |
API 개발 기본 (1) | 2023.07.13 |
웹 계층 개발 (0) | 2023.07.08 |
주문 도메인 개발 (0) | 2023.07.07 |