spring boot에서 파일에 설정 정보가 있는 경우에는 어떻게 읽어와야 할까요? 요구 사항은 아래와 같습니다.

 

 어떻게 하면 좋을까요? 요구 사항을 먼저 간단하게 분석해 봅시다.


 

 요구 사항에서 중요한 것은 크게 3가지입니다.

 

 프로그램은 properties 설정 파일 하나를 읽어서, db 접속 정보를 읽어내야 합니다. 그 외에 셋팅값 정보는 없다는 것이 중요합니다. 보통 host와 password, db를 읽어야 합니다. 이 3개가 있어야 접속을 할 수 있기 때문입니다. 단지, 접속 정보를 외부 파일로부터 읽어내는 것이 중요한데요. 외부 파일은 아래 위치에 있다고 해 봅시다.

 

 jo_test/spring/external_configure의 conf 폴더 밑에 app-prod.properties에 있다고 해 보겠습니다. 먼저, prefix를 같게 맞춰 줍시다. spring.db로요. 그러면, ConfigurationProperties에서 prefix를 옵션으로 줘서 처리할 수 있습니다.

 

 여기에는 host와 password, dbtable를 설정하였습니다. prefix가 spring.db입니다. 프로젝트를 jar 파일로 떨궈서, jar 파일을 실행시킬 때, app-prod.properties를 읽게 하는 것이 목표입니다. 머리를 잘 굴려 봅시다. 우리는 외부에 있는 파일을 읽어야 하는데요. 이것을 읽는 방법은 command line으로 읽으나, 내부에서 처리하나 별 상관이 없다는 것을 알 수 있어요. 먼저 spring.config.location은 커멘드 라인으로 처리해 줍시다.

 

 

 

커멘드 라인에서 사용하는 옵션인, spring.config.location은 문서에 설명이 되어 있습니다. 그리고 이 문서와 스택 오버플로우의 질답글을 보시면, cmd line은 구성 설정 파일을 override 한다고 되어 있습니다. 그리고 저는 jar 바깥에 있는 properties 파일을 읽어올 것이라는 것을 파악하시면 됩니다.

 

 

 즉, spring.config.location으로 외부 설정 properties를 가져와서 설정값을 읽습니다. 이것들은 prefix가 spring.db로 시작하니, spring.db로 시작하는 설정값들을 모두 읽어오게끔 설정 클래스에서 해 주면 됩니다. 설정 클래스 부터 만들어 보도록 하겠습니다.

 


 프로젝트 구조는 위와 같습니다.

 

 

 DemoApplication 클래스는 딱히 별 게 없습니다. 단지, ConfigurationPropertiesScan 어노테이션을 추가했을 뿐입니다.

 

 ConfigureSource도 사실 별 게 없습니다. ConstructorBinding도 별 게 없습니다. 단지, 생성자에서 처리하게끔 했을 뿐이고요. 4번째 줄에 있는 ConfigurationProperties의 prefix를 "spring.db"로 설정했을 뿐입니다.

 

 필드 명을 보실 필요가 있는데요. host, password, dbTable로 설정하였습니다. 이는 설정 파일에 있는 필드명을 보셔도 알 수 있습니다. 여기까지만 봐도 별 게 없어 보입니다. 정말 별 게 없어 보여요. 중요한 것은 sh 파일입니다.

 

 cho.sh를 보시면, java -jar 명령어가 있음을 볼 수 있어요. 그런데, 뒤에 --spring.config.location이 눈에 보이는데요. 이것의 의미는 spring.config.location의 값을 "conf/app-$env.properties"로 설정하라는 의미입니다. 그런데 $env는 env 값으로 대치 된다는 의미입니다. env 값이 prod였으니, conf 밑에 있는 app-prod.properties를 보면 되겠군요. 프로퍼티 값을 불러올 파일을 볼까요?

 

 

 파일에 있는 이 속성들을 로드한다는 의미가 되겠습니다.

 

 


 이제 프로젝트 내부에, db 접속 정보를 추가해 보겠습니다.

 

 그러면 어떻게 동작할까요?

 

 

 맨 밑에 chogh를 보시면 됩니다. jar 내부에 있었던 설정 값이 바깥에 있었던 설정 값에 의해 덮어 씌워졌음을 알 수 있어요. 이 점만 잘 파악하시면 될 듯 합니다. shell 파일을 기본적으로 다루실 수 있다면 편하게 설정하실 수 있습니다. 다음 시간에 계속 이어서 해 보겠습니다.