Java에서는 System.getProperty()와 System.getenv()라는 두 가지 메서드를 제공합니다.
이 둘은 이름은 비슷하지만 접근하는 자원과 용도가 명확히 다릅니다.
이번 글에서는 두 메서드의 차이점과 함께 각각의 사용 예시를 소개하며 자세히 설명해보겠습니다.
시스템 프로퍼티와 환경변수란?
시스템 프로퍼티 : JVM 내부에서 사용하는 키/값 형태의 설정 정보
환경 변수 : 운영체제 수순에서 관리하는 키/값 형태의 설정정보
System.getProperty()
Java 플랫폼은 Properties 객체를 사용하여 로컬 시스템과 설정에 대한 정보를 제공합니다. 이를 시스템 프로퍼티(System Properties) 라고 부릅니다. 시스템 프로퍼티는 주로 JVM 관련 설정을 지정할때 사용이 됩니다. 사용자 디렉토리, JVM 버전같은 JAVA 고유의 설정값을 활용하는데 사용됩니다.
String osArch = System.getProperty("os.arch");
String osName = System.getProperty("os.name");
String osVersion = System.getProperty("os.version");
String fileSep = System.getProperty("file.separator");
System.out.println("operating system name: "+ osName);
System.out.println("operating system arch: "+ osArch);
System.out.println("Operation System version: "+ osVersion);
System.out.println("file separator: "+ fileSep);

우리는 프로퍼티의 값을 런타임 시간에 변경할 수 있습니다. 아래와 같은 방법으로 가능합니다.
System.setProperty("nice.tech.site","Tistory");
java -jar app.jar -DpropertyName=value
그렇다면 System.getenv()는 무엇일까요?
System.getenv()
운영체제 수준에서 관리되는 키/값 쌍의 환경 변수입니다. 주로 외부 서비스 및 바이너리 경로 같은 애플리케이션 설정 또는 시스템 설정을 지정하는데 사용됩니다. 환경변수는 JVM 외부에서 전역으로 설정되는것이 일반적입니다.
String homeDir = System.getenv("HOME");
String shell = System.getenv("SHELL");
String terminal = System.getenv("TERM");
System.out.printf("User Home: %s%n", homeDir);
System.out.printf("Shell: %s%n", shell);
System.out.printf("Terminal: %s%n", terminal);
System.getenv()가 반환하는 Map은 읽기 전용이라는 점을 주의해야 합니다.
이 Map에 값을 추가하려고 하면 UnsupportedOperationException이 발생합니다:
일반적으로 JAVA 애플리케이션은 런타임중에 환경 변수를 설정하지는 않습니다. 하지만 만약 필요한 경우, Reflection API 사용등의 방법으로 설정을 할 수 있습니다.
시스템 프로퍼티 (System properties)VS 환경 변수 (Environment variables)
| 범위(Scope) | JVM(자바 가상 머신) 내부에 한정됨 | 운영체제(OS) 전체 수준 |
| 생성 방법(Creation) | JVM 설정에서 생성하거나, -Dkey=value 형태로 커맨드라인에서 설정하거나, 실행 중에 System.setProperty()를 통해 설정 가능 | 주로 시스템 초기화나 설정 스크립트를 통해 운영체제에서 정의 (또는 ProcessBuilder API를 이용해 새로운 프로세스 시작 시 프로그래밍적으로 정의 가능) |
| 변경 가능 여부(Mutability) | 실행 중에 System.setProperty()를 통해 수정 가능 | 읽기 전용. 실행 중에 수정할 수 없음 |
'WEB' 카테고리의 다른 글
| Prometheus란? (3) | 2025.01.03 |
|---|---|
| POLLING (2) | 2024.11.11 |