백엔드/JPA

[JPA 활용2] [2] API 개발 고급 - 준비

RE-Heat 2023. 8. 31. 19:48

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-API%EA%B0%9C%EB%B0%9C-%EC%84%B1%EB%8A%A5%EC%B5%9C%EC%A0%81%ED%99%94/dashboard

 

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 - 인프런 | 강의

스프링 부트와 JPA를 활용해서 API를 개발합니다. 그리고 JPA 극한의 성능 최적화 방법을 학습할 수 있습니다., 스프링 부트, 실무에서 잘 쓰고 싶다면? 복잡한 문제까지 해결하는 힘을 길러보세요

www.inflearn.com

인프런 김영한 님의 강의를 듣고 작성한 글입니다.

 

[1] 조회용 샘플 데이터 입력

프로그램 실행할 때마다 데이터를 입력하는 게 번거로우므로 따로 샘플 데이터값이 들어갈 수 있도록 세팅

 

<샘플 데이터>

주문 2건

userA (구입한 책은 JPA 책 2권)

 - JPA1 BOOK

 - JPA2 BOOK

userB (구입한 책은 스프링 책 2권)

 - SPRING1 BOOK

 - SPRING2 BOOK

 

InitDb

/**
 * 총 주문 2개
 * userA
 *  JPA1 BOOK
 *  JPA2 BOOK
 * userB
 *  SPRING1 BOOK
 *  SPRING2 BOOK
 */

@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", "서울", "1", "1111");
            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);
        }

        private static Delivery createDelivery(Member member) {
            Delivery delivery = new Delivery();
            delivery.setAddress(member.getAddress());
            return delivery;
        }

        public void dbInit2(){
            Member member = createMember("userB", "진주", "2", "2222");
            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 Member createMember(String name, String city, String street, String zipcode) {
            Member member = new Member();
            member.setName(name);
            member.setAddress(new Address(city, street, zipcode));
            return member;
        }

        private static Book createBook(String book, int price, int stockQuantity) {
            Book book1 = new Book();
            book1.setName(book);
            book1.setPrice(price);
            book1.setStockQuantity(stockQuantity);
            return book1;
        }
    }
}
  • @PostConstructor : 스프링 빈이 생성되는 시점에 실행되도록 하는 어노테이션이다.
    • dbInit()을 @PostConstructor에 직접 넣어도 될 것 같지만, 스프링 라이프사이클이 있어 @Transactional이 제대로 동작하지 않을 수 있으므로 따로 분리한다.
  • createMember, createBook으로 다시 쓰기 편하게끔 메소드화
    • IntelliJ 윈도우 단축키 ctrl + alt + m으로 원하는 부분을 메소드화 할 수 있다.
    • UserA, UserB에 파라미터 형식으로 넣는 방식으로 하면 IntelliJ가 알아서 처리해 준다. 단, 파라미터 변수명은 수정 필요할 수 있다.
    • stockQuantity 같은 경우 모두 100으로 했더니 100 값이 들어갔는데, ctrl+alt+p를 눌러주면 알아서 파라미터화 해준다.

 

■ 실행결과

① 회원목록

② 상품목록

③ 주문내역

  • userA와 userB는 각각 두 개의 상품을 시켰으나 샘플을 간략하게 만들기 위해 대표상품 1개만 화면에 노출되도록 만듦.
  • 다시 말해 회원당 주문 내역을 하나만 출력했다는 의미다.