Java 26 신기능, 진짜 쓸 수 있는 것 따로 있습니다

Published on

in

Java 26 신기능, 진짜 쓸 수 있는 것 따로 있습니다

2026.03.17 기준
JDK 26 GA
non-LTS

Java 26 신기능, 진짜 쓸 수 있는 것 따로 있습니다

10개 JEP가 한꺼번에 발표됐지만, 막상 들여다보면 오늘 당장 쓸 수 있는 기능과 아직 실험 단계인 기능이 완전히 나뉩니다. 결론부터 말씀드리면, Java 26에서 코드 한 줄 안 바꾸고 성능이 올라가는 경우가 있습니다. G1 GC 기준 처리량 5~15% 향상이 그게 해당됩니다. (출처: OpenJDK JEP 522, 2026.03.17)

10개
JEP 총수
5개
즉시 사용 가능
5개
Preview/Incubator

JEP 10개, 뭐가 다른가 — 한눈에 보는 분류표

Java 26은 2026년 3월 17일 JavaOne 2026에서 정식 출시됐습니다. 오라클 공식 발표에 따르면 이번 릴리스에는 10개의 JEP(JDK Enhancement Proposal)가 포함돼 있고, 그 중 5개는 확정(Finalized), 4개는 미리보기(Preview), 1개는 인큐베이터(Incubator) 상태입니다. (출처: Oracle Java 26 공식 보도자료, 2026.03.17)

이 구분이 중요한 이유가 있습니다. Preview와 Incubator 기능은 --enable-preview 플래그 없이는 컴파일 자체가 안 됩니다. 프로덕션 코드에 올리면 다음 버전에서 API가 바뀌어 다시 깨질 수도 있습니다.

JEP 기능명 상태 즉시 사용
522 G1 GC 처리량 개선 확정
516 AOT 객체 캐싱 (모든 GC) 확정
517 HTTP/3 지원 확정
500 final 필드 변경 경고 확정
504 Applet API 완전 제거 확정
524 PEM 인코딩 (2차 미리보기) Preview ⚠️
525 구조화된 동시성 (6차 미리보기) Preview ⚠️
526 Lazy Constants (2차 미리보기) Preview ⚠️
530 기본 유형 패턴 (4차 미리보기) Preview ⚠️
529 Vector API (11차 인큐베이터) Incubator

⚠️ Preview는 --enable-preview 필요. ❌ Incubator는 --add-modules jdk.incubator.vector 필요.

▲ 목차로 돌아가기

G1 GC 처리량 5~15% 향상 — 코드 0줄 바꾸고 성능이 오릅니다

💡 공식 JEP 문서와 실제 벤치마크 수치를 같이 놓고 보니, 이 기능이 왜 Java 26 전체에서 가장 중요한 변화인지 보입니다.

JEP 522는 G1 가비지 컬렉터에서 애플리케이션 스레드와 GC 스레드 사이의 동기화를 줄이는 방식으로 처리량을 높입니다. OpenJDK 공식 JEP 522 벤치마크 기준 처리량 개선폭은 5~15%입니다. (출처: OpenJDK JEP 522, openjdk.org/jeps/522) 이게 단순한 숫자가 아닌 이유는, 쓰레기 수집기가 기본값이기 때문입니다 — G1은 JDK 9부터 디폴트 GC이고 별도 설정이 없다면 지금도 G1이 돌고 있을 가능성이 높습니다.

기존에 많은 블로그들이 언어 기능(Structured Concurrency, Primitive Patterns 등)을 Java 26 최대 화제로 소개합니다. 막상 프로덕션 관점에서 오늘 당장 영향을 주는 건 JVM 성능 개선 쪽이 훨씬 큽니다. SAP의 JVM 개발자 Johannes Bechberger는 “Java 26에서 가장 중요한 실용적 개선은 언어나 API가 아니라 G1 GC 처리량 향상”이라고 직접 언급했습니다. (출처: mostlynerdless.de, 2026.03.17)

📌 G1 GC 개선 배경 — dual card-table 제거

기존 G1 GC는 쓰기 배리어(write barrier) 처리 시 이중 카드 테이블 구조를 사용했고, 이 과정에서 스레드 간 불필요한 동기화가 발생했습니다. Java 26은 이 구조를 단순화해 동기화 오버헤드를 줄였습니다. (출처: OpenJDK JEP 522) 추가 하드웨어 없이 더 많은 요청을 처리한다는 뜻입니다.

▲ 목차로 돌아가기

AOT 객체 캐싱, JDK 24와 뭐가 달라졌나

