Friday, June 9, 2023

프로젝트별 최적의 자바 환경 구축: VS Code 다중 JDK 관리 기법

현대의 소프트웨어 개발 환경에서 여러 버전의 자바(Java)를 동시에 다루는 것은 더 이상 선택이 아닌 필수가 되었습니다. 레거시 시스템 유지보수를 위해 Java 8을 사용해야 하는 동시에, 새로운 마이크로서비스는 Java 17의 최신 기능을 활용하여 개발하고, 또 다른 프로젝트에서는 Java 21의 성능 개선을 테스트해야 할 수도 있습니다. 이처럼 다양한 요구사항이 공존하는 상황에서 개발 환경을 유연하게 전환하는 능력은 생산성과 직결됩니다.

Visual Studio Code(이하 VS Code)는 가볍고 강력한 확장성 덕분에 수많은 자바 개발자에게 사랑받는 도구로 자리매김했습니다. 하지만 여러 프로젝트를 오가며 매번 시스템의 JAVA_HOME 환경 변수를 수동으로 변경하는 것은 번거롭고 오류를 유발하기 쉬운 작업입니다. 다행히도 VS Code는 내장된 설정과 강력한 자바 확장 기능을 통해 이러한 문제를 우아하게 해결할 수 있는 방법을 제공합니다. 이 글에서는 VS Code 내에서 여러 버전의 JDK(Java Development Kit)를 체계적으로 등록하고, 각 프로젝트의 특성에 맞게 특정 JDK를 손쉽게 지정하여 사용하는 심층적인 방법을 다룹니다.

단순히 설정 파일을 복사하여 붙여넣는 수준을 넘어, VS Code의 설정 계층 구조(사용자 설정 vs. 작업 영역 설정)를 이해하고, 이를 바탕으로 전역적으로 사용 가능한 JDK 목록을 정의한 뒤, 각 프로젝트에서는 필요한 버전을 선택적으로 활성화하는 고급 전략을 상세히 알아볼 것입니다. 이를 통해 개발자는 환경 설정에 쏟는 시간을 최소화하고, 오롯이 코드 작성과 문제 해결에만 집중할 수 있는 최적의 개발 환경을 구축하게 될 것입니다.

1. 사전 준비: 성공적인 설정을 위한 기반 다지기

본격적인 다중 JDK 설정에 앞서, 원활한 진행을 위해 몇 가지 필수적인 준비 사항을 확인해야 합니다. 이 단계들은 VS Code에서 자바 개발 환경을 구성하는 가장 기본적인 요소이며, 이미 완료된 경우 다음 섹션으로 넘어가도 좋습니다.

가. Visual Studio Code 및 필수 확장 프로그램 설치

가장 먼저, VS Code가 시스템에 설치되어 있어야 합니다. 만약 설치하지 않았다면 공식 웹사이트를 통해 자신의 운영체제에 맞는 버전을 다운로드하여 설치합니다.

VS Code가 자바를 완벽하게 지원하기 위해서는 'Extension Pack for Java'의 설치가 필수적입니다. 이 확장 팩은 자바 개발에 필요한 핵심 기능들을 한 번에 제공하는 모음집입니다.

  1. VS Code를 실행합니다.
  2. 왼쪽 액티비티 바에서 사각형 모양의 '확장(Extensions)' 아이콘을 클릭합니다 (단축키: Ctrl+Shift+X).
  3. 검색창에 Extension Pack for Java를 입력하고 검색합니다.
  4. Microsoft에서 제공하는 공식 확장 팩을 찾아 'Install' 버튼을 클릭합니다.

이 확장 팩에는 다음과 같은 주요 기능들이 포함되어 있습니다:

  • Language Support for Java™ by Red Hat: 코드 탐색, 자동 완성, 리팩토링, 오류 검사 등 핵심적인 언어 지원 기능
  • Debugger for Java: 중단점(breakpoint) 설정, 변수 추적 등 디버깅 기능
  • Test Runner for Java: JUnit, TestNG 등 테스트 프레임워크 연동 및 실행
  • Maven for Java: Maven 프로젝트 관리, 빌드, 의존성 관리 지원
  • Project Manager for Java: 프로젝트 뷰, 클래스패스 관리 등 프로젝트 관리 기능

이 확장 팩이 성공적으로 설치되면 VS Code는 강력한 자바 IDE로 변모할 준비를 마친 것입니다.

나. 시스템에 여러 버전의 JDK 설치

