Configuration Utilities

2025. 5. 5. 11:58High Level Programming Language/The Platform Environment

Properties (속성)

Properties은 키/값 쌍으로 관리되는 구성 값입니다. 각 쌍에서 키와 값은 모두 문자열(String) 입니다. 키는 값을 식별하고 검색하는 데 사용되며, 이는 변수 이름을 통해 변수 값을 조회하는 방식과 유사합니다. 예를 들어, 파일을 다운로드할 수 있는 애플리케이션은 마지막 다운로드에 사용된 디렉터리를 추적하기 위해 "download.lastDirectory"라는 이름의 속성을 사용할 수 있습니다.

Properties을 관리하려면 java.util.Properties 클래스의 인스턴스를 생성합니다. 이 클래스는 다음과 같은 메서드를 제공합니다:

  • 스트림으로부터 키/값 쌍을 Properties 객체에 로드
  • 키를 이용하여 값 검색
  • 키와 값 나열
  • 키에 대한 열거 수행
  • 속성을 스트림에 저장

스트림에 대한 소개는 Basic I/O 레슨의 I/O 스트림 섹션을 참조하세요.

Properties 클래스는 java.util.Hashtable을 확장합니다. Hashtable로부터 상속된 일부 메서드는 다음과 같은 작업을 지원합니다:

  • 특정 키 또는 값이 Properties 객체에 포함되어 있는지 테스트
  • 현재 키/값 쌍의 수 확인
  • 키와 해당 값을 제거
  • 새로운 키/값 쌍 추가
  • 값 또는 키에 대한 열거 수행
  • 키로부터 값 검색
  • 객체가 비어있는지 확인

보안 관련 고려사항: 속성에 대한 접근은 현재 Security Manager의 승인을 받아야 합니다. 이 섹션의 예제 코드들은 디폴트로 시큐리티 매니저가 없는 독립 실행형 애플리케이션을 기준으로 합니다. 동일한 코드가 애플릿(applet)에서 실행될 경우, 실행 중인 브라우저에 따라 작동하지 않을 수 있습니다. 애플릿의 보안 제한 사항에 대해서는 Java Applets 레슨의 "What Applets Can and Cannot Do"를 참조하세요.

System 클래스는 현재 실행 환경의 구성을 정의하는 Properties 객체를 유지합니다. 이에 대한 자세한 내용은 System Properties를 참고하세요. 이 절의 나머지 부분에서는 애플리케이션 구성을 관리하기 위해 속성을 사용하는 방법을 설명합니다.

Properties in the Application Life Cycle(애플리케이션 생명주기에서의 속성)

다음 그림은 일반적인 애플리케이션이 실행 중 속성 객체(Properties)를 통해 구성 데이터를 어떻게 관리하는지를 보여줍니다.

시작 시 (Starting Up)

첫 세 개의 작업은 애플리케이션이 시작될 때 발생합니다.
먼저, 애플리케이션은 잘 알려진 위치에서 디폴트 속성(default properties)을 읽어와 Properties 객체에 로드합니다. 일반적으로 디폴트 속성은 .class 파일 및 애플리케이션 리소스 파일들과 함께 디스크에 저장되어 있습니다.

다음으로, 애플리케이션은 또 다른 Properties 객체를 생성하고 이전 실행에서 저장된 속성들을 로드합니다. 많은 애플리케이션은 사용자 별로 속성을 저장하므로, 이 단계에서 로드되는 속성들은 보통 사용자 홈 디렉터리 내 특정 디렉터리에 위치합니다.
마지막으로, 애플리케이션은 디폴트 속성이전 실행에서 기억된 속성을 사용하여 초기화됩니다.

핵심은 일관성입니다. 애플리케이션은 속성을 항상 동일한 위치에서 로드 및 저장해야 다음 실행 시 이를 다시 찾을 수 있습니다.

실행 중 (Running)

애플리케이션이 실행되는 동안 사용자가 설정을 변경할 수 있으며, 속성 객체는 이러한 변경 사항을 반영하여 업데이트됩니다. 사용자의 변경 사항을 다음 세션에도 기억하고자 한다면, 반드시 속성을 저장해야 합니다.

종료 시 (Exiting)

애플리케이션이 종료되면, 속성들은 지정된 위치에 저장되며, 다음 실행 시 이를 다시 로드합니다.

 

Properties 객체 설정

아래의 Java 코드는 앞서 설명한 첫 두 단계를 수행합니다:
기본 속성 로드 및 기억된 속성 로드.

