개발 중에 테스트를 진행할 때, 아예 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 이 띄워질 때
- Spring IOC Container가 만들어지고
- Container는 Bean들을 instance화 해서 container에 등록하는데
- 그 과정에서 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에 생성된다
'Spring > boot' 카테고리의 다른 글
[JPA] DB의 data가 update 되는 플로우 정리 (0) | 2022.02.18 |
---|---|
[Spring Boot] Rest Controller DTO 의 필요성 (0) | 2022.02.15 |
Spring Boot - Test 코드 작성 (0) | 2022.01.04 |
spring boot Service 코드 repository injection관련 (0) | 2021.12.27 |
spring JPA 엔티티 Entity 어노테이션 정리 (0) | 2021.12.24 |