개발 시에 테스트 환경을 분리하기 위해서 application.yml 파일을 각각 main, test 경로에 2개 설정했다.
main의 application.yml : src/main/resources/application.yml
test의 application.yml : src/test/resources/application.yml
이렇게 2개를 설정해놔도, Test 시에 @SpringBootTest가 있다면, test의 application.yml가 먼저 적용되기 때문에
테스트 시 문제가 없었다.
하지만, application.yml 이외의 다른 yml 파일은 test 시에 읽지 못하는 것 같았다.
현재 프로젝트에서는 AWS S3를 사용하기 때문에 S3 사용 시 인증에 필요한 access-key, secret-key가 담긴
aws.yml 파일이 src/main/resources/aws.yml 이렇게 main의 application.yml과 같은 경로에 있었다.
이 상태로 테스트를 해보니, aws.yml에 있는 프로퍼티의 값을 @Value로 읽어오지 못해서
단순하게 test의 application.yml의 경로인 src/tests/resources/에 aws.yml을 붙여넣기 하면 되는 줄 알았다.
프로젝트 Structure
👉 이렇게 aws.yml을 test 경로에 붙여넣기 했는데도,
똑같이 테스트시 @Value가 aws.yml의 값을 못 읽어왔다.
구글링을 하다가, 문제 해결 방법 2가지를 발견했다.
문제 해결
① 프로퍼티 key-value를 어노테이션에서 지정하기
@TestPropertySource(properties = "cloud.aws.credentials.access-key = ~~")
@TestPropertySource(properties = "cloud.aws.credentials.secret-key = ~~~")
이렇게 어노테이션으로 properties를 지정하면 해결할 수 있었다.
하지만, 이렇게 어노테이션으로 지정했을 경우에 다른 테스트 클래스에서도 이 프로퍼티를 사용한다면 그때마다
gitignore에 사용하는 테스트 클래스를 추가해야하므로 불편하다고 생각했다.
따라서, 다른 방법을 찾다가 두 번째 방법을 찾았다.
★★② yml의 경로를 지정해서 적용하도록 설정
@SpringBootTest(properties = "spring.config.location=" +
"classpath:/application.yml" +
",classpath:/aws.yml"
)
class BcdeprojectApplicationTests {
@Test
void contextLoads() {
}
}
이렇게 @SpringBootTest의 properties 속성을 이용해서 yml 파일들의 경로를 지정해주면
설정 파일인 application.yml 뿐만 아니라 설정 파일이 아닌 aws.yml 파일도 테스트 시 불러올 수 있게 된다.
이 경우에는 gitignore를 main처럼 aws.yml 파일 하나만 해두면 되기 때문에 편리했다.
※ Main에서는 SpringApplicationBuilder를 사용할 수도 있다.
@SpringBootApplication
public class BcdeprojectApplication {
public static final String APPLICATION_LOCATIONS =
"spring.config.location="
+ "classpath:application.yml,"
+ "classpath:aws.yml";
public static void main(String[] args) {
new SpringApplicationBuilder(BcdeprojectApplication.class)
.properties(APPLICATION_LOCATIONS)
.run(args);
}
}
👉 Application Location(경로)를 상수로 정의해놓고, 해당 상수를 SpringApplicationBuilder의
properties()에 넣어서 설정해주면 똑같이 설정된다!
※ classpath:/ → resources/
'이슈 & 트러블 슈팅' 카테고리의 다른 글
[이슈] JPA N+1 문제 해결 및 성능 비교 (feat. Batch Size) (1) | 2024.07.11 |
---|---|
[이슈] Redis 캐싱을 통해 조회 성능 개선하기 (0) | 2024.07.01 |
[이슈 & 트러블 슈팅] 동시성 보장하기 (feat. 비관적 락, Redis 분산 락) (3) | 2024.06.11 |
[이슈] 사용자의 중복 요청 방지하기(feat. 멱등키, Redis) (1) | 2024.06.07 |
[트러블 슈팅] 멀티 스레드 테스트 시 초기 데이터 오류(feat. 트랜잭션 격리 수준) (0) | 2024.06.06 |