반응형

개발 시에 테스트 환경을 분리하기 위해서 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/

반응형
BE_성하