인프런 커뮤니티 질문&답변

세승님의 프로필 이미지
세승

작성한 질문수

스프링 DB 2편 - 데이터 접근 활용 기술

테스트 - 데이터베이스 분리

src/test 의 application.properties 문제

작성

·

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 파일이 중복될 때 우선순위를 정확하게 잡지 못하는 문제로 보입니다.

 

  1. src/test/resources/application-test.properties 파일을 만들고 여기에 test 관련 설정(src/test/resource/application.properties)을 넣어주세요.

  2. 테스트에 @ActiveProfiles("test")를 적용해주세요.

이렇게 하면 application-test.properties 파일을 높은 우선순위로 인식합니다.

만약 이 설정이 적용되지 않은다면 src/test 대신에 src/main 위치에 해당 파일을 만들어주세요.

src/main/resources/application-test.properties

감사합니다.

세승님의 프로필 이미지
세승
질문자

안녕하세요 영한님. 항상 질문에 답변 달아주셔서 감사합니다.
위에 답글 달아주신 대로 시도를 해보았지만 전부 해결이 되지 않아서, 제가 시도해본 설정 조합을 모두 적어보려합니다 (VSCODE 기준, 글 맨 밑에 요약본 있습니다.)

 

  1. src/main/resources/application.properties
    src/test/resources/application.properties
    @SpringBootTest 만 있는 경우 (강의에서 IntelliJ로 정상적으로 실행된 케이스)
    - The following 1 profile is active: "local" + main의 database 설정 적용

  2. src/main/resources/application.properties
    src/test/resources/application-test.properties
    @SpringBootTest 만 있는 경우

    - 1번과 결과가 동일합니다.

  3. 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 파일의 설정이 적용됌.

  4. 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 파일을 읽어오다가 충돌이 난 것 같은데, 자세한 원인은 잘 모르겠습니다.

  5. src/main/resources/application.properties
    src/test/resources/application.properties
    src/test/resources/application-test.properties
    @SpringBootTest + @ActiveProfiles("test") 인 경우
    - 4번과 동일한 예외가 발생합니다.

  6. src/main/resources/application.properties
    src/main/resources/application-test.properties
    @SpringBootTest + @ActiveProfiles("test") 인 경우

    - 4번과 동일한 예외가 발생합니다.

     

위의 테스트 결과를 요약하자면 다음과 같습니다.

  1. @ActiveProfile("test") 가 테스트 코드의 클래스 레벨에 붙어있지 않는 경우에는,
    모든 경우에서 src/main/resources/application.properties 의 설정을 그대로 사용하였습니다.

  2. @ActiveProfile("test") 가 테스트 코드의 클래스 레벨에 붙어있는 경우에는,
    테스트용 설정 파일의 이름이 application.propertiesapplication-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%... 겠죠? 추가적인 답변을 주시면 정말 감사할 것 같습니다..!

 

세승님의 프로필 이미지
세승
질문자

안녕하세요 영한님. 추가적으로 문제를 해결하던 중 예상되는 원인을 찾은 것 같아, 공유드립니다.

예상되는 원인은 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를 사용하시기를 권장합니다. 자바 프로그램에 최적화 되어 있기도 하고, 향후 다양한 라이브러리들의 업데이트가 발생해도 최대한 잘 지원됩니다.

감사합니다.

세승님의 프로필 이미지
세승

작성한 질문수

질문하기