• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

Environment#getProperty() 호출 시 application.properties의 요소보다 systemEnvironment의 요소를 우선적으로 읽는 문제

23.10.23 23:46 작성 23.10.23 23:47 수정 조회수 526

0

[문제 상황]

Environment 스프링 빈 객체 env가 있습니다.

env.getProperty("username"); 호출 시 "admin"이 출력됩니다.

이는 application.properties에서 지정하지 않은 값입니다.

 

디버그 모드로 찾아본 결과 Environment 객체가 application.properties 파일보다 systemEnvironment에 저장된 값을 더 우선적으로 가져오는 것 같습니다. - 아래 사진 참고

application.properties 파일

url=local.db.com
username=local_user
password=local_pw
#---
spring.config.activate.on-profile=dev
url=dev.db.com
username=dev_user
password=dev_pw
#---
spring.config.activate.on-profile=prod
url=prod.db.com
username=prod_user
password=prod_pw

 

Environment#getProperty("username");

실행 결과

 

[질문]

  1. systemEnvironment는 어디에 저장된 값인가요.

  2. systemEnvironment보다 application.properties가 더 좁은 범위니까 더 우선순위가 높아야 되는 거 아닌가요? systemEnvironment가 우선적으로 읽힌 원인(원리)이(가) 궁금합니다.

  3. 어떻게 해야 application.properties 파일의 값을 제대로 읽을 수 있나요.

 

답변 2

·

답변을 작성해보세요.

0

안녕하세요. 오종화님 AI 인턴이 잘 설명해주었는데요.

환경 변수에 아마도 username, USERNAME 등으로 입력이 되어 있는 것 같아요.

이 부분을 확인해보셔야 합니다.

감사합니다.

오종화님의 프로필

오종화

질문자

2023.10.29

바로 다음 강의에서 설명이 나오네요ㅋㅋ 답변 감사합니다!

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.10.25

안녕하세요 오종화님, 인프런 AI 인턴이에요.

  1. systemEnvironment는 운영 체제 환경 변수를 가리키는 것입니다. 운영 체제에서 설정한 환경 변수들은 systemEnvironment에 저장되어 있습니다.

  2. 스프링은 프로퍼티 값을 찾을 때 다음과 같은 우선순위를 가집니다.

    1. 환경 변수 (systemEnvironment)
    2. JVM 시스템 프로퍼티
    3. application.properties 파일에 있는 값
    4. application.yml 파일에 있는 값

따라서 systemEnvironmentapplication.properties보다 우선순위를 가지며, 같은 키값으로 값을 설정한 경우 systemEnvironment의 값이 결과로 반환됩니다.

  1. application.properties 파일의 값을 정상적으로 읽기 위해서는 application.properties 파일의 위치를 올바르게 설정해야 합니다. 스프링 부트의 기본 설정에 따르면, src/main/resources/application.properties에 파일을 위치시키면 됩니다. 또한, 스프링 부트가 자동으로 application.properties 파일을 읽어오도록 설정되어 있어야 합니다. 프로젝트의 구성에 따라 추가적인 설정이 필요할 수도 있으니 참고해주세요.

좋은 하루 되세요!