VS Code에서 여러 JDK를 '설정'하기 전에, 해당 JDK들이 실제로 시스템에 '설치'되어 있어야 합니다. VS Code는 이미 설치된 JDK의 경로를 참조하여 동작하기 때문입니다. 필요에 따라 원하는 버전의 JDK를 설치합니다. 예를 들어, Java 8, 11, 17을 동시에 사용한다고 가정해 보겠습니다.

JDK는 다양한 배포판이 존재합니다. 대표적인 예는 다음과 같습니다:

  • Eclipse Temurin (구 AdoptOpenJDK): 커뮤니티 기반의 무료 OpenJDK 배포판으로 가장 널리 사용됩니다.
  • Oracle JDK: Oracle에서 공식적으로 제공하며, 특정 버전부터 라이선스 정책 변경이 있었습니다.
  • - Amazon Corretto: Amazon에서 제공하는 프로덕션 레디 OpenJDK 배포판입니다.
  • Zulu Community: Azul Systems에서 제공하는 OpenJDK 빌드입니다.

JDK 설치 관리 도구 활용 (권장)

macOS나 Linux 환경에서는 SDKMAN!과 같은 버전 관리 도구를 사용하는 것이 매우 편리합니다. SDKMAN!을 사용하면 간단한 명령어로 여러 버전의 JDK를 설치하고 전환할 수 있습니다.


# SDKMAN! 설치 (설치되어 있지 않은 경우)
$ curl -s "https://get.sdkman.io" | bash
$ source "$HOME/.sdkman/bin/sdkman-init.sh"

# 사용 가능한 Java 버전 목록 확인
$ sdk list java

# 특정 버전의 JDK 설치 (예: Temurin JDK 8, 11, 17)
$ sdk install java 8.0.392-tem
$ sdk install java 11.0.21-tem
$ sdk install java 17.0.9-tem

Windows 환경에서는 Chocolatey나 Scoop 같은 패키지 관리자를 사용하거나, 각 JDK 배포판의 공식 웹사이트에서 설치 파일을 직접 다운로드하여 원하는 위치(예: C:\Java\jdk-8, C:\Java\jdk-11)에 설치하는 방식을 사용할 수 있습니다.

중요한 점은 각 JDK가 설치된 **최상위 디렉토리(Home Directory)의 절대 경로**를 파악해 두는 것입니다. 이 경로는 잠시 후 VS Code 설정에 사용됩니다.

2. VS Code의 설정 파일 이해: User vs. Workspace

VS Code의 유연성은 계층적인 설정 구조에서 비롯됩니다. 다중 JDK를 효과적으로 관리하기 위해서는 '사용자 설정(User Settings)'과 '작업 영역 설정(Workspace Settings)'의 차이점을 명확히 이해해야 합니다.

  • 사용자 설정 (User Settings):
    • 전역 설정으로, VS Code를 통해 여는 모든 프로젝트에 공통적으로 적용됩니다.
    • settings.json 파일은 운영체제별로 특정 사용자 디렉토리에 위치합니다. (예: Windows의 %APPDATA%\Code\User\settings.json, macOS의 ~/Library/Application Support/Code/User/settings.json)
    • 활용 전략: 시스템에 설치된 모든 JDK의 목록을 여기에 등록하여, 어떤 프로젝트에서든 이 JDK들을 '사용 가능한 런타임'으로 인식하도록 만듭니다.
  • 작업 영역 설정 (Workspace Settings):
    • 현재 열려 있는 특정 프로젝트 폴더에만 적용되는 지역 설정입니다.
    • 프로젝트 루트 디렉토리 내의 .vscode/settings.json 파일에 저장됩니다.
    • 이 설정은 사용자 설정을 덮어씁니다(override). 즉, 동일한 설정 항목이 두 곳에 모두 존재할 경우 작업 영역 설정이 우선적으로 적용됩니다.
    • 활용 전략: 해당 프로젝트에서 기본적으로 사용할 JDK 버전을 지정하는 데 사용합니다. 예를 들어, 'my-legacy-project'는 Java 8을, 'new-microservice'는 Java 17을 기본값으로 설정할 수 있습니다.

우리의 목표는 이 두 가지 설정을 전략적으로 조합하는 것입니다. 먼저 **사용자 설정**에 우리가 사용할 수 있는 모든 JDK의 목록과 경로를 정의하고, 그 다음 각 **작업 영역 설정**에서 그 목록 중 어떤 JDK를 기본으로 사용할지 선택하는 방식입니다. 이를 통해 전역 설정의 재사용성과 프로젝트별 설정의 독립성을 모두 확보할 수 있습니다.

3. 핵심 설정: `java.configuration.runtimes` 상세 분석

