[Java] JDK 그놈의 환경변수 설정하는 이유 정리~

2025. 9. 7. 20:17·공부일기../Java

 

인트로

대학교 때 자바 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
'공부일기../Java' 카테고리의 다른 글
  • [java] static 키워드 - 제약사항~
  • [java] 자바 메모리 구조 - 김영한~자바
  • [JUnit5] @EnabledIfEnvironmentVariable 이해하기
  • [동시성] 자바 동시성 문제 정리: synchronized, DB 락, Redis 분산락 비교
s0-0mzzang
s0-0mzzang
공부한것을 기록합니다...
  • s0-0mzzang
    승민이의..개발일기..🐰
    s0-0mzzang
  • 전체
    오늘
    어제
    • 전체~ (108)
      • 마음가짐..! (10)
      • 공부일기.. (76)
        • weekly-log (6)
        • Spring (19)
        • Java (18)
        • DataBase (10)
        • git (2)
        • JPA (6)
        • kafka (1)
        • Backend Architecture (3)
        • Troubleshooting (삽질..ㅋ) (2)
        • Cloud (1)
        • Docker (2)
        • 알고리즘 (1)
        • 리액트 (2)
        • Infra (3)
      • 하루일기.. (22)
        • 그림일기 (8)
        • 생각일기 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    ADC 환경
    Paging
    spring
    ERD
    SpringBoot
    자바
    스프링부트
    JPA
    BufferedReader
    리팩토링
    항해99
    MySQL
    인프라 기초
    TDD
    다짐
    React
    항해플러스
    StringTokenizer
    spring boot
    swagger
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
s0-0mzzang
[Java] JDK 그놈의 환경변수 설정하는 이유 정리~
상단으로

티스토리툴바