프로그래밍/spring boot

[스프링부트] 실전! 스프링 부트와 JPA 활용2 #2 API 개발 고급 - 준비

aSpring 2023. 11. 15. 11:10
728x90
728x90
※ 본 포스팅은 김영한 강사님의 인프런 '실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화' 강의를 들으며 작성한 수강일지 입니다.

 
 
 

 
 

| API 개발 고급 - 준비

1. API 개발 고급 소개
2. 조회용 샘플 데이터 입력

 

1. API 개발 고급 소개

조회용 샘플 데이터 입력

지연 로딩과 조회 성능 최적화

컬렉션 조회 최적화

페이징과 한계 돌파

OSIV(Open Session In View)와 성능 최적화

 

2. 조회용 샘플 데이터 입력

API 개발 고급 설명을 위해 샘플 데이터 입력

  • userA
    • JPA1 BOOK
    • JPA2 BOOK
  • userB
    • SPRING1 BOOK
    • SPRING2 BOOK

-> 총 2건의 주문

 

package jpabook.jpashop;

import jpabook.jpashop.domain.*;
import jpabook.jpashop.domain.item.Book;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;

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

/**
 * 총 주문 2개가 만들어져야 함
 * // 주문1
 *  * userA
 *      * JPA1 BOOK
 *      * JPA2 BOOK
 * // 주문2
 *  * userB
 *      * SPRING1 BOOK
 *      * SPRING2 BOOK
* */
@Component // 서버가 뜰 대, spring의 컴포넌트 스캔으로 되고, 스프링 빈이 다 엮이고 나서
@RequiredArgsConstructor
public class InitDb {

    private final InitService initService;

    @PostConstruct // spring bin이 PostConstructor 호출
    public void init() { // db init
        initService.dbInit1();
    }

    @Component
    @Transactional
    @RequiredArgsConstructor
    static class InitService {

        private final EntityManager em;
        public void dbInit1() {
            Member member = new Member();
            member.setName("userA");
            member.setAddress(new Address("서울", "1", "11111"));
            em.persist(member);

            Book book1 = new Book();
            book1.setName("JPA1 BOOK");
            book1.setPrice(10000);
            book1.setStockQuantity(100);
            em.persist(book1);

            Book book2 = new Book();
            book2.setName("JPA2 BOOK");
            book2.setPrice(20000);
            book2.setStockQuantity(100);
            em.persist(book2);

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


            Delivery delivery = new Delivery();
            delivery.setAddress(member.getAddress());
            Order order = Order.createOrder(member, delivery, orderItem1, orderItem2);
            em.persist(order);
        }
    }

}

 

- spring.jpa.hibernate.ddl-auto: create 로 다시 변경

 

-> 서버 실행시켜서 확인해주기(항상 h2 db도 연결하는 것 잊지 말기)

 

주문 내역 화면에서는 회원당 주문 내역을 하나만 출력했으므로 하나만 노출됨(db 데이터는 주문 2개임)

 

- userB도 추가 -> meber 생성, Book 생성, Delivery 생성하는 코드도 중복이므로 Option + Command + M 해서 method 생성

package jpabook.jpashop;

import jpabook.jpashop.domain.*;
import jpabook.jpashop.domain.item.Book;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

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

/**
 * 총 주문 2개가 만들어져야 함
 * // 주문1
 *  * userA
 *      * JPA1 BOOK
 *      * JPA2 BOOK
 * // 주문2
 *  * userB
 *      * SPRING1 BOOK
 *      * SPRING2 BOOK
* */
@Component // 서버가 뜰 대, spring의 컴포넌트 스캔으로 되고, 스프링 빈이 다 엮이고 나서
@RequiredArgsConstructor
public class InitDb {

    private final InitService initService;

    @PostConstruct // spring bin이 PostConstructor 호출
    public void init() { // db init
        initService.dbInit1();
        initService.dbInit2();
    }

    @Component
    @Transactional
    @RequiredArgsConstructor
    static class InitService {

        private final EntityManager em;
        public void dbInit1() {
            // userB도 생성해야 하는데 생성 코드가 중복이므로 메서드 생성
//            Member member = new Member();
//            member.setName("userA");
//            member.setAddress(new Address("서울", "1", "11111"));

            Member member = createMember("userA", "서울", "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);
        }

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

        public 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;
        }

        public void dbInit2() {
//            Member member = new Member();
//            member.setName("userB");
//            member.setAddress(new Address("부산", "2", "22222"));
            Member member = createMember("userB", "부산", "2", "22222");
            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);
        }
    }

}

 

-> 이제 이 초기 데이터들을 가지고 다음 시간부터 최적화를 할 예정

728x90
728x90