이제 VS Code에 시스템에 설치된 JDK들의 정보를 알려주는 핵심적인 작업을 진행합니다. 이 작업은 전역적으로 적용되어야 하므로 '사용자 설정' 파일인 settings.json을 수정합니다.

가. 사용자 `settings.json` 파일 열기

VS Code에서 사용자 설정 파일을 여는 가장 확실한 방법은 명령 팔레트(Command Palette)를 이용하는 것입니다.

  1. 단축키 Ctrl+Shift+P (macOS: Cmd+Shift+P)를 눌러 명령 팔레트를 엽니다.
  2. settings json 이라고 입력하기 시작하면 관련 명령어들이 나타납니다.
  3. Preferences: Open User Settings (JSON) 항목을 선택하여 클릭합니다.
  4. settings.json 파일이 편집기 창에 열립니다. 기존에 설정한 내용이 있다면 표시될 것입니다.

나. `java.configuration.runtimes` 속성 추가

열린 settings.json 파일에 java.configuration.runtimes라는 속성을 추가합니다. 이 속성은 배열([]) 형태의 값을 가지며, 배열의 각 요소는 우리가 등록하고자 하는 JDK 하나에 대한 정보를 담은 객체({})입니다.

각 JDK 객체는 주로 name, path, 그리고 선택적으로 default 속성을 가집니다.

  • name: 해당 JDK 런타임을 식별하기 위한 고유한 이름입니다. VS Code 내에서 JDK를 선택할 때 이 이름이 표시됩니다. Java 실행 환경 표준(예: JavaSE-1.8, JavaSE-11, JavaSE-17)을 따르는 것이 일반적이며, 가독성을 위해 직관적인 이름을 사용해도 무방합니다.
  • path: 해당 JDK가 설치된 최상위 디렉토리의 절대 경로입니다. 이 경로가 정확하지 않으면 VS Code가 JDK를 찾지 못하므로 매우 중요합니다. 경로에는 bin 폴더가 포함되지 않아야 합니다.
  • default (선택 사항): true로 설정하면 이 JDK가 전역 기본값으로 사용됩니다. 작업 영역 설정에서 별도로 지정하지 않은 모든 프로젝트는 이 JDK를 사용하게 됩니다. 보통 하나의 전역 기본값을 설정해두는 것이 편리하지만, 프로젝트별 설정을 주로 사용할 것이라면 생략해도 괜찮습니다.

예시: Windows 환경에서의 설정

만약 JDK 8, 11, 17이 각각 C:\Program Files\Java\jdk1.8.0_291, C:\Program Files\Eclipse Adoptium\jdk-11.0.15.10-hotspot, C:\Program Files\Amazon Corretto\jdk17.0.2_8에 설치되어 있다고 가정해 보겠습니다.


{
    // ... 다른 설정들이 있을 수 있습니다 ...

    "java.configuration.runtimes": [
        {
            "name": "JavaSE-1.8",
            "path": "C:\\Program Files\\Java\\jdk1.8.0_291",
            "sources" : "C:\\Program Files\\Java\\jdk1.8.0_291\\src.zip" // 소스 코드 경로 (선택 사항)
        },
        {
            "name": "JavaSE-11",
            "path": "C:\\Program Files\\Eclipse Adoptium\\jdk-11.0.15.10-hotspot",
            "default": true // Java 11을 전역 기본값으로 설정
        },
        {
            "name": "JavaSE-17",
            "path": "C:\\Program Files\\Amazon Corretto\\jdk17.0.2_8"
        }
    ],

    // ... 다른 설정들이 있을 수 있습니다 ...
}

주의: JSON 파일에서 Windows 경로를 입력할 때는 역슬래시(\)를 이스케이프하기 위해 두 번(\\) 사용하거나, 슬래시(/)를 사용해야 합니다. (예: "C:/Program Files/Java/jdk1.8.0_291")

예시: macOS/Linux 환경에서의 설정 (SDKMAN! 사용 시)

SDKMAN!으로 설치한 경우, 각 JDK의 경로는 ~/.sdkman/candidates/java/ 디렉토리 아래에 위치합니다. 정확한 경로는 터미널에서 확인할 수 있습니다.


$ sdk home java 8.0.392-tem
/Users/your_username/.sdkman/candidates/java/8.0.392-tem

$ sdk home java 17.0.9-tem
/Users/your_username/.sdkman/candidates/java/17.0.9-tem

위 경로를 바탕으로 settings.json 파일을 다음과 같이 작성할 수 있습니다.


