• [properties, env] 자바에서 시스템 환경변수 읽어오기
    언어/Kotlin 2024. 4. 20. 17:49
    반응형

     개발을 할 때, 시스템 환경변수를 읽어야 하는 경우는 두 가지가 있다. 첫 번째, 비밀번호 같은 보안이 필요한 값을 환경변수로 선언할 경우다. 두 번째, OS나 JVM 혹은 프레임워크가 기본적 설정한 환경변수나 시스템 프로퍼티(properties)를 사용할 경우다. 사용자의 홈 디렉토리(~/)등의 환경변수를 사용할 수 있다.

     

     자바에서 환경변수를 읽어오는 방법은 두 가지가 있다. System.getenv()System.getProperty()를 사용하는 방법이다. System.getenv()는 터미널에 설정된 환경변수값을 읽어올 수 있고, System.getProperty()는 JVM의 시스템 프로퍼티 값을 읽어올 수 있다.

     

    -----

    목차

    • 시스템 환경변수, 시스템 프로퍼티 용어정리
    • System.getenv()
    • IDE(IntelliJ)에서 신규 환경변수 읽기
    • System.getProperties()

    -----

     

     

    시스템 환경변수, 시스템 프로퍼티 용어 정리

    코드 실행 시, 외부환경의 값을 읽어들인다는 의미에서 시스템 환경변수(environment variable) 시스템 프로퍼티(propertie)는 동일하다. 하지만, 시스템 환경변수는 터미널이나 IDE에 설정하여 주입한 값을 의미한다. 시스템 프로퍼티는 JVM이 구동될 때 설정한 값을 의미한다.

     

     

    System.getenv()

    System.getenv()는 오버로딩된 두 가지 메서드가 있다. System.getenv() 메서드는 모든 환경변수를 가져온다. System.getenv(파라미터) 메서드는 파라미터에 해당하는 환경변수를 가져온다.

    public static java.util.Map<String,String> getenv() { ... }
    
    public static String getenv(String name) { ... }

     

     

    아래 코드를 돌려서 나오는 환경변수 값들은 터미널에서도 확인이 가능하다.

    System.getenv().forEach {
    	println("key: ${it.key} value: ${it.value}")
    }
    
    // 결과
    // key: PATH value: ...
    // key: PWD value: ...
    // key: HOME value: /Users/test
    // ...
    val evHome = System.getenv("HOME")
    println(evHome)
    
    // 결과
    // /Users/test

     

     

    위 코드에서 나온 HOME 환경변수를 터미널에서 echo를 하면, 동일한 값이 나온다.

    # HOME 환경변수 확인
    echo $HOME
    /Users/test

     

     

    그래서, 터미널 환경변수에 값을 추가해주면, 코드에서 사용할 수 있어야 하지만, IDE에서 한가지 설정을 해줘야 한다.

    # EV_TES라는 환경변수에 test_value값을 집어넣음.
    # ~/.zshrc 파일 맨아래줄에 export EV_TEST="test_value" 값 추가.
    vi ~/.zshrc
    
    # 환경변수 적용
    source ~/.zshrc
    
    # EV_TEST 환경변수 확인
    echo $EV_TEST
    test_value

     

     

     

    IDE(IntelliJ)에서 신규 환경변수 읽기

     

    실제 IDE에서는 터미널의 환경변수를 즉시 읽지 않기 때문에, 아래 코드를 돌려도 EV_TEST라는 환경변수는 확인할 수 없다.

    System.getenv().forEach {
    	println("key: ${it.key} value: ${it.value}")
    }
    
    // 결과
    // ...
    // 없음:::::::  key: EV_TEST value: test_value

     

     

    IDE를 완벽하게 종료하고, 재실행해야 추가된 환경변수 값을 읽어올 수 있다.

     

     참고로 IntelliJ 창을 모두 종료하면, Welcome to IntelliJ IDEA가 뜨는데 이 창까지 완벽하게 꺼야 세션이 종료되면서 새로운 환경변수를 읽어올 수 있다.

     

     

    다시 코드를 실행해보면, 환경변수를 확인해볼 수 있다.

    println(System.getenv("EV_TEST"))
    
    // 결과
    // test_value

     

     

    System.getProperties()

    시스템 프로퍼티 메서드는 복수형과 단수형으로 나눠져 있다. getProperties() 메서드는 모든 프로퍼티를 가져온다. getProperty(파라미터) 메서드는 파라미터의 프로퍼티 값을 읽어온다.

    public static Properties getProperties() { ... }
    
    public static String getProperty(String key) { ... }

     

     

    아래 코드를 돌려서 시스템 프로퍼티 값들을 확인할 수 있다.

    System.getProperties().forEach {
        println("key: ${it.key} value: ${it.value}")
    }
    
    // 결과
    // key: java.vm.specification.version value: 19
    // key: os.name value: Mac OS X
    // key: java.runtime.version value: 19.0.2+7
    // ...

     

    java 실행 옵션으로 "-D프로퍼티명=값"을 입력해주면 유저 프로퍼티(https://onestone-dev.tistory.com/73)도 추가할 수 있다.

     

     

     

    참고자료:

    https://docs.oracle.com/javase/8/docs/api/java/lang/System.html

    https://intellij-support.jetbrains.com/hc/en-us/community/posts/206230739-Refreshing-environment-variables

    반응형

    댓글

Designed by Tistory.