본문 바로가기
Infra

[OS] 환경변수란 무엇인가 (LD_LIBRARY_PATH, Djava.library.path)

by 윾수 2025. 5. 14.

✅ 환경변수(Enviroment Variable) 란 무엇인가?

운영체제에서 환경변수는 시스템이나 쉘(Shell)이 프로세스의 동작을 제어하기 위해 전역 설정 값이다.

이 값들은 Key=Value 형태로 구성, 주로 경로 설정, 동작 제어, 참조영역, 기본값 설정 등의 용도로 사용된다.

OS의 전반적인 동작에 영향을 주며, 개별 프로세스들이 어떤 경로에서 파일을 찾을지도 결정짓는다.


✅ 대표적인 환경변수의 이름과 용도

예시 환경변수 용도 설명
PATH 실행 파일 위치 지정 명령어 입력 시 탐색할 디렉토리 지정
운영체제별 상이 동적 라이브러리 경로 지정 (so, dll)확장자와 같은 동적 라이브러리 참조 경로
LANG, TZ 언어 / 시간대 설정 로케일, 언어, 시간대 기본값 설정

 

👉 리눅스의 경우

주로 ~/.bash_profile, ~/.zshrc, ~/.vimrc 등의 설정 파일에 설정을 하게 되며,

env와 같은 명령어로 확인 가능하다.

🙏🙏🙏 ssh 재접속 하거나, source 명령어로 설정파일 다시 읽어야 적용됨!!! 🙏🙏🙏

(bash_profile 파일 중)
#!/bin/sh
# 신규 환경변수 설정
export NAS=/NAS/kys/storage1

# 기존 환경변수에 값 추가
export NAS=/NAS/kys/storage1:$NAS

✅ OS별 동적 라이브러리 환경변수

운영체제 라이브러리 경로 환경 변수 설명
Linux LD_LIBRARY_PATH .so 파일 경로
Solaris LD_LIBRARY_PATH .a 파일 포함 공유 라이브러리 경로
hp-ux (IA-64) LD_LIBRARY_PATH 최신 HP-UX 시스템 파일 경로
hp-ux(PA-RISC) SHLIB_PATH 구형 HP-UX 시스템 파일 경로
AIX LIBPATH Linux와 유사
Windows PATH .dll 파일 경로
macOS DYLD_LIBRARY_PATH -
#!/bin/sh
#(Linux - .bash_profile 이라고 가정)
#/home/kys/lib/native_module.so를 사용해야한다고 가정
export LD_LIBRARY_PATH=/home/kys/lib

$ > source ~/.bash_profile
/** 
 * ✅ 네이티브 라이브러리 확장자
 * | 운영체제 | 확장자 | 예시           |
 * |----------|--------|----------------|
 * | Windows  | .dll   | mylib.dll      |
 * | Linux    | .so    | libmylib.so    |
 * | macOS    | .dylib | libmylib.dylib |
 * | AIX      | .a     | libmylib.a     |
 * | HP-UX    | .sl    | libmylib.sl    |
 */
public static void main(String[] strg){
    //LD_LIBRARY_PATH 경로에 해당파일이 존재하기에 로드 가능
    System.loadLibrary("mylib");
    //LD_LIBRARY_PATH와 상관없이 절대경로 로드 방식
    System.load(파일의절대경로) /
}

✅ 동적 라이브러리 환경 변수와 -Djava.library.path

Java 어플리케이션에서 JNI(Java Native Interface) 또는 JNA(Java Native Access)에서

.so, .dll, .dylib 같은 네이티브 라이브러리를 로드해서 기능을 사용 해야 하는 경우

OS별 동적 라이브러리 환경에서 참조하거나 -Djava.library.path의 경로에서 해당 라이브러리를 참조 할 수 있어야 한다.

두개 중에서는 -Djava.library.path의 우선순위 더 높고 참조할 대상이 없으면 UnsatisfiedLinkError가 발생한다!

동일한 파일명의 라이브러리가 두군데 존재한다면 Djava.library.path의 파일이 먼저 로드된다는 뜻.

//JVM 옵션 - 라이브러리 경로 확인
System.out.println(System.getProperty("java.library.path"));

//OS별 동적 라이브러리 경로 확인 (분기처리 필요)
System.out.println("LD_LIBRARY_PATH = " + System.getenv("LD_LIBRARY_PATH"));
System.out.println("PATH = " + System.getenv("PATH"));
System.out.println("LIBPATH = " + System.getenv("LIBPATH"));
System.out.println("SHLIB_PATH = " + System.getenv("SHLIB_PATH"));

✅ System.load() VS System.loadLibrary()

항목 System.load() System.loadLibrary()
인자 전체 경로 (절대경로)
System.load("/library/libfoo.so");
라이브러리 이름만 (OS마다 접두/확장자 다르니까 주의)
System.loadLibrary("foo");
경로 탐색 방식 전달한 경로 그대로 사용 java.library.path에 지정된 경로 탐색
활용 용도 경로를 직접 지정해야 할 때 설정된 경로 안에 있는 라이브러리를 로드할 때
전제조건 파일의 r(읽기),x(실행) 권한만 있으면 됨 권한과 더불어 변수 설정 필수

👉 Tip.

라이브러리의 정확한 경로를 알고 있고 변경이 없다면 UnsatisfiedLinkError가능성이 적은 System.load()가 안전 하지만,

System.loadLibrary()를 사용하면 소스를 좀 더 유연하게 코딩할 수 있다.


✍ 요약

환경변수는 단순한 설정값이지만, 시스템 및 프로세스 동작 흐름에
영향을 미치는 핵심 구성요소다
환경변수의 개념과 OS별 차이를 정확히 이해하고 설명하는 것이 매우 중요하다.
서버 운영, 배포, 환경 구축등의 작업을 할 때 한번 더 확인 해보는 습관을 들이자.