{
    // ... 다른 설정들이 있을 수 있습니다 ...

    "java.configuration.runtimes": [
        {
            "name": "JavaSE-1.8",
            "path": "/Users/your_username/.sdkman/candidates/java/8.0.392-tem"
        },
        {
            "name": "JavaSE-11",
            "path": "/Users/your_username/.sdkman/candidates/java/11.0.21-tem"
        },
        {
            "name": "JavaSE-17",
            "path": "/Users/your_username/.sdkman/candidates/java/17.0.9-tem",
            "default": true // Java 17을 전역 기본값으로 설정
        },
        {
            "name": "JavaSE-21",
            "path": "/Users/your_username/.sdkman/candidates/java/21.0.1-tem"
        }
    ],

    // ... 다른 설정들이 있을 수 있습니다 ...
}

파일을 수정한 후 저장(Ctrl+S)하면, 이제 VS Code는 여러분이 등록한 모든 JDK의 존재를 인지하게 됩니다.

4. 프로젝트에 특정 Java 버전 적용하기

전역 사용자 설정에 사용 가능한 JDK 목록을 성공적으로 등록했다면, 이제 각 프로젝트에 맞는 특정 버전을 할당할 차례입니다. 이 작업은 '작업 영역 설정'을 통해 이루어지며, 매우 직관적인 방법으로 진행할 수 있습니다.

가. 프로젝트 폴더 열기

먼저 VS Code에서 Java 버전을 지정하고 싶은 프로젝트 폴더를 엽니다. (File > Open Folder...)

나. 명령 팔레트를 이용한 JDK 버전 변경 (권장)

VS Code의 Java 확장 기능은 이 과정을 매우 편리하게 만들어주는 UI를 제공합니다.

  1. 프로젝트가 열린 상태에서 명령 팔레트(Ctrl+Shift+P)를 엽니다.
  2. Java: Configure Java Runtime를 입력하고 실행합니다.
  3. 화면 상단에 현재 프로젝트의 구성 정보(Project JDKs, Java Tooling Runtime)가 나타납니다.
  4. 'Project JDKs' 섹션 아래에 있는 프로젝트 이름(예: 'my-legacy-project')을 클릭합니다.
  5. 새로운 팝업 창에 우리가 앞서 사용자 설정에 등록했던 JDK 목록(JavaSE-1.8, JavaSE-11, JavaSE-17 등)이 나타납니다.
  6. 이 프로젝트에서 사용할 JDK 버전(예: JavaSE-1.8)을 선택합니다.

이 과정을 마치면, VS Code는 자동으로 프로젝트 루트 디렉토리에 .vscode 폴더를 생성하고, 그 안에 다음과 같은 내용의 settings.json 파일을 만들어줍니다.


{
    "java.configuration.updateBuildConfiguration": "automatic",
    "java.jdt.ls.java.home": "/Users/your_username/.sdkman/candidates/java/8.0.392-tem"
}

또는 구버전의 확장에서는 아래와 같은 속성을 사용할 수 있습니다.


{
    "java.configuration.defaultRuntime": "JavaSE-1.8"
}

java.jdt.ls.java.home 설정은 자바 언어 서버(JDT LS)가 사용할 JDK 경로를 직접 지정하는 가장 확실한 방법입니다. 이 설정이 존재하면 해당 프로젝트는 항상 지정된 JDK를 사용하여 코드 분석, 자동 완성 등의 언어 관련 기능을 수행하게 됩니다.

다. 상태 표시줄을 이용한 확인 및 변경

설정이 올바르게 적용되었는지 확인하는 가장 쉬운 방법은 VS Code 편집기 우측 하단의 상태 표시줄을 보는 것입니다.

  • 상태 표시줄에 현재 프로젝트에 적용된 자바 버전(예: `JavaSE-1.8`)이 표시됩니다.
  • 만약 이 부분을 클릭하면, 다시 한번 JDK를 선택할 수 있는 메뉴가 나타나므로, 매우 빠르고 간편하게 버전을 전환할 수 있습니다.

이제 다른 프로젝트(예: 'new-microservice')를 열고 동일한 과정을 반복하여 JavaSE-17을 지정할 수 있습니다. 이렇게 함으로써 각 프로젝트 폴더는 자신만의 독립적인 자바 런타임 환경 설정을 갖게 되며, 프로젝트를 전환할 때마다 VS Code가 자동으로 해당 프로젝트에 맞는 JDK 환경을 구성해줍니다.

5. 고급 활용 및 문제 해결

기본적인 설정 방법을 익혔다면, 실제 개발 현장에서 마주할 수 있는 몇 가지 고급 주제와 일반적인 문제 해결 방법을 알아보겠습니다.