💡 공식 발표문과 JDK 24 릴리스 노트를 교차해서 보면, 이번 변화가 단순 확장이 아니라 쓸 수 있는 범위가 달라진 것임을 알 수 있습니다.

AOT 객체 캐싱(JEP 516)은 JDK 24(JEP 483)에서 먼저 도입됐지만, 당시에는 G1 GC에서만 동작했습니다. Java 26에서 ZGC를 포함한 모든 GC로 확장됐습니다. (출처: Oracle Java 26 공식 보도자료, oracle.com/kr) 저지연 워크로드에 ZGC를 쓰는 팀이라면 이번에 처음으로 AOT 캐싱 혜택을 받을 수 있습니다.

실제로 이걸 쓰는 흐름은 3단계입니다. 첫 번째로 훈련 실행(training run)을 통해 시작 시 생성되는 객체를 기록하고, 두 번째로 AOT 캐시를 생성하고, 세 번째로 캐시를 불러와 애플리케이션을 시작합니다. 아래처럼 JVM 플래그 수준에서 설정합니다.

# 1단계: 훈련 실행
java -XX:AOTCacheOutput=app.aot -jar myapp.jar
# 2단계: 이후 실행 (ZGC 사용 예시)
java -XX:AOTCache=app.aot -XX:+UseZGC -jar myapp.jar

마이크로서비스나 컨테이너 환경에서는 시작 시간이 직접적으로 스케일링 속도에 영향을 미칩니다. 코드 변경 없이 JVM 시작 시간을 줄일 수 있다는 점에서 G1 GC 처리량 개선과 함께 즉시 효과를 기대할 수 있는 변경입니다.

▲ 목차로 돌아가기

HTTP/3 표준 탑재 — 기대만큼은 아닌 이유

JEP 517은 java.net.http.HttpClient API에 HTTP/3(QUIC 기반) 지원을 추가합니다. Java 11부터 있던 HttpClient에 HttpClient.Version.HTTP_3를 명시하면 HTTP/3로 통신하고, 서버가 지원하지 않으면 HTTP/2·HTTP/1.1로 자동 폴백합니다. (출처: OpenJDK JEP 517, openjdk.org/jeps/517) API 변경 없이 opt-in 방식이라 기존 코드에 영향을 주지 않습니다.

솔직히 말하면, HTTP/3가 있다고 당장 체감 성능이 올라가는 팀은 많지 않습니다. Netty 개발자가 직접 “HTTP는 보통 병목이 아니고, HTTP/2로도 충분하다”고 밝혔습니다. (출처: mostlynerdless.de, 2026.03.17) HTTP/3의 실질적 이득은 고지연 네트워크나 패킷 손실이 잦은 환경에서 두드러지는데, 내부 마이크로서비스 간 통신보다는 외부 API 클라이언트 쪽이 해당됩니다.

📌 HTTP/3가 실제로 유리한 경우

모바일 네트워크 기반 API 클라이언트, 글로벌 CDN 연동, 패킷 손실이 있는 환경에서 연결 복구 시간을 줄이고 싶을 때입니다. 데이터센터 내부 서비스 간 통신에는 HTTP/2면 충분합니다.

▲ 목차로 돌아가기

final 필드 경고 시작 — Jackson, Gson 쓴다면 지금 확인하세요

💡 많이 다루지 않는 부분인데, 공식 JEP 500 문서와 실제 라이브러리 동작 방식을 같이 보면 이게 왜 바로 체크해야 하는 항목인지 드러납니다.

JEP 500은 리플렉션으로 final 필드를 강제 수정하는 코드에 경고를 추가합니다. Java 26에서는 아직 경고(WARNING) 수준이지만, 오라클은 미래 버전에서 이를 완전히 차단할 계획을 공식화했습니다. (출처: OpenJDK JEP 500, openjdk.org/jeps/500) 문제는 Jackson, Gson, 그리고 일부 직렬화·의존성 주입 프레임워크들이 내부적으로 이 방식을 사용한다는 점입니다.

Java 26으로 올리고 나서 콘솔에 WARNING: Reflective mutation of final field 메시지가 뜬다면, 그건 해당 라이브러리 버전에서 이미 감지된 겁니다. 지금 당장 앱이 터지진 않지만, 다음 LTS(JDK 29 또는 31 예상)에서 이 경고가 예외(exception)로 바뀔 수 있습니다. Jackson은 2.18 이상, Gson은 2.11 이상 버전으로 올리면 이 경고를 피할 수 있습니다. (출처: dev-post.com Java 26 분석, 2026.03.20 기준 정보)

⚠️ 업그레이드 전 체크 포인트

