본문 바로가기

스프링 (인프런)/스프링부트

API 개발 고급 - 준비

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에 등록되는 것을 확인할 수 있다.