Monday, October 12, 2020

macOS에서 JAVA_HOME 환경 변수 정확하게 설정하기

macOS 환경에서 Java 기반 개발을 시작할 때 가장 먼저 마주치는 관문 중 하나는 바로 JAVA_HOME 환경 변수를 설정하는 것입니다. 많은 개발 도구, 프레임워크, 그리고 서버 애플리케이션이 시스템에 설치된 Java 개발 키트(JDK)의 위치를 찾기 위해 이 변수를 참조합니다. 예를 들어, Maven, Gradle과 같은 빌드 도구나 Jenkins, Tomcat, Spring Boot 애플리케이션 등은 JAVA_HOME이 올바르게 설정되어 있지 않으면 정상적으로 실행되지 않을 수 있습니다. 이 글에서는 macOS에서 JAVA_HOME을 설정하는 가장 효율적이고 표준적인 방법을 단계별로 상세하게 안내합니다.

단순히 경로를 복사해서 붙여넣는 방식을 넘어, 왜 이 설정이 필요한지, 그리고 여러 버전의 Java를 어떻게 관리하고 전환할 수 있는지에 대한 깊이 있는 이해를 돕는 것을 목표로 합니다.

1. JAVA_HOME이란 무엇이며 왜 중요한가?

JAVA_HOME은 시스템에 설치된 JDK(Java Development Kit)의 최상위 디렉토리 경로를 가리키는 환경 변수입니다. 운영체제나 다른 프로그램에게 "자바 개발에 필요한 파일들이 여기에 있다"고 알려주는 이정표 역할을 합니다.

  • JRE vs. JDK: Java를 실행만 하는 데 필요한 환경은 JRE(Java Runtime Environment)이고, 컴파일 등 개발에 필요한 도구까지 포함하는 것이 JDK입니다. JAVA_HOME은 일반적으로 JRE가 아닌 JDK의 경로를 가리켜야 합니다. 개발 도구들은 javac(컴파일러)와 같은 JDK에 포함된 실행 파일을 필요로 하기 때문입니다.
  • 도구 호환성: 앞서 언급했듯이, 수많은 자바 생태계의 도구들이 JAVA_HOME을 기준으로 JDK를 찾습니다. 이 변수가 없으면, 각 도구마다 JDK 경로를 수동으로 설정해주어야 하는 번거로움이 발생하거나, 아예 실행이 실패할 수 있습니다.
  • 버전 관리: 하나의 시스템에 여러 버전의 JDK(예: Java 8, 11, 17)가 설치된 경우, JAVA_HOME을 변경함으로써 프로젝트 요구사항에 맞는 특정 버전의 Java를 사용하도록 손쉽게 전환할 수 있습니다.

2. macOS에 설치된 Java 버전 및 경로 확인하기

JAVA_HOME을 설정하기에 앞서, 현재 시스템에 어떤 버전의 Java가 어디에 설치되어 있는지 확인해야 합니다. macOS는 이를 위한 매우 편리한 유틸리티를 기본적으로 제공합니다.

macOS의 표준 유틸리티: /usr/libexec/java_home

터미널(Terminal) 앱을 열고 다음 명령어를 사용하면 가장 확실하고 간단하게 JDK 경로를 찾을 수 있습니다. 하드코딩된 경로를 직접 찾는 것보다 이 유틸리티를 사용하는 것이 훨씬 권장되는 방법입니다.

모든 설치된 JDK 버전 목록 보기:

가장 유용한 명령어입니다. 시스템에 설치된 모든 JDK의 버전과 경로를 상세히 보여줍니다.

/usr/libexec/java_home -V

이 명령어를 실행하면 다음과 유사한 결과가 나타납니다. 사용자의 설치 환경에 따라 내용은 달라질 수 있습니다.

Matching Java Virtual Machines (3):
    17.0.1 (x86_64) "Oracle Corporation" - "Java SE 17.0.1" /Library/Java/JavaVirtualMachines/jdk-17.0.1.jdk/Contents/Home
    11.0.12 (x86_64) "Amazon Corretto" - "Amazon Corretto 11" /Library/Java/JavaVirtualMachines/amazon-corretto-11.jdk/Contents/Home
    1.8.0_292 (x86_64) "AdoptOpenJDK" - "AdoptOpenJDK 8" /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

/Library/Java/JavaVirtualMachines/jdk-17.0.1.jdk/Contents/Home

