인트로
대학교 때 자바 JDK 설치하다 보면 교수님께 “저 안되는데요~” 하는 경우가 많았다ㅋㅋ
대부분의 원인은 환경변수 설정이 안 되어 있었기 때문이다.
이번에 본사발령 받아서 pc세팅 하면서도 JDK 환경변수를 깜빡하고 설정하지 않아 한동안 당황했다.
그래서 이번 기회에 자바 환경변수가 왜 필요한지 언제 설정하는지 정리해보려고 한다~
1. 환경변수(Environment Variable)란 무엇인가
환경변수는 운영체제 차원에서 관리하는 키=값 쌍의 설정 값이다.
프로그램(프로세스)이 실행될 때 운영체제가 이 값을 넘겨주고, 프로그램은 이를 참고해서 동작한다.
예를 들어
- JAVA_HOME=/usr/lib/jvm/java-17
- DB_URL=jdbc:mysql://localhost:3306/test
- ENV=local
이런 값들을 외부에서 주입해주면, 프로그램은 코드에 하드코딩하지 않고도 환경에 따라 달라진 설정으로 실행될 수 있다.
2. 자바에서 왜 환경변수가 중요한가
JDK를 설치하면 두 가지 핵심 실행파일이 딸려온다.
- javac.exe → 자바 소스를 컴파일하는 도구
- java.exe → 컴파일된 프로그램을 실행하는 도구
즉 IDE(예: Eclipse, IntelliJ)가 없어도 이 두 개만 있으면 개발과 실행이 가능하다.
콘솔에서 `javac` 명령어를 치면
'javac'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다.
이런 황당한 에러가 뜰꺼다.
컴퓨터 : javac 어딨는지 모르는데 어떻게 실행해요-_-
나 : bin 안에있다구..
컴퓨터 : 안알려줬자낭..
- 자바 실행파일(java, javac)은 JDK 설치 디렉토리의 bin 폴더에 들어 있다.
- 컴퓨터는 javac.exe가 어디에있는지 모른다. (매번 `cd jdk경로\어쩌구\jdk17.0\bin` 에서 실행해야함)
- 따라서 운영체제가 어느 경로에서든 자바를 실행할 수 있도록 하기 위해 Path 환경변수에 bin 경로를 등록한다.
- 이렇게 하면 javac, java 명령어를 전역에서 인식할 수 있어 편리하다.
2-1. JAVA_HOME
`cd jdk경로\어쩌구\jdk17.0\bin` 경로는 너무 길고 버전이 바뀔때마다 바뀐다.
그래서 단축어를 붙혀주는것이다. -> jdk 설치경로를 가리키는 표준 별명
- 자바가 설치된 디렉터리를 가리키는 환경변수
- 빌드 도구(Gradle, Maven)나 IDE가 이 경로를 참고해 java, javac 실행파일과 라이브러리를 찾는다.
- 여러 JDK 버전이 설치된 환경에서 내가 원하는 버전을 강제로 지정할 수 있다.
(이거때매 애먹음 왜자꾸 변하는거야ㅠ 이랫음 ..ㅋㅋ)
2-2. PATH
마찬가지로 `%JAVA_HOME%\bin` (Windows) 또는 `$JAVA_HOME/bin` (Linux/macOS) 형태로 짧고 일관되게 쓸 수 있다.
컴퓨터가 어디서든지 java.exe, javac.exe 실행파일을 찾아 실행할 수 있게 된다.
약간 추상화느낌..? 이렇게 해주지않았다면 경로가 바뀔때마다 환경변수를 계속 설정해줘야하는 번거로움이 있을것이다..
- 실행파일을 찾는 애
- PATH에 $JAVA_HOME/bin 이 들어가 있어야, 터미널에서 java -version 같은 명령이 정상 동작한다.
컴퓨터: 웅! JAVA_HOME/bin만 볼겡 !
3. 언제 환경변수를 설정하는가
- JDK 설치 직후: 새로 설치했으면 JAVA_HOME, PATH를 다시 잡아야 한다
- 여러 버전이 공존할 때: 8, 11, 17 등 여러 버전을 설치해 놓고 프로젝트마다 다르게 써야 할 때
- CI/CD, 서버, 컨테이너 환경: 운영환경에서 JDK 경로나 실행 설정을 자동화하려고
- IDE 실행 환경과 맞추기 위해: 터미널에서는 되는데, IDE에서는 안 되는 경우가 많은데, 이는 IDE 런 설정에 환경변수가 없어서 발생한다
4. 어떻게 확인할 수 있는가

- macOS/Linux
echo $JAVA_HOME
which java
java -version
- Windows PowerShell
echo $env:JAVA_HOME
where java
java -version
- Java 코드
System.out.println(System.getenv("JAVA_HOME"));
System.out.println(System.getProperty("java.home"));
5. 헷갈렸던 부분~
- 환경변수 vs 시스템 프로퍼티
- System.getenv("JAVA_HOME") → OS 환경변수
- System.getProperty("java.home") → JVM 내부 프로퍼티 (대개 JRE 경로)
- 터미널과 IDE의 차이
- 터미널에서 실행하면 OS 셸의 환경변수를 그대로 상속받는다.
- IDE에서 실행하면 IDE Run 설정에 등록된 값만 본다.
- 그래서 터미널에선 잘 되는데 IDE에서만 안 되는 경우가 생긴다.
터미널에서는 되는데 IDE에서 환경변수 안되는경우 포스팅 참고~
[JUnit5] @EnabledIfEnvironmentVariable 이해하기
정리
대학생때 첫 관문이 환경변수 설정이었다.
오랜만에 설정을 다시 하려니까 같은 실수를 반복했음 아차차~
잊지마세용
- 환경변수 설정 = 컴퓨터한테 실행파일이나 라이브러리의 주소를 알려주는 것
- 자바 환경변수(JAVA_HOME, Path)는
- JAVA_HOME → JDK가 여기 설치됐는뎁숑
- Path → 여기 bin 폴더 안에 있는 실행파일들을 전역에서 쓸 수 있게 해라 ㅋ
'공부일기.. > Java' 카테고리의 다른 글
| [java] static 키워드 - 제약사항~ (0) | 2025.09.20 |
|---|---|
| [java] 자바 메모리 구조 - 김영한~자바 (0) | 2025.09.19 |
| [JUnit5] @EnabledIfEnvironmentVariable 이해하기 (0) | 2025.09.05 |
| [동시성] 자바 동시성 문제 정리: synchronized, DB 락, Redis 분산락 비교 (5) | 2025.08.16 |
| [TDD](TDD기반 서비스 개발 후) 회고 및 객체지향 설계 고민 (0) | 2025.07.12 |