[Java] JDK 버전, javac와 java 차이, 그리고 IDE 빌드 시스템 정리


스프링(Spring)이나 자바(Java)를 공부하다 보면 가장 먼저 부딪히는 부분이 있다.
바로 JDK 버전 차이, javac/java 명령어, 그리고 Gradle, Maven 같은 빌드 시스템이다.
처음 접할 때는 개념이 섞여서 헷갈리기 쉬운데, 한 번에 큰 그림을 잡아두면 이후 학습이 훨씬 수월해진다.

이번 글에서는 실제로 많이 묻는 질문들을 묶어서 정리해본다.



Java 8과 Java 21의 차이


많은 강의가 여전히 Java 8을 기준으로 설명한다.
하지만 요즘 개발 환경에서는 Java 17이나 Java 21 같은 최신 LTS(Long Term Support) 버전을 더 자주 사용한다.

  • Java 8 (2014 출시)

    • 람다(Lambda), 스트림(Stream), Optional, 새로운 날짜/시간 API가 도입되었다.
    • 이 시점을 기점으로 현대적인 자바 문법이 자리 잡았다.
  • Java 21 (2023 출시, 최신 LTS)

    • record 클래스, sealed 클래스, switch 표현식, 패턴 매칭 같은 새로운 문법을 제공한다.
    • Virtual Thread(Project Loom) 지원으로 동시성 프로그래밍 성능이 크게 개선되었다.
    • GC(가비지 컬렉터)도 발전하여 대규모 애플리케이션에서 더 효율적이다.

정리하면, Java 21은 Java 8의 모든 기능을 포함하고 추가 기능이 더 많다.
따라서 학습을 목적으로 한다면 최신 버전을 그대로 사용해도 문제가 없다.
다만 강의 예제 코드가 Java 8 기준이라면 화면이나 설치 과정에서 차이가 있을 수 있으니 주의할 필요가 있다.



javac와 java 명령어 차이


자바 개발을 처음 배우면 javacjava 명령어의 차이가 헷갈리곤 한다.

  • javac

    • Java Compiler의 줄임말이다.
    • .java 소스 파일을 컴파일해서 .class 바이트코드 파일을 생성한다.
    • 예: javac Hello.javaHello.class 생성
  • java

    • JVM(Java Virtual Machine)을 실행하는 명령어이다.
    • .class 파일을 읽어 실제 실행한다.
    • 예: java HelloHello.class 실행

흐름을 정리하면, javac번역기, java낭독기라고 비유할 수 있다.
즉, 1) javac로 소스를 바이트코드로 변환하고, 2) java로 JVM에서 실행하는 구조이다.



IDE(IntelliJ)에서 실행 버튼을 누르면?


많은 자바 개발자가 JetBrains의 IntelliJ IDEA를 사용한다.
여기서 실행 버튼(▶️)을 누르면 내부적으로는 javacjava가 자동으로 실행된다.
하지만 단순히 명령어만 실행하는 것이 아니라, IDE는 프로젝트 설정에 따라 클래스패스(classpath), 라이브러리(JAR), 빌드 툴(Gradle/Maven) 설정까지 함께 관리한다.

즉, 개발자가 매번 명령어를 수동으로 입력하지 않아도 IDE가 대신 처리해주는 셈이다.
이 덕분에 코드 작성 → 빌드 → 실행 → 디버깅까지 한 번에 진행할 수 있다.



빌드 시스템: Gradle vs Maven vs IntelliJ Build


스프링 프로젝트를 진행하다 보면 빌드 시스템 선택이 필수적이다.

  • Gradle
    • Groovy 또는 Kotlin DSL 기반의 빌드 스크립트를 사용한다.
    • 캐시와 병렬 빌드가 지원되어 속도가 빠르다.
    • 최신 스프링 부트 프로젝트에서 기본적으로 권장된다.

Gradle DSL: Groovy vs Kotlin

Gradle을 사용할 때는 빌드 스크립트를 어떤 언어로 작성할지 정해야 한다.
기본적으로 두 가지 DSL(Domain Specific Language)을 지원한다.

  • Groovy DSL (build.gradle)

    • 전통적인 방식, 예제와 자료가 많다.
    • 동적 타입 기반이라 문법이 유연하지만, 자동완성이나 에러 검출은 다소 약하다.
  • Kotlin DSL (build.gradle.kts)

    • 정적 타입 기반이라 IDE 자동완성이 강력하다.
    • 최근 Gradle과 스프링 공식 문서에서 적극적으로 권장되는 방식이다.
    • 러닝 커브가 있지만, 유지보수성과 타입 안정성이 뛰어나다.
      정리하면, 새로운 스프링 부트 프로젝트를 시작한다면 Kotlin DSL을 추천한다.
      다만, 강의나 기업 프로젝트에서 Groovy DSL을 사용한다면 그대로 따라가는 것도 문제없다. 빌드 결과는 동일하기 때문이다.



  • Maven

    • XML 기반 빌드 설정을 사용한다.
    • 표준화된 구조 덕분에 배우기 쉽고 예제와 문서가 많다.
    • 보수적인 기업 프로젝트에서 여전히 널리 쓰인다.
  • IntelliJ Build

    • IDE 내부 전용 빌드 기능이다.
    • 로컬에서 빠른 테스트에는 적합하지만, CI/CD 파이프라인이나 배포 환경에서는 한계가 있다.

정리하면, 개인 프로젝트나 최신 환경에서는 Gradle,
기업이나 강의에서 정해둔 환경이 있다면 Maven,
그리고 IDE 빌드는 보조 수단 정도로 쓰는 것이 가장 합리적이다.



Java 21과 Virtual Thread


스레드(Thread)는 자바 학습에서 중요한 주제다.
기존에는 플랫폼 스레드(운영체제 스레드) 기반으로 동작했지만, Java 21에서는 Virtual Thread(Project Loom) 가 정식 도입되었다.

  • 플랫폼 스레드

    • 운영체제 스레드와 1:1 매핑된다.
    • 무겁고, 동시에 수천 개 이상 띄우기에는 한계가 있다.
  • 가상 스레드 (Virtual Thread)

    • JVM이 관리하는 경량 스레드이다.
    • 수십만 개를 띄워도 부담이 적어 블로킹 I/O 처리에 특히 유리하다.
    • 코드 작성 방식은 기존 스레드와 거의 같지만, 성능상 이점이 크다.

예시 (Java 21):

public class VtDemo {
  public static void main(String[] args) throws Exception {
    try (var exec = java.util.concurrent.Executors.newVirtualThreadPerTaskExecutor()) {
      var futures = java.util.stream.IntStream.range(0, 10_000)
        .mapToObj(i -> exec.submit(() -> {
          Thread.sleep(50); // 블로킹 I/O 흉내
          return i;
        }))
        .toList();
      for (var f : futures) f.get();
      System.out.println("done");
    }
  }
}



마무리


자바를 학습하다 보면 JDK 버전, javac/java 명령어, 빌드 툴 같은 개념이 따로따로 나와서 혼란스럽기 쉽다.
하지만 큰 그림을 먼저 이해하면 어떤 버전을 쓰든, 어떤 IDE를 쓰든 빠르게 적응할 수 있다.


Author: Ruby Kim
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Ruby Kim !
Comments
  TOC