Jackson-databind 버전이 2.18 미만이거나, Gson 2.11 미만이면 Java 26 전환 시 경고가 발생할 수 있습니다. 프레임워크 측에서 패치를 내놓지 않은 경우라면 --enable-final-field-mutation 플래그로 임시 우회가 가능합니다.

▲ 목차로 돌아가기

Preview 5개 — 지금 프로덕션에 쓰면 안 되는 이유

Structured Concurrency(JEP 525), Lazy Constants(JEP 526), Primitive Patterns(JEP 530), PEM 인코딩(JEP 524), Vector API(JEP 529)는 전부 --enable-preview 또는 --add-modules 없이는 컴파일이 안 됩니다. 그리고 Preview라는 상태는 “다음 버전에서 API가 바뀔 수 있다”는 뜻입니다. Structured Concurrency는 이번이 6차 미리보기, Vector API는 무려 11차 인큐베이터입니다. (출처: OpenJDK Project JDK/26, openjdk.org/projects/jdk/26)

이걸 프로덕션에 올렸다가 Java 27로 올릴 때 API가 바뀌면 다시 고쳐야 합니다. 6개월마다 한 번씩 그 작업을 반복하게 되는 겁니다. Preview 기능의 본래 목적은 개발자 피드백을 받아서 API를 개선하는 것입니다. 지금은 실험적으로 써보고 JDK 팀에 피드백을 보내는 쪽이 옳은 용도입니다.

📌 그래도 지금 살펴볼 가치가 있는 것

Lazy Constants(JEP 526)는 volatile + double-checked locking 패턴을 LazyConstant.of() 한 줄로 대체합니다. JVM이 이를 진짜 상수로 취급하기 때문에 constant-folding 최적화도 받습니다. 지금 당장 프로덕션에 올리진 마세요. 하지만 다음 LTS에 들어올 가능성이 있어서 미리 익혀두면 좋습니다.

▲ 목차로 돌아가기

non-LTS라는 함정 — 6개월짜리 지원의 진짜 의미

Java 26은 LTS(Long-Term Support) 버전이 아닙니다. 오라클의 프리미어 지원 기간은 2026년 9월까지, 즉 약 6개월입니다. 그 이후에는 JDK 27이 나오면서 Java 26은 더 이상 업데이트를 받지 않습니다. (출처: Oracle JDK Support Roadmap, oracle.com/java/technologies/java-se-support-roadmap.html) 엔터프라이즈 환경에서 Java 26을 프로덕션에 올리면 6개월 안에 다시 올려야 한다는 의미입니다.

가장 최근 LTS는 JDK 25이고, 그 전은 JDK 21입니다. 보수적인 업그레이드 사이클을 유지하는 팀이라면 Java 26은 프로덕션보다 스테이징 환경 검증, 새 기능 테스트, 팀 내 기술 학습용으로 활용하는 게 맞습니다. 단, G1 GC 개선이나 AOT 캐싱 효과를 빠르게 보고 싶다면, 6개월 주기 업그레이드를 수용하는 팀한테는 오늘 올릴 이유가 있습니다.

⚠️ 프로덕션 적용 전 체크리스트

프레임워크(Spring Boot, Quarkus 등) Java 26 공식 지원 여부 → 사용 중인 직렬화 라이브러리 버전(Jackson 2.18+, Gson 2.11+) → CI/CD 컨테이너 베이스 이미지 업데이트 → Applet API 의존성 코드 잔존 여부 확인 후 진행하세요.

▲ 목차로 돌아가기

자주 나오는 질문 Q&A