위 출력은 시스템에 Java 17, 11, 8 버전이 설치되어 있음을 보여줍니다. 마지막 줄은 현재 기본으로 설정된 Java의 경로를 나타냅니다.

기본 JDK 경로 확인하기:

단순히 기본 JDK의 경로만 확인하고 싶다면 -V 옵션 없이 실행합니다.

/usr/libexec/java_home

출력 결과:

/Library/Java/JavaVirtualMachines/jdk-17.0.1.jdk/Contents/Home

이 경로가 바로 우리가 JAVA_HOME으로 설정할 값입니다. 하지만 이 경로를 직접 복사하여 사용하는 것보다, 이 명령어를 동적으로 활용하는 것이 더 좋습니다. 그 이유는 잠시 후에 설명하겠습니다.

3. 셸(Shell) 환경에 JAVA_HOME 설정하기

macOS에서는 터미널에서 사용하는 셸의 설정 파일에 환경 변수를 등록해야 합니다. 최신 macOS(Catalina 버전 이상)는 기본 셸로 Zsh를 사용하며, 이전 버전이나 사용자가 직접 변경한 경우에는 Bash를 사용할 수 있습니다. 먼저 본인이 어떤 셸을 사용 중인지 확인해야 합니다.

현재 사용 중인 셸 확인

터미널에 다음 명령어를 입력하여 현재 셸을 확인합니다.

echo $SHELL

결과가 /bin/zsh 이면 Zsh를, /bin/bash 이면 Bash를 사용 중인 것입니다. 자신의 셸에 맞는 설정 방법을 따르세요.

방법 1: Zsh 사용자의 경우 (~/.zshrc 파일)

Zsh는 ~/.zshrc 파일을 사용하여 셸 환경을 설정합니다. ~는 현재 사용자의 홈 디렉토리를 의미합니다 (예: /Users/your-username).

1. .zshrc 파일 열기:
선호하는 텍스트 편집기로 .zshrc 파일을 엽니다. 파일이 없다면 이 명령어를 실행할 때 새로 생성됩니다. 여기서는 macOS에 내장된 간단한 편집기인 nano를 사용하겠습니다.

nano ~/.zshrc

2. 환경 변수 추가:
파일의 맨 아래에 다음 두 줄을 추가합니다. 이 방법이 가장 권장되는 방식입니다.

# Java Home 설정
export JAVA_HOME=$(/usr/libexec/java_home)
export PATH=$JAVA_HOME/bin:$PATH

왜 이 방법이 좋을까요?
export JAVA_HOME="/Library/Java/..." 와 같이 경로를 직접 쓰는 대신 $(/usr/libexec/java_home) 구문을 사용했습니다. 이를 '명령어 치환(Command Substitution)'이라고 부릅니다. 이렇게 하면 셸이 시작될 때마다 /usr/libexec/java_home 명령어가 실행되고, 그 결과(기본 JDK 경로)가 JAVA_HOME 변수에 동적으로 할당됩니다. 나중에 Java를 업데이트하여 기본 버전이 바뀌더라도 설정 파일을 수정할 필요 없이 자동으로 최신 버전을 가리키게 되어 매우 편리합니다.

두 번째 줄 export PATH=...는 Java의 실행 파일(java, javac 등)이 있는 bin 디렉토리를 시스템의 PATH 환경 변수에 추가하는 것입니다. 이렇게 해야 터미널 어디에서든 java 명령어를 바로 실행할 수 있습니다.

3. 변경사항 저장 및 적용:
nano 편집기에서 Control + O를 눌러 저장하고, Enter를 친 후, Control + X를 눌러 편집기를 종료합니다. 그 다음, 터미널에 다음 명령어를 입력하여 변경된 설정을 즉시 적용합니다.

source ~/.zshrc

이제 터미널을 새로 시작하지 않아도 JAVA_HOME이 적용됩니다.

방법 2: Bash 사용자의 경우 (~/.bash_profile 파일)

Bash 셸을 사용한다면 과정은 거의 동일하지만, 대상 파일이 다릅니다. macOS의 Bash는 로그인 셸이므로 ~/.bash_profile 파일을 수정하는 것이 일반적입니다.

1. .bash_profile 파일 열기:

nano ~/.bash_profile

2. 환경 변수 추가:
Zsh와 마찬가지로 파일 맨 아래에 다음 내용을 추가합니다.

