개발을 하다보면 main에서만 실행되고 test에서는 실행되길 기대하지 않는 메서드(나 클래스)가 있을 수 있습니다.
main 과 test에서 따로 동작하는 클래스를 제작하는 방법에 대해 다뤄봅니다.
방법
1. application.yml 을 main과 test에 따로 만들고 spring.profiles.active 이름을 다르게 지정합니다.
main의 application.yml
spring:
profiles:
active: local
...
test의 application.yml
spring:
profiles:
active: test
...
2. main에서만 실행되길 기대하는 클래스에 @Profile("local")을 붙여줍니다.
보통은 개발단계에서 InitDB를 main에서만 실행시킬때 사용합니다.
...
@Profile("local")
@Component
@RequiredArgsConstructor
public class InitDB {
private final InitService initService;
@PostConstruct
public void init() {
initService.dbInit1();
}
@Component
@Transactional
@RequiredArgsConstructor
static class InitService {
private final EntityManager em;
public void dbInit1() {
...
}
}
}
왜 됨?
Spring boot는 main을 실행하면 main의 application.yml을 읽어서 실행하고, test를 실행하면 main의 application.yml을 읽어서 실행합니다.
@Profile 어노테이션은 현재 읽은 application.yml의 active 이름을 읽어서 일치할 경우에 실행하도록 합니다.
그래서 현재 local(main) application.yml이 실행되고 있으므로 InitDB가 동작하고, Test의 applicaiton.yml이 실행될때는 InitDB가 동작하지 않게 되는 것입니다.
'Web > 팁' 카테고리의 다른 글
[우테코 프리코스] 백엔드 프로젝트 초기설정 (Mac OS) (0) | 2021.12.01 |
---|---|
[GitHub] Support for password authentication was removed on August 13, 2021. 에러 (0) | 2021.08.17 |
[IntelliJ] [Java] UnsupportedClassVersionError 해결 (0) | 2021.07.14 |
[IntelliJ] Gradle 프로젝트 불러올때 에러해결 (3) | 2021.07.14 |
[Spring] [IntelliJ] 정적리소스 서버 재시작없이 바로 반영하기 (0) | 2021.05.20 |