// 디폴트 속성 생성 및 로드
Properties defaultProps = new Properties();
FileInputStream in = new FileInputStream("defaultProperties");
defaultProps.load(in);
in.close();

// 디폴트 속성을 포함한 애플리케이션 속성 생성
Properties applicationProps = new Properties(defaultProps);

// 마지막 실행 시 저장된 속성 로드
in = new FileInputStream("appProperties");
applicationProps.load(in);
in.close();

먼저, 애플리케이션은 defaultProps라는 디폴트 속성 객체를 설정합니다. 이 객체는 다른 곳에서 명시적으로 설정되지 않은 경우 사용할 속성들을 포함합니다. load 메서드는 "defaultProperties" 파일에서 디폴트 값을 읽어옵니다.

그 다음, applicationProps라는 새로운 속성 객체를 생성하는데, 이 객체는 defaultProps를 기본 값으로 갖습니다. 이후, "appProperties" 파일에서 실제 실행 시 사용할 속성들을 읽어옵니다. 이 속성들은 마지막 실행에서 저장된 사용자 설정입니다.

 

속성 저장

아래 예제는 앞서 생성한 applicationProps 객체의 속성을 Properties.store 메서드를 이용하여 저장하는 방법입니다. 디폴트 속성은 변경되지 않으므로 매번 저장할 필요는 없습니다.

FileOutputStream out = new FileOutputStream("appProperties");
applicationProps.store(out, "---No Comment---");
out.close();

store 메서드는 출력 스트림과 함께 파일 상단에 삽입할 주석 문자열을 필요로 합니다.

 

속성 정보 가져오기

애플리케이션이 Properties 객체를 설정한 후, 다양한 키와 값에 대한 정보를 조회할 수 있습니다.
사용자가 설정한 값에 따라 애플리케이션을 초기화할 때 주로 사용됩니다. Properties 클래스는 다음과 같은 메서드를 제공합니다:

  • contains(Object value), containsKey(Object key)
    값이나 키가 속성 객체에 있는지 여부를 반환 (Hashtable에서 상속됨).
    항상 문자열(String) 을 사용하는 것이 권장됩니다.
  • getProperty(String key), getProperty(String key, String default)
    지정된 키에 대한 값을 반환. 키가 없으면 기본 값을 반환합니다.
  • list(PrintStream s), list(PrintWriter w)
    모든 속성을 지정된 출력 스트림 또는 라이터에 출력. 디버깅 시 유용합니다.
  • elements(), keys(), propertyNames()
    키 또는 값들의 열거(Enumeration)를 반환합니다.
    keys()는 현재 객체의 키만, propertyNames()는 디폴트 속성 키도 포함합니다.
  • stringPropertyNames()
    propertyNames()와 유사하지만 Set<String>을 반환하고, 키와 값이 모두 문자열인 경우만 포함합니다.
  • size()
    현재 키/값 쌍의 수를 반환합니다.

 

속성 설정

사용자가 애플리케이션을 사용하는 동안 설정을 변경할 수 있으며, 이러한 변경 사항은 Properties 객체에 반영되어야 하며, 종료 시 store() 메서드를 통해 저장됩니다.

  • setProperty(String key, String value)
    키/값 쌍을 속성 객체에 추가합니다.
  • remove(Object key)
    지정된 키와 연결된 키/값 쌍을 제거합니다.

주의:
위 메서드 중 일부는 Hashtable에 정의되어 있어 문자열 외의 인자도 허용하지만, 항상 String을 키와 값으로 사용할 것을 권장합니다.
또한, Hashtable.set 또는 Hashtable.setAllProperties 객체에 사용하지 말고, 반드시 Properties.setProperty를 사용할 것을 권장합니다.

 

출처: https://docs.oracle.com/javase/tutorial/essential/environment/properties.html

 

Properties (The Java™ Tutorials > Essential Java Classes > The Platform Environment)

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Dev.java for updated tutorials taking advantag

docs.oracle.com

 

Command-Line Arguments

Java 애플리케이션은 커맨드 라인에서 임의의 개수만큼 아규먼트를 받을 수 있습니다.
이를 통해 사용자는 애플리케이션 실행 시 구성 정보를 지정할 수 있습니다.

사용자는 애플리케이션을 실행할 때 커맨드 라인 아규먼트를 클래스 이름 뒤에 지정하여 입력합니다.
예를 들어, Sort라는 Java 애플리케이션이 파일 내 라인을 정렬한다고 가정합시다.
사용자가 friends.txt라는 파일의 데이터를 정렬하려면 다음과 같이 입력할 수 있습니다:

java Sort friends.txt

애플리케이션이 실행되면, 런타임 시스템은 커맨드라인 아규먼트를 main 메서드에 문자열(String) 배열로 전달합니다.
위의 예시에서는 커맨드라인 아규먼트는 "friends.txt" 하나로 구성된 배열로 Sort 애플리케이션에 전달됩니다.

 

커맨드 라인 아규먼트 출력하기 (Echoing Command-Line Arguments)

다음은 커맨드라인 아규먼트 각각을 한 라인에 하나씩 출력하는 Echo 예제입니다:

public class Echo {
    public static void main (String[] args) {
        for (String s : args) {
            System.out.println(s);
        }
    }
}

다음은 사용자가 Echo 프로그램을 실행하는 예입니다.
사용자 입력은 이탤릭체로 표시합니다:

java Echo *Drink Hot Java*
Drink  
Hot  
Java

애플리케이션이 각 단어(Drink, Hot, Java)를 각각 한 줄에 출력하는 것을 볼 수 있습니다.
이는 공백 문자(space)가 커맨드라인 아규먼트를 구분자로 사용되기 때문입니다.
만약 Drink Hot Java하나의 아규먼트로 처리하고 싶다면, 사용자는 이를 **큰따옴표(")**로 묶어야 합니다:

java Echo "Drink Hot Java"
Drink Hot Java

 

숫자 커맨드 라인 아규먼트 파싱하기 (Parsing Numeric Command-Line Arguments)

애플리케이션이 숫자 커맨드라인 아규먼트를 지원해야 할 경우,
숫자를 나타내는 문자열(예: "34")을 정수 값으로 변환해야 합니다.

다음은 커맨드라인 아규먼트를 정수형(int)으로 변환하는 코드 조각입니다:

int firstArg;
if (args.length > 0) {
    try {
        firstArg = Integer.parseInt(args[0]);
    } catch (NumberFormatException e) {
        System.err.println("Argument " + args[0] + " must be an integer.");
        System.exit(1);
    }
}

parseInt 메서드는 args[0]의 형식이 유효하지 않을 경우 NumberFormatException을 발생시킵니다.
모든 숫자 클래스(예: Integer, Float, Double 등)는 문자열을 해당 숫자 타입으로 변환하는
parseXXX 메서드를 가지고 있습니다.

 

출처: https://docs.oracle.com/javase/tutorial/essential/environment/cmdLineArgs.html

 

Command-Line Arguments (The Java™ Tutorials > Essential Java Classes > The Platform Environment)

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Dev.java for updated tutorials taking advantag

docs.oracle.com

 

환경 변수 (Environment Variables)

많은 운영 체제는 환경 변수를 사용하여 애플리케이션에 구성 정보를 전달합니다.
Java 플랫폼의 속성(Properties)과 마찬가지로, 환경 변수도 키/값 쌍으로 구성되어 있으며,
키와 값 모두 문자열입니다.

환경 변수를 설정하고 사용하는 방식은 운영 체제마다, 그리고 명령줄 인터프리터마다 다릅니다.
여러분의 시스템에서 애플리케이션에 환경 변수를 전달하는 방법을 알고 싶다면,
시스템 설명서를 참조하십시오.

 

환경 변수 질의 (Querying Environment Variables)

Java 플랫폼에서 애플리케이션은 System.getenv를 사용하여 환경 변수의 값을 조회할 수 있습니다.

인수를 제공하지 않으면, getenv는 읽기 전용의 java.util.Map 인스턴스를 반환합니다.
이 맵의 키는 환경 변수의 이름이며, 값은 환경 변수의 값입니다.
다음은 EnvMap 예제입니다:

import java.util.Map;

public class EnvMap {
    public static void main (String[] args) {
        Map<String, String> env = System.getenv();
        for (String envName : env.keySet()) {
            System.out.format("%s=%s%n",
                              envName,
                              env.get(envName));
        }
    }
}

문자열 인수를 제공하면, getenv는 해당 변수의 값을 반환합니다.
변수가 정의되어 있지 않으면 getenvnull을 반환합니다.
Env 예제는 명령줄에서 지정된 환경 변수를 질의하기 위해 이 방식으로 getenv를 사용합니다:

public class Env {
    public static void main (String[] args) {
        for (String env: args) {
            String value = System.getenv(env);
            if (value != null) {
                System.out.format("%s=%s%n",
                                  env, value);
            } else {
                System.out.format("%s is"
                    + " not assigned.%n", env);
            }
        }
    }
}

 

새로운 프로세스에 환경 변수 전달하기

(Passing Environment Variables to New Processes)

Java 애플리케이션이 ProcessBuilder 객체를 사용하여 새 프로세스를 생성할 경우,
기본적으로 새 프로세스에 전달되는 환경 변수 집합은
애플리케이션의 가상 머신 프로세스에 제공된 환경 변수 집합과 동일합니다.

애플리케이션은 ProcessBuilder.environment를 사용하여 이 집합을 변경할 수 있습니다.

 

플랫폼 종속성 문제

(Platform Dependency Issues)

환경 변수가 구현되는 방식은 시스템마다 미묘하게 다릅니다.
예를 들어, Windows는 환경 변수 이름의 대소문자를 구분하지 않지만,
UNIX는 대소문자를 구분합니다.

환경 변수를 사용하는 방식도 다를 수 있습니다.
예를 들어, Windows는 사용자 이름을 USERNAME이라는 환경 변수에 제공합니다.
반면 UNIX 계열 구현에서는 사용자 이름을 USER, LOGNAME, 또는 이 둘 다에 저장할 수 있습니다.

이식성을 극대화하기 위해, 동일한 값이 시스템 속성(System Property)으로도 제공된다면
환경 변수를 직접 참조하지 마십시오.

예를 들어, 운영 체제가 사용자 이름을 제공한다면,
그 값은 항상 시스템 속성 user.name에서 확인할 수 있습니다.

 

출처: https://docs.oracle.com/javase/tutorial/essential/environment/env.html

 

Environment Variables (The Java™ Tutorials > Essential Java Classes > The Platform Environment)

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Dev.java for updated tutorials taking advantag

docs.oracle.com

 

기타 구성 유틸리티(Other Configuration Utilities)

다음은 기타 구성 유틸리티에 대한 요약입니다.

  • Preferences API는 애플리케이션이 구성 데이터를 구현 의존적인 백업 저장소(backing store)에 저장하고 검색할 수 있도록 해줍니다.
    비동기 업데이트를 지원하며, 동일한 환경 설정(preferences) 집합이 여러 스레드나 심지어 여러 애플리케이션에 의해 안전하게 업데이트될 수 있습니다.
    자세한 내용은 [Preferences API 안내서(Preferences API Guide)]를 참조하십시오.
  • JAR 아카이브에 배포되는 애플리케이션은 **매니페스트(manifest)**를 사용하여 아카이브의 내용을 설명합니다.
    자세한 내용은 [JAR 파일로 프로그램 패키징하기(Packaging Programs in JAR Files)] 레슨을 참조하십시오.
  • Java Web Start 애플리케이션의 구성은 JNLP 파일에 포함되어 있습니다.
    자세한 내용은 [Java Web Start 레슨](Java Web Start lesson)을 참조하십시오.
  • Java Plug-in 애플릿의 구성은 부분적으로 웹 페이지에 애플릿을 삽입하는 데 사용된 HTML 태그에 의해 결정됩니다.
    애플릿 및 브라우저에 따라, 이러한 태그에는 <applet>, <object>, <embed>, <param>이 포함될 수 있습니다.
    자세한 내용은 [Java Applets 레슨](Java Applets lesson)을 참조하십시오.
  • java.util.ServiceLoader 클래스는 간단한 서비스 제공자(service provider) 기능을 제공합니다.
    서비스 제공자는 서비스의 구현체이며, 서비스는 잘 정의된 인터페이스 집합과 (일반적으로 추상적인) 클래스들로 구성됩니다.
    서비스 제공자의 클래스는 일반적으로 이러한 인터페이스를 구현하거나 클래스들을 서브클래싱(subclassing)합니다.
    서비스 제공자는 확장 메커니즘(The Extension Mechanism)을 통해 확장으로 설치할 수 있습니다.
    제공자는 또한 클래스 경로에 추가하거나, 다른 플랫폼 종속적인 방식으로도 사용 가능하게 만들 수 있습니다.

출처: https://docs.oracle.com/javase/tutorial/essential/environment/other.html

 

Other Configuration Utilities (The Java™ Tutorials > Essential Java Classes > The Platform Environment)

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Dev.java for updated tutorials taking advantag

docs.oracle.com