2025.04.30 - [Backend/Spring(이론)] - SpringBoot 프로젝트 외부 설정(1) 개념 및 활용 - OS 환경 변수
SpringBoot 프로젝트 외부 설정(1) 개념 및 활용 - OS 환경 변수
📌 목차 1. 외부 설정의 개념 2. 환경별 JAR 빌드의 문제점 3. 외부 설정 주입 방식4. 환경 변수 조회 및 설정 5. Java에서 환경 변수 사용하는 방법 6. 실무 적용 사례 및 한계 ">📌 목차1. 외부 설정의
pjs-world.tistory.com
1. 자바 시스템 속성의 개념
자바 시스템 속성(Java System Properties)은 JVM(Java Virtual Machine) 실행 시 전달할 수 있는 key-value 형식의 설정값으로, 해당 애플리케이션 내부에서만 유효하게 작동하는 구성 방식이다.
이는 운영체제 전역에 영향을 주지 않고, 특정 애플리케이션에 국한된 설정값을 동적으로 주입할 수 있다는 점에서 유용하다.
예를 들어, 다음과 같은 커맨드라인 실행 시 설정을 적용할 수 있다.
java -Durl=dev -jar app.jar // jar 실행 명령어
위 설정은 System.getProperty("url")을 통해 애플리케이션 코드에서 읽을 수 있으며, 이와 같은 방식은 주로 DB 접속 정보, 환경 전환, API 인증 키 등 민감하거나 환경에 따라 달라지는 설정에 널리 사용된다.
2. OS 환경 변수와의 차이점
자바 시스템 속성과 OS 환경 변수는 모두 외부 설정을 주입하는 수단이지만, 적용 범위와 접근 방식에서 아래와 같은 차이가 존재한다.
항목 | OS 환경 변수 | 자바 시스템 속성 |
적용 범위 | 시스템 전체 | JVM 인스턴스 단위 |
설정 방법 | OS에 등록 | JVM 실행 시 -D 옵션 |
코드 접근 | System.getenv() | System.getProperty() |
격리성 | 낮음 (전역 노출) | 높음 (로컬 JVM 제한) |
대표 용도 | 공통 환경 설정 | 애플리케이션별 구성 값 |
즉, 보안이나 격리성을 중시하는 상황에서는 자바 시스템 속성이 더 적합하다.
3. 기본 속성 확인 예제
자바는 실행 시 자체적으로 다양한 시스템 속성을 자동으로 로딩한다. 다음은 현재 JVM에 설정된 모든 시스템 속성을 출력하는 간단한 테스트 코드 예시이다.
테스트 코드 생성
예제 코드
import lombok.extern.slf4j.Slf4j;
import java.util.Properties;
@Slf4j
public class JavaSystemProperties {
public static void main(String[] args) {
Properties properties = System.getProperties();
for (Object key : properties.keySet()) {
log.info("properties {}={}", key, System.getProperty(String.valueOf(key)));
}
}
}
실행 결과
위 로그는 System.getProperties()를 통해 출력된 자바 시스템 속성이다.
대표적인 기본 속성은 다음과 같다.
속성명 | 설명 |
java.version | 자바 버전 (예: 17.0.10) |
java.vendor | 자바 배포사 정보 (Oracle Corporation) |
java.home | JDK 또는 JRE 설치 경로 |
java.class.path | 클래스 경로 (JAR 포함), 현재 프로젝트가 의존하는 모든 경로 |
java.library.path | 네이티브 라이브러리(JNI 등)를 찾는 경로 (.dll, .so) |
java.io.tmpdir | 임시 파일 저장 디렉토리 경로 |
java.vm.name | JVM 이름 (Java HotSpot(TM) 64-Bit Server VM) |
java.runtime.version | 런타임 상세 버전 (빌드 포함) |
java.specification.version | 자바 사양 버전 (예: 17) |
os.name | 운영체제 이름 (Windows 11) |
이처럼 시스템 속성을 통해 현재 실행 환경을 손쉽게 파악할 수 있다.
4. 사용자 정의 속성 설정 및 조회
사용자는 -Dkey=value 형식으로 JVM에 속성을 전달하고, 자바 코드에서는 System.getProperty("key")를 통해 이를 읽을 수 있다.
JVM 속성은 IDE 또는 배포 시 명령어를 통해 전달할 수 있으며, 아래 코드를 통해 속성 값을 조회할 수 있다.
조회 코드 추가
import lombok.extern.slf4j.Slf4j;
import java.util.Properties;
@Slf4j
public class JavaSystemProperties {
public static void main(String[] args) {
Properties prop = System.getProperties();
for (Object key : prop.keySet()) {
log.info("prop {}={}", key,
System.getProperty(String.valueOf(key)));
}
String url = System.getProperty("url");
String username = System.getProperty("username");
String password = System.getProperty("password");
log.info("url={}", url);
log.info("username={}", username);
log.info("password={}", password);
}
}
다음은 IDE를 통해 JVM 속성을 전달하는 방법이다.
IDE를 통해 JVM 속성 전달 (IntelliJ 기준)
상단 우측 메뉴 > Edit > Run/Debug Configurations 열기
Modify options > Add VM options > VM options에 다음 인수를 추가
-Durl=devdb -Dusername=dev_user -Dpassword=dev_pw
실행 결과
위 예시와 같이 IDE VM Option을 통해 속성값 전달이 가능하며, 다음은 jar 파일 배포시에 명령어로 전달하는 방식이다
jar 파일 배포시에 명령어로 전달하는 방식
조회 코드 작성
앞서 작성한 코드는 test 패키지 하위에 작성했으므로, jar 실행 후 main 메서드에서 조회하기 위해 main 패키지 하위에 다음 클래스를 추가
import lombok.extern.slf4j.Slf4j;
import java.util.Properties;
@Slf4j
public class JavaSystemProperties {
public static void print(){
Properties prop = System.getProperties();
for (Object key : prop.keySet()) {
log.info("prop {}={}", key,
System.getProperty(String.valueOf(key)));
}
String url = System.getProperty("url");
String username = System.getProperty("username");
String password = System.getProperty("password");
log.info("url={}", url);
log.info("username={}", username);
log.info("password={}", password);
}
}
main함수에서 호출
@SpringBootApplication
public class ExternalApplication {
public static void main(String[] args) {
SpringApplication.run(ExternalApplication.class, args);
JavaSystemProperties.print();
}
}
jar 파일 gradle 빌드
IDE 내, 또는 터미널을 열고 아래 명령어 입력 (윈도우 기준)
window
gradle clean build
jar 파일이 있는 위치로 이동 후, 아래 명령어를 입력
java -Durl=devdb -Dusername=dev_user -Dpassword=dev_pw -jar <jar 파일명>
참고로 -D 는 Define의 약자다.
실행 결과
5. 코드 내 설정 사용 시 유의점
자바는 실행 중에도 System.setProperty()를 사용하여 속성을 추가할 수 있다.
System.setProperty("env", "local");
String env = System.getProperty("env");
그러나 이 방식은 설정이 코드에 하드코딩되므로 외부 설정을 사용하는 본래 목적을 훼손하게 된다. 실무 환경에서는 가급적 외부에서 주입받는 구조로 유지하는 것이 권장된다.
6. 요약 및 마무리
자바 시스템 속성은 JVM 내에서만 유효한 설정값으로, 외부 설정의 유연성과 보안성을 동시에 확보할 수 있는 좋은 수단이다. -Dkey=value 방식은 설정의 명확성과 배포의 일관성을 보장하면서도, 코드 변경 없이 다양한 환경을 수용할 수 있게 해준다.
항목 | 설명 |
설정 대상 | DB 접속 정보, API Key, 환경 모드 등 |
설정 방법 | java -Dkey=value -jar app.jar |
접근 방식 | System.getProperty("key") |
장점 | 높은 격리성, 배포 유연성, 유지보수 효율 |
주의점 | JVM 내부에만 유효하므로 전역 공유 불가 |
'Backend > Spring(활용)' 카테고리의 다른 글
SpringBoot 외부설정(4) - 다양한 외부 설정 방법, 하나의 접근 방식 (Environment, PropertySource) (1) | 2025.05.02 |
---|---|
SpringBoot 외부 설정(3) - 커맨드 라인 옵션 인수 활용 방법 (2) | 2025.05.01 |
WAR 배포 방법과 Servlet 기반 Spring Web 프로젝트 구성 방법 (0) | 2025.04.13 |
Spring 기반 Quartz Scheduler 기본 예제 코드(2) - Quartz 설정 정보 (0) | 2025.04.04 |
Spring 기반 Quartz Scheduler 기본 예제 코드(1) - 구조적 설계와 흐름 설명 (0) | 2025.04.03 |