가. 빌드 도구(Maven/Gradle)와의 연동

Maven이나 Gradle 같은 빌드 도구를 사용하는 프로젝트에서는 두 가지 종류의 JDK 설정이 존재합니다.

  1. VS Code의 자바 언어 서버(JDT LS)가 사용하는 JDK: 지금까지 우리가 설정한 것으로, 코드 편집, 자동 완성, 오류 검출 등 IDE 기능에 사용됩니다.
  2. 빌드 도구가 컴파일에 사용하는 JDK: `pom.xml`이나 `build.gradle` 파일에 명시된 소스/타겟 호환성 버전입니다.

이 두 버전이 일치하지 않으면 "The compiler compliance specified is 1.8 but a JRE 11 is used"와 같은 경고가 발생할 수 있습니다. 가장 좋은 방법은 이 두 버전을 일치시키는 것입니다.

VS Code의 Java 확장 기능은 java.configuration.updateBuildConfiguration 설정이 "automatic"(기본값)일 때, IDE의 JDK 버전을 변경하면 빌드 파일(`pom.xml`, `build.gradle`)의 관련 설정을 함께 업데이트할지 묻는 편리한 기능을 제공합니다. 이를 통해 설정의 불일치로 인한 혼란을 크게 줄일 수 있습니다.

Maven (`pom.xml`)


<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

Gradle (`build.gradle`)


java {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}

VS Code에서 JDK를 1.8로 설정했다면, 빌드 파일의 이 부분도 1.8로 맞춰주는 것이 좋습니다.

나. 일반적인 문제와 해결책

  • 문제: "JDK could not be found."
    • 원인: settings.json에 입력한 path가 잘못되었거나, 해당 경로에 유효한 JDK가 존재하지 않습니다.
    • 해결책:
      1. 경로에 오타가 없는지 다시 확인합니다.
      2. 경로가 JDK의 최상위 디렉토리(예: /path/to/jdk-11)를 가리키는지 확인합니다. /path/to/jdk-11/bin이 아니어야 합니다.
      3. 터미널이나 파일 탐색기에서 해당 경로가 실제로 존재하는지 확인합니다.
  • 문제: JDK를 변경했지만 프로젝트에 반영되지 않는 것 같습니다.
    • 원인: 설정이 캐시되었거나, 언어 서버가 재시작되지 않았을 수 있습니다.
    • 해결책:
      1. 명령 팔레트(Ctrl+Shift+P)를 열고 Java: Clean Java Language Server Workspace를 실행하여 캐시를 정리합니다.
      2. 이후, Developer: Reload Window를 실행하여 VS Code 창을 새로고침하면 대부분 해결됩니다.
  • 문제: settings.json 파일에 오류가 있다는 메시지가 표시됩니다.
    • 원인: JSON 문법 오류입니다. 쉼표(,)가 누락되었거나, 마지막 항목 뒤에 불필요한 쉼표가 있는 경우가 가장 흔합니다.
    • 해결책: VS Code 편집기가 빨간색 밑줄로 표시해주는 오류 부분을 확인하고 수정합니다. 중괄호({})나 대괄호([])의 짝이 맞는지도 확인합니다.

결론: 생산성을 극대화하는 맞춤형 개발 환경

VS Code에서 여러 버전의 자바 JDK를 관리하는 것은 더 이상 복잡하고 어려운 작업이 아닙니다. 사용자 설정(User Settings)에 사용 가능한 모든 JDK를 '라이브러리'처럼 등록해두고, 각 프로젝트의 필요에 따라 작업 영역 설정(Workspace Settings)을 통해 원하는 버전을 '선택'하는 명확한 분리 전략을 사용함으로써, 우리는 놀라울 정도로 유연하고 강력한 개발 환경을 구축할 수 있습니다.

이러한 체계적인 접근 방식은 단순히 JDK를 전환하는 편리함을 넘어, 프로젝트 간의 의존성을 명확히 하고, 환경 설정 오류로 인한 시간 낭비를 방지하며, 궁극적으로는 개발자가 온전히 비즈니스 로직과 코드 품질에 집중할 수 있도록 돕습니다. 이제 여러분은 어떤 자바 버전 요구사항을 가진 프로젝트라도 자신 있게 VS Code로 열고, 단 몇 번의 클릭만으로 최적화된 개발 환경을 구성할 수 있게 되었습니다. 이는 현대적인 폴리글랏(polyglot) 개발 시대에 자바 개발자가 갖추어야 할 핵심적인 역량 중 하나입니다.


0 개의 댓글:

Post a Comment