지난 포스팅에서 Application이 외부설정을 가져오는 3가지 방법을 알아보았다. Application은 OS의 환경변수, JVM의 VM옵션 그리고 CommandLine에서 외부의 설정을 넘겨받을 수 있다. 외부 설정의 개수가 적으면 3가지 방식이 유용하지만 설정의 개수가 많으면 외부에 파일을 하나 두고 관리하는 것이 좋다.
1) 외부설정파일
Application 내부가 아닌 외부에 파일을 생성해보자. (MacOS 기준 설명입니다.)
application.properties
url=dev.db.com
name=dev_user
key=value 형식을 지켜서 작성한다.
SpringBoot 프로젝트는 실행가능한 jar로 압축되는데, 해당 jar와 동일한 위치에 외부설정파일을 위치시킨다. jar를 실행하면 Spring은 자동으로 외부에 있는 설정파일을 읽는다.
@Slf4j
@Component
public class EnviromentCheck {
private final Environment env;
public EnviromentCheck(Environment env) {
this.env = env;
}
@PostConstruct //의존성 주입이 이루어진 후, 수행되는 메소드 지정하는 어노테이션
public void init(){
String url = env.getProperty("url");
String name = env.getProperty("name");
log.info("url = {}",url);
log.info("name = {}",name);
}
}
Enviroment 는 Spring이 자동으로 생성하는 Bean객체이다. Enviroment는 여러 환경의 설정에 접근하여 설정정보를 가져온다. Enviroment 객체는 다양한 환경의 설정을 동일한 방법으로 가져올 수 있도록 추상화되어 있다. 그럼에도 OS의 환경변수, JVM의 VM옵션, CommandLine보다 파일(application.properties)로 구성된 설정이 우선순위가 높다.
EnviromentCheck 객체가 Bean으로 등록될 때의 로그를 확인해보자.
명령어 : java -jar [ 실행할 jar ]
위 사진과 같이, url과 name의 값을 application.properties에서 가져왔음을 확인할 수 있다.
2) 내부설정파일
외부설정파일은 프로퍼티파일이 jar 밖에 있었다. 프로퍼티파일을 jar 안에 생성할 수 있다.
resources 폴더 아래에 프로퍼티파일을 생성하면 된다.
application.yml도 가능하다.
application.properties
url=dev.db.com
name=dev_user
빌드를 다시 하고 재실행 해보았다.
외부설정파일을 제거하고 실행하였음에도 내부설정파일에서 설정을 읽어와 설정정보를 잘 출력함을 확인할 수 있다. 그럼 내부와 외부파일에 중복된 설정이 있다면, Spring은 어떤 파일의 설정을 우선으로 읽을까?
실행결과를 확인하면 name의 값으로 outer_properties가 출력됨을 확인할 수 있다. 내부보다는 외부설정파일이 우선순위가 더 높다.
설정파일은 설정이 여러 개일 때 사용하면 편리하다. 설정파일은 jar파일 외부에도 내부에도 생성할 수 있는데 jar와 설정파일을 어떻게 관리하는지에 따라 환경에 맞게 사용하면 된다. 다음 포스팅에서는 여러 설정 파일 중 하나를 선택하는 방법인 '프로필(profile)'에 대해서 알아보겠다.
참고자료
'SPRING > Spring Boot' 카테고리의 다른 글
[SpringBoot] 외부설정 가져오기(2) - @Value (0) | 2023.05.07 |
---|---|
[SpringBoot] Profile 사용하기 (0) | 2023.05.07 |
[SpringBoot] 외부설정 가져오기(1) - Enviroment (0) | 2023.05.05 |
[SpringBoot] SpringBoot 자동구성 원리 (4) | 2023.05.04 |
[SpringBoot] 자동구성 라이브러리 만들기 (0) | 2023.04.29 |