Q. Java 26이 non-LTS인데, 지금 업그레이드해도 괜찮을까요?
프로덕션 서버라면 신중하게 접근하는 게 맞습니다. 2026년 9월에 JDK 27이 나오면 Java 26 지원이 종료되기 때문에, 6개월 이내에 다시 업그레이드 작업을 해야 합니다. 스테이징 환경에서 G1 GC 성능 향상을 테스트하거나, 팀 내 기술 학습 목적으로는 충분히 활용할 수 있습니다. 다음 LTS(JDK 29 또는 31)가 목표라면 Java 26은 그 경로상의 중간 점검 버전으로 활용하는 게 좋습니다.
Q. G1 GC 처리량 5~15% 개선은 모든 애플리케이션에서 나타나나요?
OpenJDK 공식 JEP 522 벤치마크 기준 수치입니다. 실제 애플리케이션에서 얼마나 나타날지는 워크로드 특성에 따라 다릅니다. 쓰기 배리어가 빈번하게 발생하는 객체 그래프가 복잡한 애플리케이션일수록 효과가 크고, 단순 처리 위주 배치 작업은 상대적으로 개선폭이 작을 수 있습니다. 코드 변경 없이 JVM만 올리면 되기 때문에, 벤치마크 환경에서 직접 비교해보는 게 가장 확실한 방법입니다.
Q. Applet API가 완전히 제거됐는데, 영향받는 코드가 있으면 어떻게 하나요?
java.applet 패키지와 javax.swing.JApplet이 완전히 제거됐습니다. JDK 17에서 이미 deprecated for removal 처리됐기 때문에, 오래된 레거시 코드가 아니라면 대부분 영향이 없습니다. 만약 의존성 체인 어딘가에서 이를 참조하고 있다면 컴파일 에러가 납니다. 내 코드에서 직접 쓰지 않더라도, 오래된 서드파티 라이브러리가 참조할 수 있으니 jdeps 툴로 의존성을 미리 점검하면 좋습니다.
Q. Structured Concurrency가 6차 미리보기인데, 언제 정식이 될까요?
오라클이 정식 출시 시점을 별도로 공개하지 않은 부분입니다. JDK 21(LTS) 이후 매 버전 미리보기를 유지하면서 API를 다듬고 있고, JDK 26에서 Joiner 커스터마이징이 추가됐습니다. Project Loom과의 정합성 검토가 계속되고 있어, 다음 LTS 시점에 함께 확정될 가능성이 있다는 의견이 커뮤니티에서 나오고 있습니다. 하지만 구체적 일정은 오라클이 공식 발표한 내용이 없습니다.
Q. Oracle JDK와 OpenJDK 중 뭘 써야 하나요?
Java 26 기능 자체는 동일합니다. 차이는 라이선스와 지원 방식에 있습니다. Oracle JDK는 상용 환경에서 NFTC 라이선스 조건을 확인해야 하고, OpenJDK 빌드(Adoptium, Amazon Corretto, Azul 등)는 무료로 쓸 수 있습니다. Oracle은 OCI 환경에서 Oracle JDK를 추가 비용 없이 제공하고, Java SE 구독자에게는 새로 출시된 JVP(Java Verified Portfolio)도 무료로 제공합니다. 팀의 클라우드 환경과 라이선스 정책에 맞게 선택하면 됩니다.

▲ 목차로 돌아가기

마치며

Java 26을 정리해보면, 이번 릴리스는 화려하지 않은 대신 실용적입니다. 가장 체감되는 변화는 언어 기능이 아니라 G1 GC 처리량 5~15% 향상과 AOT 객체 캐싱 범위 확대입니다. 코드를 한 줄도 바꾸지 않고 JVM만 올려도 성능이 달라지는 릴리스는 흔하지 않습니다.

반면 많이 기대하던 Preview 기능들은 아직 완전하지 않습니다. Structured Concurrency가 6번째 미리보기라는 건 API가 아직 확정되지 않았다는 뜻이고, Vector API는 11번째 인큐베이터입니다. 프로덕션 코드에 넣기엔 이르고, 실험과 피드백 용도로 써보는 게 맞는 단계입니다.

non-LTS라는 점은 여전히 중요한 제약입니다. 6개월 지원이라는 현실을 감안하면, 엔터프라이즈 환경이라면 Java 25 LTS에서 다음 LTS를 기다리는 전략이 더 안전합니다. Java 26은 그 경로에서 성능 개선 사항을 미리 확인하고, 라이브러리 호환성을 점검하고, 팀을 준비시키는 데 쓰기 좋은 버전입니다.

📚 본 포스팅 참고 자료

  1. Oracle Java 26 공식 보도자료 — oracle.com/kr
  2. Oracle Java 기술 블로그 (The Arrival of Java 26) — blogs.oracle.com/java
  3. OpenJDK JEP 522 (G1 GC 처리량 개선) — openjdk.org/jeps/522
  4. OpenJDK JEP 500 (final 필드 뮤테이션 경고) — openjdk.org/jeps/500
  5. OpenJDK JEP 517 (HTTP/3 지원) — openjdk.org/jeps/517
  6. mostlynerdless.de — “Java 26 is boring, and that’s a good thing” (2026.03.17) — mostlynerdless.de

본 포스팅은 2026년 3월 22일 기준으로 작성됐습니다. 본 포스팅 작성 이후 서비스 정책·UI·기능이 변경될 수 있습니다. Java 26은 non-LTS 버전으로, 2026년 9월 JDK 27 출시 후 지원이 종료됩니다. 라이선스 조건(NFTC/OTN)은 oracle.com 공식 페이지에서 직접 확인하세요.

댓글 남기기


최신 글


아이테크 어른경제에서 더 알아보기

지금 구독하여 계속 읽고 전체 아카이브에 액세스하세요.

계속 읽기