외부설정이란?
하나의 애플리케이션을 여러 다른 환경에서 사용해야 할 때를 위하여 Spring boot의 실행 or 빌드 시점에 외부에서 설정을 넣어줄 수 있다. 이를 외부 설정이라 한다.
그렇다면 애플리케이션 실행에 필요한 설정값을 외부에서 어떻게 주입할 수 있는 것일까?
외부 설정파일은 크게 아래와 같이 4개로 나눌 수 있다.
- OS 환경 변수: OS에서 지원하는 외부 설정 , OS에서 사용되는 모든 프로세스에 적용 가능하다.
- 자바 시스템 속성: 자바에서 지원하는 외부 설정, 해당 JVM안에서 사용
- 자바 커맨드 라인 인수: 커맨드 라인에서 실행시 main(args) 메서드에서 사용할 인자를 준다.
- 외부 파일(설정 데이터): 프로그램 외부의 파일을 읽어 사용 (application.properties)
1. OS 환경변수
OS 환경변수는 key , value 타입으로 관리된다.
자바코드에서 System.getenv(); 메서드를 통해 OS 환경 변수를 받아올수있다.
아래 코드는 OS 환경변수를 확인해보는 코드이다.
@Slf4j
public class OsEnv {
public static void main(String[] args) {
Map<String, String> getenv = System.getenv();
for (String s : getenv.keySet()) {
log.info("env {} : {}", s, getenv.get(s));
}
}
}
결과
2. 자바 시스템 속성
Add VM option에 -D{key}={value} 형식으로 옵션을 주면 해당 설정 값을 받아올 수 있다.
자바 시스템 속성 설정
자바 시스템 속성 로그 찍는 코드
@Slf4j
public class JavaSystemProperties {
public static void main(String[] args) {
Properties properties = System.getProperties();
for (Object o : properties.keySet()) {
log.info("property:{}={}", o, System.getProperty(String.valueOf(o)));
}
String url = System.getProperty("url");
String username = System.getProperty("username");
String password = System.getProperty("password");
log.info("url:{} , username:{} , password:{}", url, username, password);
}
}
로그 결과 일부
3. 커맨드 라인
커맨드 라인 옵션인수는 main 메서드가 실행될때 인자로 받는 String[] args 에 값을 주어 설정하는 방법이다.
해당 방식은 위 두 방식과 다르게 key value 가 아닌 " " 공백을 기준의 배열로 값을 받는다.
@Slf4j
public class CommendLineV1 {
//커멘드 옵션에 공백을 구분자로 한 args 인자값 부여
public static void main(String[] args) {
for (String arg : args) {
log.info("arg = {}", arg);
}
}
}
공백 기준의 배열로 값을 받아오는 방식인 커맨드라인 방식을 key value 형태로 받기 위해 스프링에서는 커맨드 라인 옵션인수라는 표준을 만들었다. --key=value 형식으로 사용한다.
4. 커맨드라인 옵션 인수
인수 설정 시 --key=value 형식으로 설정, 같은 key값에 2개의 value를 넣을 수 있다.
결과 값
그렇다면 이렇게 많은, 그리고 각기 다른 방식의 외부 설정값 주입 방법을 스프링은 어떤 방법으로 받아 사용할까??
바로 Environment라는 클래스를 통해 추상화 하여 특정 설정에 종속되지 않고 key=value 값으로 설정값을 받아올 수 있도록 하였다. 같은 key 값의 설정을 여러 외부 설정에서 동시에 했을 시 우선순위에 의하여 설정값을 설정한다.
계속...
Reference : 김영한 - 스프링 부트 - 핵심 원리와 활용 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%ED%95%B5%EC%8B%AC%EC%9B%90%EB%A6%AC-%ED%99%9C%EC%9A%A9/dashboard
스프링 부트 - 핵심 원리와 활용 | 김영한 - 인프런
김영한 | 실무에 필요한 스프링 부트는 이 강의 하나로 모두 정리해드립니다., 백엔드 개발자를 위한 스프링 부트 끝판왕! 실무에 필요한 내용을 모두 담았습니다. [임베딩 영상] 김영한의 스
www.inflearn.com
'Spring' 카테고리의 다른 글
배포 서버 ClassNotFoundException 트러블 슈팅 (0) | 2024.05.02 |
---|---|
커스텀 익셉션 적용 (0) | 2024.04.28 |
Spring boot 의 내장 톰캣 (0) | 2024.04.21 |
서블릿 컨테이너, 애플리케이션 초기화 (1) | 2024.04.20 |
공공데이터 Springboot로 파싱 (0) | 2024.04.13 |