본문 바로가기
Spring/boot

[Spring Boot] 개발 단계에서 테스트를 위한 DB data 만들기

by 코딩균 2022. 2. 18.

개발 중에 테스트를 진행할 때, 아예 db에 테스트 data를 넣고 싶다면

was가 띄워지기 전에 DB에 data들을 넣는 방법이 있다

 

그전에 Spring Component와 Bean에 대해 간단히 정리하고 가고자 한다

 

Spring Bean

Spring 을 구성하는 핵심요소들

Spring IOC(Inversion Of Control) 컨테이너에 의해 관리되는 POJO (Plain Old Java Object) 

Spring Container에서 생성하는 객체

 

Spring Component

bean으로 등록될 로직을 가진 class

Spring이 IOC 컨테이너를 만들고 그 안에 Bean 객체들을 생성해서 등록시킬 때(Life Cycle CallBack) 

Component들을 모두 스캔하여 그러한 class들의 instance를 생성하여 bean으로 등록시킴

 

나도 아직 완벽히 이해한 것은 아니지만 이정도로 하고 나중에 다시 관련 포스팅을 딥하게 적어보고자 한다

 

결론은 spring 이 띄워질 때

  1. Spring IOC Container가 만들어지고
  2. Container는 Bean들을 instance화 해서 container에 등록하는데
  3. 그 과정에서 Component들을 scan해서 모두 instance 화 -> Bean 등록 한다

 

이 과정을 생각하며 WAS가 띄워지기전 (Spring container가 생성된 후) db에 data들을 넣는 component를 만들어 보고자 한다

 

@Component // spring 의 component scan의 대상
@RequiredArgsConstructor
public class InitDb {

    private final InitService initService;

    @PostConstruct // application 로딩 시점에 호출해주기 위함 - spring bean이 다 엮이고 나서 spring bean이 해당을 호출해줌
    public void init(){

        initService.dbInit1();
        initService.dbInit2();

    } // 여기에 다 넣는 것이 spring life cycle 문제로 transactional 올리는 것이 잘 안된다

    @Component
    @Transactional
    @RequiredArgsConstructor
    static class InitService{
        private final EntityManager em;
        
        private Member createUser(String name) {
            Member member = new Member();
            member.setName(name);
            return member;
        }
        
        public void dbInit1(){
            User user = createUser("user1", "010-1234-2345");
            em.persist(user);

           	Product product = createProduct("product1", 10000);
            em.persist(product)
            
            Order order = Order.createOrder(user, product, 3);
            em.persist(order);

        }

        

        public void dbInit2(){
            User user = createUser("user2", "010-1231-2345");
            em.persist(user);

           	Product product = createProduct("product2", 4000);
            em.persist(product)
            
            Order order = Order.createOrder(user, product, 2);
            em.persist(order);

        }

    }

}

 

@PostContruct

해당 어노테이션이 있는 경우 WAS가 띄워지기 전에 실행된다

 

@PreDestroy

Spring Contrainer가 Bean들을 해체하기 전에 실행된다

 

 

Spring Component Scan에서 InitDB가 scan 당하고 

InitService가 하위 Component로 인식되어서 안의 dbInit1 과 dbInit2가 모두 Bean으로 등록된다

@PostContruct 어노테이션에 따라 init 메소드가 WAS가 띄워지기 전에 실행된다

test db들이 DB에 생성된다