[스프링부트JPA_활용2] Section2 - API개발고급-준비

JiMin LEE·2022년 11월 3일
0

[Spring]JPA활용2

목록 보기
2/6
post-thumbnail

2️⃣ 조회용 샘플 데이터 입력

  • @PostConstruct
    - : 의존성 주입이 이루어진 후 초기화를 수행하는 메소드
    - 사용 이유
    - 생성자가 호출되었을 때, 빈은 초기화되지 않았다.(의존성 주입이 이루어지지 않음)
    - 이때 사용하면 의존성 주입이 끝나고 실행됨이 보장되므로 빈 초기화 걱정할 필요X
    - 빈이 여러번 초기화 되는 것을 막을 수 있다.
    - 이 애노테이션이 붙은 메소드는 클래스가 service를 수행하기 전에 발생한다.

    ```java
    @Component
    public class DbInit {
    
        @Autowired
        private UserRepository userRepository;
    
        @PostConstruct
        private void postConstruct() {
            User admin = new User("admin", "admin password");
            User normalUser = new User("user", "user password");
            userRepository.save(admin, normalUser);
        }
    }
    ```

  • 조회용 샘플 데이터 입력

    • jpabook.jpashop.InitDb
    		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;
    
    @Component
    @RequiredArgsConstructor
    public class InitDb {
        private final InitService initService;
    
        @PostConstruct
        public void init(){
            initService.dbInit1();
            initService.dbInit2();
            **/* dbInit1의 코드를 이곳으로 복붙 하면 안 되는 이유            
               스프링 라이프 사이클이 존재하여 transactional이 먹히지 않는다 
               그렇기에 별도의 스프링 빈으로 만들어주어야 한다.              
            */**                                                   
        }
    
        @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("SPRING BOOK1", 20000, 200);
                em.persist(book1);
    
                Book book2 = createBook("SPRING BOOK2", 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);
            }
    
                    // 단축키 : option + cmd + m
            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 Delivery createDelivery(Member member) {
                Delivery delivery = new Delivery();
                delivery.setAddress(member.getAddress());
                return delivery;
            }
    
            private Book createBook(String name, int price, int stockQuantity) {
                Book book1 = new Book();
                book1.setName(name);
                book1.setPrice(price);
                book1.setStockQuantity(stockQuantity);
                return book1;
            }
    
        }
    }

0개의 댓글