@SpringBootTest 시 특정 패키지만 스캔하기
문제
다음과 같이 패키지 구조를 가지고 있습니다.
<img src="https://static.podo-dev.com/blogs/images/2020/03/12/origin/7b94d342-e34e-45df-bfcd-96016e3bdadd.png" alt="base64.png" style="width:161px;">
domain
패키지 에는, 해당 도메인 모델들에 관련된
application
, domain service
, entity
, repository
등이 정의되어있습니다.
infra
패키지 에는, redis cofing
, mq config
등과 같은
외부 시스템과 관련된 Component
가 정의 되어있습니다.
<br>
그런데, 문제는
특정 도메인 모델의 통합테스트를 진행하려고 할 때 입니다.
@SpringBootTest
진행 시,
infra
패키지에 정의된 Componet
도 같이 등록됩니다.
그리고 커넥션이 되지 않는다는 ?! 에러를 던져줍니다.
아니 너네가 지금은 필요가없어요.. ㅠㅠ
<br>
그렇다고 infra
패키지의 모든 Component
에 @Profile("!domain-test")
를 명시할 수는 없습니다..
<br>
해결법
domain
패키지에 DomainIntegrataionApp
을 정의했습니다.
<img src="https://static.podo-dev.com/blogs/images/2020/03/12/origin/f8ef4658-4e71-42f1-8c4e-c16dcd7c0ca2.png" alt="base64.png" style="width:297px;">
<br>
@SpringBootTest
는 현재 패키지를 시작으로,
상위 패키지를 따라가면 @SpringBootConfiguration
을 어노테이션을 찾습니다.
@SpringBootConfiguration
는 Application Context
를 만드는데 필요한 config
를 읽는 어노테이션입니다.
@SpringBootTest
by default starts searching in the current package of the test class and then searches upwards through the package structure, looking for a class annotated with@SpringBootConfiguration
from which it then reads the configuration to create an application context.
https://reflectoring.io/spring-boot-test/
<br>
DomainIntegrataionApp
클래스를 보면 다음과 같이 정의합니다.
@SpringBootApplication(scanBasePackages = "podo.domain")
@EnableJpaRepositories("podo.domain")
@EntityScan("podo.domain")
public class DomainIntegrationApp {
}
@SpringBootApplication
는@SpringBootConfiguration
를 포함하고 있습니다.
<br>
이제 domain
패키지내에서의 @SpringBootTest
는
domain
패키지내에서의 Component
만을 scan
하게 됩니다.
따라서 불필요한 infra
패키지에 Componet
는 등록되지 않습니다.