✅ 환경변수(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별 차이를 정확히 이해하고 설명하는 것이 매우 중요하다.
서버 운영, 배포, 환경 구축등의 작업을 할 때 한번 더 확인 해보는 습관을 들이자.
'Infra' 카테고리의 다른 글
[Linux 명령어] su / su - / sudo 리눅스 사용자 전환,변경 (0) | 2022.03.16 |
---|---|
[Linux 명령어] CentOS / Ubuntu 방화벽 설정 (firewalld, ufw) (0) | 2022.03.15 |
[Linux 명령어] update-alternatives 손쉬운 자바 버전 변경 (0) | 2022.03.15 |