
자바 애플리케이션 개발 시 외부 설정을 읽을 수 있는 다양한 방법이 존재한다.
이 글에서는 OS 환경 변수, JVM 시스템 속성, 커맨드 라인 인수, 그리고 커맨드 라인 옵션 인수(스프링부트)를 통해 설정값을 전달하는 방법을 자세히 알아보겠다.
1. OS 환경변수
OS 환경 변수는 운영체제에서 설정된 전역적인 값이다. 이러한 환경 변수는 다양한 프로그램에서 활용될 수 있다.
1.1 터미널에서 환경 변수 조회
Mac/Linux에서 터미널로 조회
printenv
또는 env
명령어를 사용하면 현재 시스템에 설정된 환경 변수를 확인할 수 있다.
printenv
Windows에서 환경 변수 조회
명령 프롬프트에서 다음 명령어를 실행한다.
set
1.2 자바 코드에서 환경 변수 조회
자바에서는 System.getenv()
를 통해 OS 환경 변수를 조회할 수 있다.
import java.util.Map;
public class OsEnv {
public static void main(String[] args) {
Map<String, String> envMap = System.getenv();
for (String key : envMap.keySet()) {
System.out.println("Environment Variable: " + key + "=" + envMap.get(key));
}
}
}
// 예시 결과
//Environment Variable: JAVA_HOME=/usr/lib/jvm/java-17-openjdk
//Environment Variable: PATH=/usr/bin:/bin:/usr/sbin
//Environment Variable: HOME=/home/user
// ...
1.3 IntelliJ에서 환경 변수 추가하기
IntelliJ IDEA에서는 Run Configurations를 통해 환경 변수를 추가할 수 있다.
- Edit Configurations로 이동
- Environment Variables 항목을 클릭한 뒤 KEY=VALUE 형식으로 값을 추가
- 없다면
Modify Options
을 클릭해서Environment Variables
클릭
1.4 특징과 사용 시 주의사항
- 전역 설정: OS 환경 변수는 시스템 전체에서 접근할 수 있다.
- 우선순위: OS 환경 변수는 다른 설정값(예: 파일, JVM 속성)보다 우선순위가 낮은 편이다.
- 보안: 중요한 값(예: 비밀번호)은 OS 환경 변수로 설정하는 것을 피해야 한다.
2. 자바 시스템 속성
자바 시스템 속성은 JVM에서 전달된 설정값으로, 애플리케이션 실행 중에만 유효하다.
2.1 자바 시스템 속성 조회 방법
System.getProperties()
를 통해 JVM 시스템 속성을 조회할 수 있다.
import java.util.Properties;
public class JavaSystemProperties {
public static void main(String[] args) {
Properties properties = System.getProperties();
for (Object key : properties.keySet()) {
System.out.println("Property: " + key + "=" + System.getProperty(key.toString()));
}
}
}
/*
실행결과 예시
Property: java.version=17.0.10
Property: os.name=Mac OS X
Property: user.dir=/myapp
...
*/
2.2 시스템 속성 설정 방법
1. 터미널에서 JVM 실행 옵션으로 설정하기
JAR 파일 실행 시 -D 옵션을 사용해 시스템 속성을 추가할 수 있다.
java -DcustomKey=customValue -jar app.jar
- 위 예제에서 customKey는 시스템 속성의 키, customValue는 값이다.
- D는 Define의 약자이다.
2. IntelliJ에서 설정하기
- Run Configurations → VM Options 항목을 선택
- -Dkey=value` 형식으로 값을 추가
- 안보이면 Modify options 클릭해서 Add VM Options 클릭
3. 코드로 시스템 속성 추가
애플리케이션 코드 내에서 시스템 속성을 추가할 수도 있다.
public class JavaSystemProperties {
public static void main(String[] args) {
System.setProperty("propertyName", "propertyValue");
String value = System.getProperty("propertyName");
System.out.println("Property value: " + value);
}
}
2.3 특징과 사용 시 주의사항
- JVM 레벨: 시스템 속성은 JVM이 실행되는 동안만 유지
- 우선순위: OS 환경 변수보다 우선 적용
- 유연성: JVM 실행 시 값만 전달하면 됨
3. 커맨드 라인 인수
커맨드 라인 인수는 main(String[] args)
메서드를 통해 애플리케이션에 전달된다.
3.1 커맨드 라인 인수 조회 방법
args
배열을 사용해 전달된 인수를 읽어온다.
public class CommandLineExample {
public static void main(String[] args) {
for (String arg : args) {
System.out.println("Argument: " + arg);
}
}
}
/*
* 결과 예시
* Argument: arg1
* Argument: arg2
*/
3.2 커맨드 라인 인수 설정 방법
1. 터미널에서 설정하기
JAR 파일 실행 시 맨 뒤에 추가
java -jar app.jar arg1 arg2
2. IntelliJ에서 커맨드 라인 인수 추가
- Edit Configurations를 클릭
Program Arguments
에 인수를 공백으로 구분해 입력 (예:arg1 arg2
)
3.3 표현의 한계
커맨드 라인 인수는 단순 문자열 리스트이다.
그렇기 때문에 key=value와 같은 형식은 직접 파싱해야 사용해야한다.
스프링 부트에서는 이 부분을 --key=value
형식으로 처리하는 방법을 만들어뒀다.
4. 커맨드 라인 옵션 인수 (스프링 부트)
스프링 부트에서는 --key=value
형식을 통해 설정값을 전달하고 쉽게 처리할 수 있다.
4.1 커맨드 라인 옵션 인수 조회 방법
스프링 부트에서는 ApplicationArguments
인터페이스를 통해 명령줄 옵션 인수를 관리한다.
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.DefaultApplicationArguments;
@Slf4j
public class CommandLineSpringBoot {
public static void main(String[] args) {
for (String arg : args) {
log.info("arg {}", arg);
}
ApplicationArguments appArgs = new DefaultApplicationArguments(args);
log.info("SourceArgs = {}", List.of(appArgs.getSourceArgs()));
log.info("NonOptionArgs = {}", appArgs.getNonOptionArgs());
log.info("OptionNames = {}", appArgs.getOptionNames());
Set<String> optionNames = appArgs.getOptionNames();
for (String optionName : optionNames) {
log.info("option name {}={} ", optionName, appArgs.getOptionValues(optionName));
}
}
}
/*
커맨드 라인 인수 : --hello --name=gildong --name=haha mode=on
22:59:58.336 [main] INFO hello.CommandLineV2 - arg --hello
22:59:58.337 [main] INFO hello.CommandLineV2 - arg --name=gildong
22:59:58.337 [main] INFO hello.CommandLineV2 - arg --name=haha
22:59:58.337 [main] INFO hello.CommandLineV2 - arg mode=on
22:59:58.343 [main] INFO hello.CommandLineV2 - SourceArgs = [--hello, --name=gildong, --name=haha, mode=on]
22:59:58.343 [main] INFO hello.CommandLineV2 - NonOptionArgs = [mode=on]
22:59:58.343 [main] INFO hello.CommandLineV2 - OptionNames = [name, hello]
22:59:58.343 [main] INFO hello.CommandLineV2 - option name name=[gildong, haha]
22:59:58.343 [main] INFO hello.CommandLineV2 - option name hello=[]
*/
4.2 커맨드 라인 옵션 인수 설정 방법
1. 터미널에서 설정하기
JAR 파일 실행 시 맨 뒤에 추가
java -jar app.jar --key1=value1 --key2=value2 --flag
2. IntelliJ에서 커맨드 라인 인수 추가
- Edit Configurations를 클릭
Program Arguments
에 인수를 공백으로 구분해 입력 (예:--key1=value1 --key2=value2 --flag
)
5. 정리
값 설정 방식 | 접근 방법 | 우선 순위 |
OS 환경 변수 | System.getenv() | 3 |
시스템 속성 | System.getProperty() | 2 |
커맨드 라인 (옵션) 인수 | main(String[] args) or ApplicationArguments (부트) | 1 |
참고 : 우선순위 스프링 공식 문서
다음 글에서는 이 설정 방법들을 스프링에서 어떻게 통합해서 관리하는지 알아보겠다.
'Backend > Spring' 카테고리의 다른 글
BeanFactory와 ApplicationContext (0) | 2024.12.28 |
---|---|
서블릿 컨테이너 초기화와 스프링의 처리 방식 (0) | 2024.12.27 |
4부: @ConfigurationProperties으로 타입 안전하게 외부 설정 관리 (0) | 2024.12.23 |
3부: 스프링 레거시와 스프링부트의 외부 설정 (1) | 2024.12.21 |
2부: 스프링 외부 설정 통합 관리 : Environment와 PropertySource의 동작 구조 (1) | 2024.12.19 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!