본문 바로가기
Dev/JPA

[JPA] JPA 활용 II - API 개발 고급 (준비)

by dev_jsk 2021. 9. 29.
728x90
반응형

등록, 수정에 비해 조회 기능은 성능 문제가 많이 발생한다. 앞으로 학습할 성능 최적화를 통해 문제를 해결해보자

샘플 데이터 생성

조회 성능 최적화 실습을 위한 샘플 데이터를 생성하는 클래스를 생성해보자

데이터 생성 클래스

package jpabook.jpashop;

import javax.annotation.PostConstruct;
import javax.persistence.EntityManager;

import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import jpabook.jpashop.domain.Address;
import jpabook.jpashop.domain.Delivery;
import jpabook.jpashop.domain.Member;
import jpabook.jpashop.domain.Order;
import jpabook.jpashop.domain.OrderItem;
import jpabook.jpashop.domain.item.Book;
import lombok.RequiredArgsConstructor;

@Component
@RequiredArgsConstructor
public class InitDB {
    
    private final InitService initService;

    @PostConstruct
    public void init() {
        initService.dbInit1();
        initService.dbInit2();
    }

    /**
     * userA (JPA1 Book, JPA2 Book)
     * userB (SPRING1 Book, SPRING2 Book)
     */
    @Component
    @Transactional
    @RequiredArgsConstructor
    static class InitService {
        private final EntityManager em;

        public void dbInit1() {
            Member member = createMember("userA", "서울", "1", "111-111");
            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);

            Order order = Order.createOrder(member, createDelivery(member), orderItem1, orderItem2);
            em.persist(order);
        }

        public void dbInit2() {
            Member member = createMember("userB", "부산", "2", "222-222");
            em.persist(member);

            Book book1 = createBook("SPRING1 Book", 20000, 100);
            em.persist(book1);
            Book book2 = createBook("SPRING2 Book", 40000, 100);
            em.persist(book2);

            OrderItem orderItem1 = OrderItem.createOrderItem(book1, 20000, 1);
            OrderItem orderItem2 = OrderItem.createOrderItem(book2, 420000, 2);

            Order order = Order.createOrder(member, createDelivery(member), orderItem1, orderItem2);
            em.persist(order);
        }

        private 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 Book createBook(String name, int price, int stockQuantity) {
            Book book = new Book();
            book.setName(name);
            book.setPrice(price);
            book.setStockQuantity(stockQuantity);
            return book;
        }

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

    }
}
  • @Component : 스프링의 컴포넌트 스캔 대상으로 스프링 빈으로 등록한다.
  • @PostConstructor : 스프링 빈이 생성되는 시점에 실행되도록 하는 어노테이션이다.
  • 주문 엔티티의 생성 메소드 createOrder(Member member, Delivery delivery, OrderItem...orderItems)OrderItem...의 의미는 같은 타입의 파라미터를 여러개 받을 수 있다는 것이다.

샘플 데이터를 WAS 기동시 마다 만들기 때문에 jpa.hibernate.ddl-auto : create로 설정하여 WAS 기동시 깔끔하게 샘플 데이터를 생성할 수 있다.

데이터 생성 구동 결과

샘플 회원 데이터
샘플 상품 데이터
샘플 주문 데이터

728x90
반응형

댓글