macOS 환경에서 Java 개발을 시작하는 개발자라면 누구나 한 번쯤은 'JAVA_HOME'이라는 거대한 산을 마주하게 됩니다. 이 설정 하나 때문에 빌드가 실패하고, 서버가 실행되지 않으며, 개발 도구가 JDK를 찾지 못해 애를 먹는 경험은 결코 드물지 않습니다. 인터넷에 떠도는 수많은 가이드들은 단편적인 명령어만 나열하거나, 왜 특정 경로를 사용해야 하는지에 대한 근본적인 설명을 생략하는 경우가 많아 초보자에게는 더 큰 혼란을 주기도 합니다.
이 글은 더 이상 JAVA_HOME
설정으로 시간을 낭비하지 않도록 돕기 위해 작성되었습니다. 단순히 '복사해서 붙여넣기' 수준을 넘어, 왜 JAVA_HOME
이 필요한지, macOS는 Java를 어떻게 관리하는지, 그리고 최신 Apple Silicon(M1, M2, M3)과 Intel Mac 모두에서 통용되는 가장 표준적이고 현대적인 설정 방법은 무엇인지를 A부터 Z까지 상세하게 파헤칩니다. 또한, 여러 버전의 Java를 자유자재로 전환하며 사용하는 전문가 수준의 팁까지 모두 담았습니다. 이 글을 끝까지 읽고 나면, JAVA_HOME
은 더 이상 당신의 발목을 잡는 장애물이 아닌, 개발 환경을 자유롭게 제어하는 강력한 도구가 될 것입니다.
1. 근본부터 이해하기: JAVA_HOME, 대체 무엇이고 왜 이렇게 중요한가?
JAVA_HOME
은 시스템에 설치된 JDK(Java Development Kit)의 최상위 디렉토리 경로를 가리키는 환경 변수(Environment Variable)입니다. 운영체제나 다른 프로그램에게 "여기에 가면 Java 개발에 필요한 모든 도구와 라이브러리가 있다"고 알려주는 일종의 '주소' 또는 '이정표' 역할을 합니다.
JRE와 JDK의 결정적 차이, 그리고 JAVA_HOME의 역할
Java 환경을 이야기할 때 JRE와 JDK라는 두 용어가 항상 등장합니다. 이 둘의 차이를 이해하는 것이 JAVA_HOME
설정의 첫걸음입니다.
- JRE (Java Runtime Environment): 말 그대로 '자바 실행 환경'입니다. 컴파일된 Java 애플리케이션(
.class
,.jar
파일)을 실행하는 데 필요한 JVM(Java Virtual Machine)과 핵심 라이브러리들로 구성됩니다. 즉, 일반 사용자가 Java 기반 프로그램을 실행하기 위해 필요한 최소한의 요소입니다. - JDK (Java Development Kit): '자바 개발 키트'로, JRE의 모든 기능을 포함하면서 추가로 개발에 필요한 도구들을 제공합니다. 대표적인 도구가 바로 소스 코드(
.java
파일)를 바이트코드로 변환하는 컴파일러(javac
)입니다. 이 외에도 디버깅, 문서 생성, 패키징 등에 필요한 다양한 유틸리티(jar
,javadoc
등)가 포함되어 있습니다.
결론적으로 JAVA_HOME
은 반드시 JRE가 아닌 JDK의 경로를 가리켜야 합니다. 개발 도구들은 단순히 Java를 실행하는 것을 넘어, 코드를 컴파일하고 빌드하는 과정이 필요하기 때문에 javac
와 같은 JDK에만 포함된 실행 파일을 참조하기 때문입니다.
JAVA_HOME에 의존하는 수많은 개발 도구들
만약 JAVA_HOME
이 없다면 어떻게 될까요? Java 생태계의 거의 모든 주요 도구들이 올바르게 동작하지 않을 수 있습니다. 이 변수는 일종의 표준 규약처럼 사용됩니다.
- 빌드 도구: Maven(
mvn
), Gradle(gradlew
)은 프로젝트를 빌드하고 의존성을 관리할 때JAVA_HOME
을 참조하여 어떤 버전의 JDK로 컴파일할지 결정합니다. - CI/CD 서버: Jenkins, TeamCity 등은 빌드 작업을 수행할 에이전트(Agent)에서
JAVA_HOME
을 통해 JDK의 위치를 파악합니다. - 애플리케이션 서버: Apache Tomcat, WildFly, Jetty 등은 서버를 구동할 때 사용할 Java 버전을 확인하기 위해 이 변수를 사용합니다.
- 통합 개발 환경 (IDE): IntelliJ IDEA, Eclipse, VS Code 등은 프로젝트의 기본 JDK를 설정할 때 시스템의
JAVA_HOME
을 초기 값으로 제안하거나 참조합니다. - 빅데이터 프레임워크: Hadoop, Spark 등 Java 기반의 다양한 빅데이터 솔루션들도 실행 환경을 구성할 때
JAVA_HOME
을 필수적으로 요구합니다.
여러 Java 버전을 관리하는 열쇠
현대의 개발 환경에서는 여러 버전의 Java를 동시에 사용해야 하는 경우가 비일비재합니다. 예를 들어, 레거시 시스템 유지보수를 위해 Java 8이 필요하고, 새로운 사이드 프로젝트는 최신 LTS(Long-Term Support) 버전인 Java 17이나 21로 개발해야 할 수 있습니다. 이때 JAVA_HOME
변수의 값을 변경하는 것만으로 터미널 세션이나 프로젝트에서 사용할 기본 Java 버전을 손쉽게 전환할 수 있어 버전 관리에 핵심적인 역할을 합니다.
2. 가장 확실한 방법: 내 Mac에 설치된 Java 경로 찾기
JAVA_HOME
을 설정하려면 먼저 내 컴퓨터에 어떤 버전의 Java가 어디에 설치되어 있는지 정확히 알아야 합니다. 많은 분들이 /Library/Java/JavaVirtualMachines
디렉토리를 직접 찾아보곤 하지만, macOS는 이보다 훨씬 더 스마트하고 표준적인 방법을 제공합니다. 바로 /usr/libexec/java_home
유틸리티입니다.
macOS의 공식 조력자, `/usr/libexec/java_home`
이 유틸리티는 macOS가 시스템에 설치된 모든 JDK를 추적하고 관리하기 위해 사용하는 공식 도구입니다. 이 명령어를 사용하면 하드코딩된 경로를 외우거나 찾을 필요 없이, 항상 정확하고 현재 활성화된 JDK 경로를 얻을 수 있습니다. 터미널(Terminal) 앱을 열고 다음 명령어들을 실행해보세요.
모든 설치된 JDK 버전과 경로 목록 확인하기 (가장 중요!)
이 명령어 하나면 시스템에 설치된 모든 JDK의 현황을 한눈에 파악할 수 있습니다.
/usr/libexec/java_home -V
이 명령을 실행하면 다음과 비슷한 결과가 출력됩니다. (사용자 환경에 따라 내용은 달라집니다.)
Matching Java Virtual Machines (4):
21.0.1 (arm64) "Oracle Corporation" - "Java SE 21.0.1" /Library/Java/JavaVirtualMachines/jdk-21.0.1.jdk/Contents/Home
17.0.8 (arm64) "Amazon.com Inc." - "Amazon Corretto 17" /Users/myuser/Library/Java/JavaVirtualMachines/corretto-17.0.8/Contents/Home
11.0.20 (x86_64) "Azul Systems, Inc." - "Zulu 11.66.19" /Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home
1.8.0_382 (arm64) "Eclipse Temurin" - "Eclipse Temurin 8" /Library/Java/JavaVirtualMachines/temurin-8.jdk/Contents/Home
/Library/Java/JavaVirtualMachines/jdk-21.0.1.jdk/Contents/Home
이 출력 결과에서 얻을 수 있는 정보는 매우 풍부합니다:
- 개수: 현재 시스템에 총 4개의 JDK가 설치되어 있습니다.
- 버전: 21.0.1, 17.0.8, 11.0.20, 1.8.0_382 (Java 8) 버전이 존재합니다.
- 아키텍처:
(arm64)
는 Apple Silicon 네이티브 버전이며,(x86_64)
는 Intel 버전임을 의미합니다. Apple Silicon Mac에서는 Rosetta 2를 통해 Intel 버전도 실행 가능합니다. - 제공사(Vendor): "Oracle", "Amazon Corretto", "Azul Zulu", "Eclipse Temurin" 등 어떤 배포판의 JDK인지 알려줍니다.
- 경로: 각 JDK가 설치된 실제 디렉토리 경로를 보여줍니다.
- 기본값: 맨 마지막 줄에 출력되는
/Library/Java/JavaVirtualMachines/jdk-21.0.1.jdk/Contents/Home
경로는 현재 시스템이 '기본'으로 인식하는 JDK의 경로입니다.
현재 기본 JDK 경로만 확인하기
단순히 기본 JDK의 경로만 알고 싶다면 -V
옵션 없이 실행합니다.
/usr/libexec/java_home
출력 결과:
/Library/Java/JavaVirtualMachines/jdk-21.0.1.jdk/Contents/Home
이 경로가 바로 우리가 JAVA_HOME
으로 설정할 값입니다. 하지만 잠시 후 설명할 방법처럼, 이 경로를 직접 복사해서 쓰는 것보다 이 명령어를 동적으로 활용하는 것이 100배 더 좋습니다.
3. 실전! 셸(Shell) 환경에 JAVA_HOME 영구적으로 설정하기
이제 확인된 경로를 시스템이 항상 인식할 수 있도록 셸 설정 파일에 등록해야 합니다. 이 설정을 통해 터미널을 새로 열 때마다 JAVA_HOME
이 자동으로 설정됩니다. macOS는 버전에 따라 기본 셸이 다르므로, 먼저 본인이 어떤 셸을 사용하는지 확인해야 합니다.
Step 1: 현재 사용 중인 셸 확인
터미널에 다음 명령어를 입력하여 현재 어떤 셸을 사용하고 있는지 확인합니다.
echo $SHELL
- 결과가
/bin/zsh
이면 Zsh 셸을 사용 중입니다. (macOS Catalina 및 이후 버전의 기본값) - 결과가
/bin/bash
이면 Bash 셸을 사용 중입니다. (macOS Mojave 및 이전 버전의 기본값 또는 사용자가 직접 변경한 경우)
자신의 셸 환경에 맞는 아래의 방법을 따르세요. 과정은 거의 동일하며 설정 파일의 이름만 다릅니다.
Step 2-A: Zsh 사용자를 위한 설정 (~/.zshrc
파일 수정)
Zsh 셸은 사용자의 홈 디렉토리에 있는 .zshrc
파일의 설정을 읽어들입니다. (~
는 홈 디렉토리, 즉 /Users/사용자이름
을 의미합니다.)
-
.zshrc
파일 열기
선호하는 텍스트 편집기로 파일을 엽니다. 파일이 없다면 이 명령을 실행하는 순간 새로 생성되므로 걱정하지 않아도 됩니다. 가장 간단한 내장 편집기nano
를 사용해 보겠습니다.nano ~/.zshrc
(전문가 팁:
vi ~/.zshrc
또는 VS Code에서code ~/.zshrc
를 사용해도 좋습니다.) -
환경 변수 추가 (Best Practice)
파일의 맨 아래쪽에 다음 두 줄을 추가합니다. 이것이 바로 macOS에서JAVA_HOME
을 설정하는 가장 권장되는 방식입니다.# JAVA_HOME 설정 (macOS 표준 방식) export JAVA_HOME=$(/usr/libexec/java_home) export PATH=$JAVA_HOME/bin:$PATH
이 코드가 왜 최선일까요? 각 부분을 해부해 봅시다.
export
: 이 변수를 현재 셸뿐만 아니라, 이 셸에서 실행되는 다른 프로그램(자식 프로세스)에서도 사용할 수 있도록 '내보내기' 하는 명령어입니다.JAVA_HOME=...
:JAVA_HOME
이라는 이름의 변수에 값을 할당합니다.$(/usr/libexec/java_home)
: 이 부분이 핵심입니다. 명령어 치환(Command Substitution)이라는 셸 기능으로, 괄호 안의 명령어를 먼저 실행하고 그 '결과(표준 출력)'를 이 자리에 대신 넣어줍니다. 즉, 셸이 시작될 때마다/usr/libexec/java_home
가 실행되어 반환된 최신 기본 JDK 경로가JAVA_HOME
에 동적으로 할당됩니다. 나중에 Java를 업데이트하거나 기본 버전을 변경해도 이 설정 파일을 수정할 필요가 없어집니다.export PATH=$JAVA_HOME/bin:$PATH
:PATH
는 터미널이 명령어의 실행 파일을 찾는 경로들의 목록입니다. 이 줄은 "기존의 PATH 목록 앞에$JAVA_HOME/bin
디렉토리를 추가하라"는 의미입니다. 이렇게 해야 터미널 어디에서든java
,javac
같은 명령어를 경로 없이 바로 실행할 수 있습니다.:$PATH
를 뒤에 붙여 기존 경로들을 보존하는 것이 매우 중요합니다.
-
변경사항 저장 및 적용
nano
편집기에서Control
+O
키를 누르고,Enter
를 쳐서 저장한 후,Control
+X
키를 눌러 편집기를 종료합니다.
마지막으로, 다음 명령어를 터미널에 입력하여 변경된 설정을 현재 열려있는 터미널 세션에 즉시 적용합니다.source ~/.zshrc
이 과정을 거치면 터미널을 새로 열지 않아도 바로
JAVA_HOME
이 적용됩니다.
Step 2-B: Bash 사용자를 위한 설정 (~/.bash_profile
파일 수정)
Bash 셸을 사용한다면 과정은 Zsh와 거의 동일하지만, ~/.bash_profile
파일을 수정해야 합니다. (macOS의 Bash는 로그인 셸이므로 ~/.bashrc
보다는 이 파일을 사용하는 것이 표준입니다.)
.bash_profile
파일 열기nano ~/.bash_profile
- 환경 변수 추가
# JAVA_HOME 설정 (macOS 표준 방식) export JAVA_HOME=$(/usr/libexec/java_home) export PATH=$JAVA_HOME/bin:$PATH
- 변경사항 저장 및 적용
Control
+O
로 저장,Control
+X
로 종료 후, 다음 명령어로 설정을 즉시 적용합니다.source ~/.bash_profile
4. 최종 검증 및 전문가 팁: 버전 관리와 전환
설정이 올바르게 완료되었는지 확인하는 것은 필수입니다. 터미널에서 다음 명령어들을 차례로 실행하여 예상대로 결과가 나오는지 확인하세요.
1. JAVA_HOME
변수 값 직접 확인
echo $JAVA_HOME
/usr/libexec/java_home
이 반환했던 경로가 그대로 출력되어야 합니다.
/Library/Java/JavaVirtualMachines/jdk-21.0.1.jdk/Contents/Home
2. 실행되는 Java 버전 확인
java -version
JAVA_HOME
이 가리키는 버전의 정보가 출력되어야 합니다.
java version "21.0.1" 2023-10-17 LTS
Java(TM) SE Runtime Environment (build 21.0.1+12-LTS-29)
Java HotSpot(TM) 64-Bit Server VM (build 21.0.1+12-LTS-29, mixed mode, sharing)
3. Java 컴파일러(javac) 경로 및 버전 확인
which javac
javac -version
which javac
는 $JAVA_HOME/bin/javac
경로를 출력해야 하며, javac -version
은 java -version
과 동일한 버전 정보를 보여줘야 합니다. 만약 `command not found` 오류가 발생한다면 PATH
설정에 문제가 있는 것입니다.
고급 기술: 특정 버전의 Java를 사용하도록 JAVA_HOME
설정하기
프로젝트 요구사항에 따라 특정 Java 버전으로 전환해야 할 때, /usr/libexec/java_home
유틸리티의 -v
옵션을 사용하면 매우 편리합니다. 예를 들어, 시스템에 설치된 Java 11을 기본으로 사용하고 싶다고 가정해 봅시다.
~/.zshrc
(또는 ~/.bash_profile
) 파일을 다시 열고 JAVA_HOME
설정 부분을 다음과 같이 수정합니다.
# Java 11을 기본으로 설정
export JAVA_HOME=$(/usr/libexec/java_home -v 11)
export PATH=$JAVA_HOME/bin:$PATH
-v
옵션 뒤에 원하는 메이저 버전을 명시하면, 해당 메이저 버전 중에서 가장 최신 빌드 버전을 찾아 그 경로를 반환해 줍니다.
만약 Java 8(버전 표기법 1.8)을 사용하고 싶다면 다음과 같이 수정합니다.
# Java 8 (1.8)을 기본으로 설정
export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)
export PATH=$JAVA_HOME/bin:$PATH
파일 수정 후에는 반드시 source ~/.zshrc
명령으로 변경사항을 적용하는 것을 잊지 마세요. 적용 후 java -version
을 실행해보면 지정한 버전으로 깔끔하게 변경된 것을 확인할 수 있습니다.
5. 모든 개발자를 위한 솔루션: SDKMAN!으로 Java 버전 관리 자동화하기
위에서 설명한 방법은 매우 표준적이고 훌륭하지만, 여러 버전을 매우 빈번하게 전환해야 하는 개발자에게는 다소 번거로울 수 있습니다. 이럴 때 SDKMAN!과 같은 버전 관리 도구는 게임 체인저가 될 수 있습니다.
SDKMAN!은 Java뿐만 아니라 Groovy, Scala, Kotlin, Maven, Gradle 등 JVM 기반의 다양한 SDK(Software Development Kit) 버전을 손쉽게 설치하고 관리하며 전환할 수 있게 해주는 강력한 커맨드라인 도구입니다. SDKMAN!을 사용하면 .zshrc
파일을 직접 수정할 필요 없이, 간단한 명령어로 JAVA_HOME
을 자동으로 관리해 줍니다.
설치:
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
주요 명령어:
sdk list java
: 설치 가능한 모든 Java 버전 목록을 보여줍니다.sdk install java 17.0.8-tem
: 특정 버전(예: Temurin 17.0.8)을 설치합니다.sdk use java 17.0.8-tem
: 현재 터미널 세션에서만 사용할 Java 버전을 지정합니다.sdk default java 17.0.8-tem
: 모든 터미널에서 기본으로 사용할 Java 버전을 지정합니다.
SDKMAN!을 설치하면, JAVA_HOME
설정은 SDKMAN!이 자동으로 처리하므로 .zshrc
에 직접 추가했던 export JAVA_HOME=...
라인은 삭제하거나 주석 처리하는 것이 좋습니다.
6. 자주 묻는 질문과 문제 해결 (FAQ & Troubleshooting)
Q: "zsh: command not found: java" 또는 "javac: command not found" 오류가 발생합니다.
A: 이 오류는 크게 두 가지 원인일 수 있습니다.
- Java가 실제로 설치되지 않음: 가장 먼저
/usr/libexec/java_home -V
명령어로 시스템에 인식된 JDK가 있는지 확인하세요. 목록이 비어있다면 Adoptium (Temurin), Oracle Java, 또는brew install openjdk
명령어를 통해 JDK를 먼저 설치해야 합니다. PATH
설정 오류:JAVA_HOME
은 설정했지만export PATH=$JAVA_HOME/bin:$PATH
부분이 누락되었거나 잘못 설정된 경우입니다.~/.zshrc
파일을 다시 열어 해당 라인이 정확히 입력되었는지 확인하세요.echo $PATH
명령어로 출력된 경로 목록에/.../jdk-XX.X.X.jdk/Contents/Home/bin
형태의 경로가 포함되어 있는지 확인해야 합니다.
Q: 터미널에서는 버전이 잘 바뀌는데, IntelliJ나 VS Code 같은 IDE에서는 다른 버전의 Java를 사용합니다.
A: 이는 매우 정상적인 동작입니다. IntelliJ, Eclipse, VS Code와 같은 현대적인 IDE는 시스템의 전역 JAVA_HOME
설정보다 자체적인 프로젝트별/워크스페이스별 JDK 설정을 우선시합니다. 이는 각 프로젝트가 요구하는 특정 JDK 버전에 정확히 맞춰 개발할 수 있도록 하기 위한 중요한 기능입니다.
- IntelliJ IDEA:
File
>Project Structure
(단축키:Cmd
+;
) >Project Settings
>Project
에서 'Project SDK'를 변경하거나,Platform Settings
>SDKs
에서 새로운 JDK를 등록할 수 있습니다. IDE가 자동으로 설치된 JDK들을 찾아주지만, 못 찾는 경우+
버튼을 눌러/usr/libexec/java_home -v [버전]
으로 찾은 경로를 직접 지정해주면 됩니다. - Visual Studio Code (VS Code): Java Extension Pack이 설치되어 있어야 합니다.
Cmd
+Shift
+P
를 눌러 명령 팔레트를 열고 'Java: Configure Java Runtime'을 검색하여 실행하세요. 여기서 프로젝트 JDK 경로(java.configuration.runtimes
)와 기본 실행 환경 등을 그래픽 인터페이스를 통해 손쉽게 설정할 수 있습니다.
Q: Apple Silicon (M1/M2/M3) Mac을 사용 중입니다. Intel(x86_64) 버전과 ARM(arm64) 버전 JDK 중 무엇을 설치해야 하나요?
A: 가능한 한 항상 arm64 네이티브 버전을 사용하는 것이 좋습니다. 네이티브 버전이 훨씬 뛰어난 성능과 전력 효율을 보여줍니다. /usr/libexec/java_home -V
출력에서 (arm64)
로 표시된 JDK를 우선적으로 사용하세요. 하지만, 간혹 ARM을 지원하지 않는 오래된 개발 도구나 라이브러리를 사용해야 하는 경우, Intel(x86_64) 버전 JDK를 설치하고 Rosetta 2를 통해 실행해야 할 수도 있습니다. 두 버전 모두 설치해두고 필요에 따라 전환하며 사용하는 것도 좋은 전략입니다.
이 가이드를 통해 macOS에서의 JAVA_HOME
설정에 대한 모든 궁금증이 해결되었기를 바랍니다. 이제 여러분은 어떤 상황에서도 자신감 있게 Java 개발 환경을 구축하고 관리할 수 있을 것입니다.
0 개의 댓글:
Post a Comment