# Java Home 설정
export JAVA_HOME=$(/usr/libexec/java_home)
export PATH=$JAVA_HOME/bin:$PATH

3. 변경사항 저장 및 적용:
Control + O로 저장, Control + X로 종료한 후, 다음 명령어로 설정을 적용합니다.

source ~/.bash_profile

4. 설정 확인하기

설정이 올바르게 완료되었는지 확인하는 것은 매우 중요합니다. 터미널에서 다음 명령어들을 차례로 실행해보세요.

1. JAVA_HOME 변수 값 확인:

echo $JAVA_HOME

앞서 /usr/libexec/java_home으로 확인했던 JDK 경로가 출력되어야 합니다.

/Library/Java/JavaVirtualMachines/jdk-17.0.1.jdk/Contents/Home

2. 현재 사용 중인 Java 버전 확인:

java -version

JAVA_HOME이 가리키는 버전의 정보가 출력되어야 합니다.

java version "17.0.1" 2021-10-19 LTS
Java(TM) SE Runtime Environment (build 17.0.1+12-LTS-39)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.1+12-LTS-39, mixed mode, sharing)

3. Java 컴파일러 버전 확인:

javac -version

java -version과 동일한 버전 정보가 출력되어야 합니다. 만약 javac: command not found 오류가 발생한다면 PATH 설정에 문제가 있을 가능성이 높습니다.

5. 특정 버전의 Java를 사용하도록 JAVA_HOME 설정하기

여러 프로젝트를 진행하다 보면 특정 프로젝트는 Java 8로, 다른 프로젝트는 Java 11로 실행해야 하는 경우가 많습니다. /usr/libexec/java_home 유틸리티는 버전 전환도 매우 간단하게 만들어 줍니다.

앞서 /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 11 버전이 여러 개 설치되어 있다면 가장 최신 빌드 버전의 경로를 반환해줍니다.

마찬가지로 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 (또는 source ~/.bash_profile) 명령어로 변경사항을 적용하는 것을 잊지 마세요. 적용 후 java -version을 실행해보면 지정한 버전으로 변경된 것을 확인할 수 있습니다.

문제 해결 및 추가 정보

"zsh: command not found: java" 오류가 발생합니다.

이 오류는 크게 두 가지 원인일 수 있습니다.

  1. Java가 설치되지 않음: Homebrew나 Oracle 웹사이트 등에서 JDK를 먼저 설치해야 합니다. /usr/libexec/java_home -V 명령어로 설치된 JDK가 있는지 확인해보세요.
  2. PATH 설정 오류: JAVA_HOME은 설정했지만 export PATH=$JAVA_HOME/bin:$PATH 부분이 누락되었거나 잘못 설정된 경우입니다. 셸 설정 파일을 다시 확인하고, echo $PATH 명령어로 $JAVA_HOME/bin 경로가 포함되어 있는지 살펴보세요.

설정을 변경했는데도 IDE(통합 개발 환경)에서는 다른 버전의 Java를 사용합니다.

IntelliJ IDEA, Eclipse, VS Code와 같은 IDE는 시스템의 JAVA_HOME 환경 변수를 참조하기도 하지만, 대부분 자체적으로 프로젝트별 또는 전역 JDK 설정을 가지고 있습니다. 셸에서 JAVA_HOME을 변경했더라도 IDE의 설정이 우선될 수 있습니다. 이 경우, 각 IDE의 설정 메뉴(예: IntelliJ의 'Project Structure' -> 'SDKs')에서 사용할 JDK를 직접 지정해주어야 합니다.

.zshrc 파일이 없다고 나옵니다.

Zsh를 처음 사용하거나 환경 설정을 한 번도 하지 않았다면 .zshrc 파일이 없을 수 있습니다. 이는 정상적인 상황입니다. nano ~/.zshrc 또는 vi ~/.zshrc 명령어를 실행하면 파일이 새로 생성되므로 걱정하지 않고 내용을 추가하면 됩니다.

이 가이드를 통해 macOS에서 JAVA_HOME을 설정하는 명확한 방법을 이해하셨기를 바랍니다. macOS가 제공하는 /usr/libexec/java_home 유틸리티를 적극적으로 활용하면, Java 버전 관리와 환경 설정을 훨씬 더 효율적이고 유연하게 처리할 수 있어 개발 생산성을 높이는 데 큰 도움이 될 것입니다.


0 개의 댓글:

Post a Comment