작성
·
4.3K
0
https://www.inflearn.com/questions/667899 의 질문과 유사한 문제가 해결되지 않아 재질문 드립니다.
현재 저의 개발환경은
os : mac
ide: vscode
springboot : 3.0.4
를 사용하고 있습니다.
개발환경과 테스트 환경을 분리하기 위해서, src/main/resource 와 src/test/resource 에 각각 application.properties 파일을 만들고, 내부에 spring.profiles.active=local
spring.profiles.active=test 라고 작성한 상태입니다. (강의와 동일하게 수행)
그런데, 실제 테스트 실행 시, 여전히 로그에는
The following 1 profile is active: "local" 이 나옵니다.
동일한 질문에 답글로 달려있는 @ActiveProfiles("test")를 class에 붙여 실행하게 되면, 로그는
The following 1 profile is active: "test"라고 나오지만, 그 외의 다른 설정(데이터베이스 설정)은 여전히 src/main/resource 에 있는 application.properties를 사용합니다.
혹시 문제를 해결할 수 있는 방법이 있으면 알려주시면 좋겠습니다. 부탁드립니다.
답변 2
2
안녕하세요, 세승님과 영한님이 이미 좋은 해결 방법을 올려주시긴 했지만, 위 방법으로 해결되지 않으신 분들과 공유하면 좋을 듯한 해결방법이 있어 살짝 댓글 남겨봅니다...!
영한님이 위에서 말씀해주신 두 단계를 진행했는데도 해결이 되지 않을 경우, application-test.properties파일의 첫 줄인 "spring.profiles.active=test"를 주석 처리하시고 다시 테스트해보세요.
저는 이 방법으로 해결되었습니다.
혹시라도 궁금하실 분들을 위해 덧붙여보자면, 아마 프로필이 중복되어 읽히며 나타난게 아닐까 추측해봅니다... 아래는 해당 로그입니다.
org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property 'spring.profiles.active' imported from location 'class path resource [application-test.properties]' is invalid in a profile specific resource [origin: class path resource [application-test.properties] - 1:24]
그럼 세승님, 영한님 감사드립니다. 다들 공부 화이팅합시당!
2
안녕하세요. 세승님
vscode를 사용하시는군요. IDE에서 application.properties 파일이 중복될 때 우선순위를 정확하게 잡지 못하는 문제로 보입니다.
src/test/resources/application-test.properties 파일을 만들고 여기에 test 관련 설정(src/test/resource/application.properties)을 넣어주세요.
테스트에 @ActiveProfiles("test")를 적용해주세요.
이렇게 하면 application-test.properties 파일을 높은 우선순위로 인식합니다.
만약 이 설정이 적용되지 않은다면 src/test 대신에 src/main 위치에 해당 파일을 만들어주세요.
src/main/resources/application-test.properties
감사합니다.
안녕하세요 영한님. 추가적으로 문제를 해결하던 중 예상되는 원인을 찾은 것 같아, 공유드립니다.
예상되는 원인은 vscode에서 자바 프로젝트를 테스트하기 위해 사용되는 "Test Runner for Java" 확장 프로그램입니다.
intelliJ에서는 내부적으로 테스트를 gradle에게 위임하여 테스트를 수행한다고 합니다.(default)
gradle은 테스트를 수행할 때, src/test/resources/application.properties를 사용하기 때문에, intelliJ에서는 아무런 문제가 없었던 것 같습니다.
vscode에도 "gradle for Java" 라는 확장 프로그램이 제공이 되서, 이 확장 프로그램을 이용하여 gradle에서 직접 test를 실행했더니, 강의 내용을 그대로 따라가도 문제가 발생하지 않았습니다.
이클립스에서도 동일한 문제가 발생하지만, Delegate to Gradle
라는 feature 를 적용하면, 문제 없이 테스트가 수행된다고 하네요.
정확한 이유가 맞을지는 모르겠지만, 스프링의 문제가 아니라, vscode만의 문제가 맞는 것 같습니다.
references:
https://github.com/microsoft/vscode-java-test/issues/1045
제가 설명해드린 방법은 IDE와 무관하게 잘 동작해야 할 것 같은데, 세승님 정리해주신 내용을 보니, IDE 동작에 좀 문제가 있는 듯 합니다.
내용도 잘 정리해주시고, 또 gradle for Java라는 대안도 찾아서 정리해주셔서 감사합니다^^
추가로 저는 가급적 IntelliJ를 사용하시기를 권장합니다. 자바 프로그램에 최적화 되어 있기도 하고, 향후 다양한 라이브러리들의 업데이트가 발생해도 최대한 잘 지원됩니다.
감사합니다.
안녕하세요 영한님. 항상 질문에 답변 달아주셔서 감사합니다.
위에 답글 달아주신 대로 시도를 해보았지만 전부 해결이 되지 않아서, 제가 시도해본 설정 조합을 모두 적어보려합니다 (VSCODE 기준, 글 맨 밑에 요약본 있습니다.)
src/main/resources/application.properties
src/test/resources/application.properties
@SpringBootTest 만 있는 경우 (강의에서 IntelliJ로 정상적으로 실행된 케이스)
- The following 1 profile is active: "local" + main의 database 설정 적용
src/main/resources/application.properties
src/test/resources/application-test.properties
@SpringBootTest 만 있는 경우
- 1번과 결과가 동일합니다.
src/main/resources/application.properties
src/test/resources/application.properties
@SpringBootTest + @ActiveProfiles("test") 인 경우
- The following 1 profile is active: "test" + main의 database 설정 적용.
즉, 로그만 profile이 test로 뜨고, 나머지 설정은 main 파일의 설정이 적용됌.
src/main/resources/application.properties
src/test/resources/application-test.properties
@SpringBootTest + @ActiveProfiles("test") 인 경우
- 아래와 같은 예외가 발생합니다.
Caused by: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property 'spring.profiles.active' imported from location 'class path resource [application-test.properties]' is invalid in a profile specific resource [origin: class path resource [application-test.properties] - 1:24]
classpath 기준으로 properties 파일을 읽어오다가 충돌이 난 것 같은데, 자세한 원인은 잘 모르겠습니다.
src/main/resources/application.properties
src/test/resources/application.properties
src/test/resources/application-test.properties
@SpringBootTest + @ActiveProfiles("test") 인 경우
- 4번과 동일한 예외가 발생합니다.
src/main/resources/application.properties
src/main/resources/application-test.properties
@SpringBootTest + @ActiveProfiles("test") 인 경우
- 4번과 동일한 예외가 발생합니다.
위의 테스트 결과를 요약하자면 다음과 같습니다.
@ActiveProfile("test") 가 테스트 코드의 클래스 레벨에 붙어있지 않는 경우에는,
모든 경우에서 src/main/resources/application.properties 의 설정을 그대로 사용하였습니다.
@ActiveProfile("test") 가 테스트 코드의 클래스 레벨에 붙어있는 경우에는,
테스트용 설정 파일의 이름이 application.properties 와 application-test.properties 중 어떤 것인가에 따라 결과가 달라졌습니다.
테스트용 설정 파일이름이 application.properties 인 경우,
디버그 콘솔의 로그에는 The following 1 profile is active: "test" 라고 뜨지만,
실제 데이터 베이스 연결은 main의 database 설정이 적용되어 연결되었습니다.
테스트용 설정 파일이름이 application-test.properties 인 경우,
InvalidConfigDataPropertyException 발생하며 ApplicationContext(스프링 컨테이너)를 load하는데 실패합니다.
스프링 부트에서 설정파일을 읽어오는 방식에 문제가 있는건지, vscode 단에서 <classpath 설정 + 테스트코드 실행시의 빌드 및 실행 커맨드> 의 문제가 있는건지 잘 모르겠습니다.
다만, 강의에서 사용하신 intelliJ는 이런 문제가 발생하지 않았기 때문에, 아마도 vscode 단의 문제일 확률이 99.9%... 겠죠? 추가적인 답변을 주시면 정말 감사할 것 같습니다..!