나는 @PostConstruct
를 사용해서 편리하게 application 이 실행 되기 이전에 데이터를 넣어준 경험이 있다. 하지만 이때 테스트 코드를 작성할 때 개수를 카운트 하는 시점에 곤란해진다. 예시로 @PostConstruct
으로 사전에 2개의 데이터를 넣어놨다고 가정해보자. 그러면 save 라는 디비에 데이터를 저장하는 테스트 코드를 작성했을때 하나의 데이터를 추가로 저장하면 디비에는 총 3개의 데이터가 있게 되는 것이다. 이런 상황을 극복하기 위해서 스프링이 제공한는 @profile
어노테이션을 사용하면 된다.
/**
* TestDataInit.class
* 확인용 초기 데이터 추가
*/
@EventListener(ApplicationReadyEvent.class)
public void initData() {
log.info("test data init");
itemRepository.save(new Item("itemA", 10000, 10));
itemRepository.save(new Item("itemB", 20000, 20));
}
// Application.class (main)
@Bean
@Profile("local")
public TestDataInit testDataInit(ItemRepository itemRepository) {
return new TestDataInit(itemRepository);
}
@EventListener(ApplicationReadyEvent.class)
는 애플리케이션이 뜨고 나서 실행된다는 뜻이다. (아래 그림 참고)
@Profile("local")
을 통해서 나의 profile 이 local에 해당하면 testDataInit
함수를 빈으로 등록하라는 뜻이다. 즉, profile 이 local이 아니면 데이터 초기화 함수를 실행하지 않는 것이다. 따라서 테스트 코드를 작성하는 곳에서 profile 이 local이 아닌 다른 값으로 설정해주면 내가 겪은 문제가 해결된다.
profile을 설정하는 방법으로는 application.properties
파일에 spring.profiles.active=local
이런식으로 적어주면 된다.