API의 성능 문제에 대해 알아보자
API 개발 할 때 등록/수정은 성능문제가 거의 없다.
주로 조회에서 문제가 발생하는데 최적화를 시킬 수 있는 방법이 뭐가 있는지 간단하게 보고 넘어가자
- 지연 로딩과 조회 성능 최적화
- 컬렉션 조회 최적화
- 페이징과 한계 돌파
- OSIV와 성능 최적화
package jpabook.jpashop;
@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);
}
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);
}
// 회원(Member) 생성 함수 :
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;
}
// 상품(Book) 생성 함수
private Book createBook(String name, int price, int stockQuantity) {
Book book1 = new Book();
book1.setName(name);
book1.setPrice(price);
book1.setStockQuantity(stockQuantity);
return book1;
}
// 배송지 정보 생성 함수
private Delivery createDelivery(Member member) {
Delivery delivery = new Delivery();
delivery.setAddress(member.getAddress());
return delivery;
}
}
}
설명을 좀 하자면
@Component
: DB의 정보를 스프링 빈의 스캔 대상이 되게 하기 위함
@PostConstruct
: 말그대로 Construct 이전에 실행시키세요. DB니까 먼저 초기화 시켜야지
@PostConstruct로 init()
이 먼저 실행 될건데 init( ) 함수에는 dbInit1( )과 dbInit2( )가 있다.
dbInit1,2를 굳이 따로 함수로 만들어서 init()에 넣는 이유는... 뭐 그런게 있대. 싸이클이 어쨌다나..
dbInit1,2가 담길 class InitService
를 선언하고 initService
를 생성해서 init()에 넣어준다.
class InitService
: createMember( ), createBook( ), createDelivery( )를 선언하고 dbInit( )에서 생성해준다.
끝~~