TECH/웹개발

[Java] LTS 완벽 가이드: Java 11, 17, 21 핵심 기능과 실무 적용 코드 예시

런코리치 2026. 2. 25. 20:00

[Java] Java 11, 17, 21: 실무에서 반드시 알아야 할 버전별 핵심 기능 심층 분석

자바는 이제 6개월마다 새로운 버전을 내놓고 있지만, 기업 환경에서는 안정성이 보장된 LTS(Long Term Support) 버전을 선택합니다. 현재 가장 많이 쓰이는 11, 17 그리고 차세대 표준인 21 버전에서 무엇이 변했고, 우리의 코드가 어떻게 달라져야 하는지 상세 예시와 함께 알아보겠습니다.


1. Java 11: "현대적 인프라와 가독성의 조화"

Java 8이 패러다임의 전환이었다면, 11은 실무적인 편의성과 클라우드 환경에 최적화된 기능을 제공합니다.

① 로컬 변수 타입 추론 (var)

자바의 장황함을 줄여주는 혁신적인 기능입니다. 컴파일러가 대입되는 값을 보고 타입을 자동으로 추론합니다.

  • 예시:
    • 주의: 가독성을 해치지 않는 선에서 사용해야 하며, 멤버 변수나 메서드 파라미터에는 사용할 수 없습니다.
  • Java
    // 과거
    Map<String, List<User>> userMap = new HashMap<String, List<User>>();
    
    // Java 11
    var userMap = new HashMap<String, List<User>>(); // 가독성이 훨씬 좋아짐
    

② 새로운 HTTP Client (표준 도입)

그동안 자바는 외부 라이브러리(Apache HttpClient 등) 없이는 HTTP 통신이 불편했습니다. 이제 표준 API로 비동기 통신을 우아하게 처리할 수 있습니다.

  • 특징: HTTP/2 지원, WebSocket 지원, CompletableFuture를 통한 비동기 처리.

③ String & Files API 확장

  • "".isBlank(): 공백 문자열인지 확인.
  • "ABC".repeat(3): "ABCABCABC" 생성.
  • Files.readString(path): 파일을 문자열로 한 번에 읽기.

2. Java 17: "객체 지향 설계의 완성"

Java 17은 불필요한 보일러플레이트(반복적인 코드)를 제거하고, 상속 구조를 명확히 제어하는 데 집중했습니다.

① Record 클래스 (Data Carrier)

DTO나 VO를 만들 때 Getter, 생성자, toString(), equals(), hashCode()를 직접 만드는 수고를 완전히 없앴습니다.

  • 코드 비교:
  • Java
    // Java 17 Record
    public record UserDto(Long id, String name, String email) {}
    
    // 사용 예시
    UserDto user = new UserDto(1L, "Gemini", "test@test.com");
    System.out.println(user.name()); // getter 대신 메서드 형태로 제공
    

② Sealed Classes (상속의 제한)

아무나 상속받지 못하도록 설계자가 허용한 클래스만 상속을 허용합니다. 도메인 모델링을 할 때 매우 강력한 도구가 됩니다.

  • 예시:
  • Java
    public sealed interface Shape permits Circle, Rectangle {} // 두 클래스만 상속 가능
    

③ Switch Expression & Text Blocks

  • Switch: case -> 문법을 도입하여 가독성을 높이고 값을 직접 반환할 수 있습니다.
  • Text Blocks: """를 사용하여 JSON이나 SQL 쿼리를 여러 줄에 걸쳐 깔끔하게 작성합니다.
  • Java
    String json = """
        {
            "name": "Gemini",
            "version": 17
        }
        """;
    

3. Java 21: "고성능 서버의 패러다임 시프트"

Java 21의 주인공은 단연 Virtual Threads입니다. 자바 서버 성능의 물리적 한계를 깼다는 평가를 받습니다.

① Virtual Threads (경량 스레드)

기존 자바 스레드는 OS 스레드와 1:1 매핑되어 생성 비용이 비싸고 개수 제한이 컸습니다. 가상 스레드는 JVM이 수십만 개의 스레드를 가볍게 관리합니다.

  • 혁신: 이제 '스레드 하나당 요청 하나' 처리 방식(Thread-per-request)을 사용해도 수만 건의 동시 접속을 거뜬히 처리합니다. WebFlux 같은 복잡한 리액티브 프로그래밍의 대안이 되고 있습니다.

② Pattern Matching for switch (정식 도입)

switch 문에서 객체의 타입을 판별하고, 변수로 바로 바인딩할 수 있습니다.

  • 예시:
  • Java
    static String formatter(Object obj) {
        return switch (obj) {
            case Integer i -> String.format("int %d", i);
            case Long l    -> String.format("long %d", l);
            case String s  -> String.format("String %s", s);
            default        -> obj.toString();
        };
    }
    

🏁 결론: 어떤 버전을 공부해야 할까?

  1. Java 11: var와 현대적 API 사용법에 익숙해지는 단계. (현업 점유율 가장 높음)
  2. Java 17: RecordText Blocks를 활용해 코드를 깔끔하게 다듬는 단계. (신규 프로젝트 표준)
  3. Java 21: 가상 스레드의 원리를 이해하고 고성능 서버 환경을 준비하는 단계. (앞으로의 대세)

이 흐름을 이해하고 블로그에 정리하신다면, 단순히 기능을 아는 것을 넘어 "자바 언어가 성능과 생산성을 위해 어떻게 진화해 왔는가"에 대한 통찰력을 보여주실 수 있습니다.