Daily-It

개발, AI, 인프라, 자동화와 일상 IT 제품 후기를 직접 써보며 정리하는 기술 블로그입니다.

JDK 28 Project Valhalla 핵심 변화 정리: Java 성능 개선은 어디까지 기대할까

요약

Project Valhalla는 Java가 오랫동안 안고 있던 “객체 모델과 primitive 성능 사이의 간극”을 줄이려는 프로젝트입니다. JDK 28을 바라보는 흐름에서 특히 주목되는 것은 JEP 401의 value class와 JEP 402의 enhanced primitive boxing입니다.

다만 기대와 현실은 나눠서 봐야 합니다. Valhalla가 들어온다고 Java가 갑자기 Go나 Rust처럼 바뀌는 것은 아닙니다. 대신 작은 값 객체, 메모리 layout, primitive/object 통합 방향에서 Java의 성능 하한을 끌어올릴 가능성이 있습니다.

목차

Project Valhalla를 한 문장으로 보면

Project Valhalla를 한 문장으로 요약하면 이렇습니다.

Java의 객체지향 추상화와 primitive에 가까운 성능 특성을 더 잘 결합하려는 시도입니다.

Java는 객체지향 모델이 강합니다. 큰 시스템을 구조화하고 오래 유지보수하기 좋습니다. 하지만 성능 민감한 영역에서는 primitive와 객체의 차이가 계속 문제가 됩니다.

int는 빠르고 가볍지만 도메인 의미가 약합니다. Money, Point, UserId 같은 객체는 의미가 좋지만, 대량으로 만들면 allocation, reference, GC 부담이 생깁니다. Valhalla는 이 간극을 줄이려 합니다.

JEP 401: Value Classes and Objects

JEP 401은 Value Classes and Objects (Preview)입니다. 핵심은 identity가 없는 객체를 Java 플랫폼에 도입하는 것입니다.

기존 객체는 identity가 있습니다. 같은 값을 가져도 서로 다른 객체일 수 있습니다.

new Point(1, 2) == new Point(1, 2) // 일반 객체에서는 보통 false

value object는 identity보다 값 자체가 중요합니다. JEP 401의 예시는 이런 방향입니다.

value record Point(int x, int y) {}

Point p = new Point(17, 3);
Objects.hasIdentity(p);      // false
new Point(17, 3) == p;       // true

이 변화는 단순히 ==가 달라지는 정도가 아닙니다. identity가 없다는 것은 JVM이 객체를 더 자유롭게 최적화할 수 있다는 뜻입니다.

value class가 성능에 주는 의미

value class의 성능상 의미는 크게 세 가지입니다.

첫째, allocation을 줄일 가능성이 있습니다. identity가 없다면 JVM은 객체를 꼭 heap에 독립적으로 만들어야 한다는 제약이 줄어듭니다.

둘째, memory layout을 더 compact하게 만들 수 있습니다. 객체 배열이 reference 배열이 아니라 값에 가까운 layout으로 최적화될 가능성이 생깁니다.

셋째, 도메인 모델을 유지하면서 성능 손해를 줄일 수 있습니다. Money, Point, Range, MetricPoint 같은 타입을 의미 있게 표현하면서도 primitive에 가까운 최적화를 기대할 수 있습니다.

물론 “항상 빨라진다”는 뜻은 아닙니다. 실제 성능은 JVM 구현, 코드 형태, JIT 최적화, 데이터 크기, GC 상황에 따라 달라집니다. 그래서 실제로 나오면 반드시 테스트가 필요합니다.

JEP 402: Enhanced Primitive Boxing

JEP 402는 Enhanced Primitive Boxing (Preview)입니다. 이 문서는 primitive와 wrapper class 사이의 오래된 간극을 줄이는 방향을 다룹니다.

Java에는 오래전부터 primitive와 reference type 사이의 어색한 구분이 있었습니다.

int       vs Integer
long      vs Long
double    vs Double

이 구분은 성능과 표현력 사이에서 계속 문제를 만들었습니다. primitive는 빠르지만 generic과 잘 맞지 않았고, wrapper는 generic과 잘 맞지만 객체 비용이 있었습니다.

JEP 402는 value object와 null-restricted type 같은 Valhalla의 다른 변화와 함께, boxing을 더 자연스럽고 효율적으로 다루려는 방향입니다.

Generics 성능은 바로 해결될까

여기서 기대를 조절해야 합니다. 많은 개발자가 원하는 것은 List<int>int[]처럼 빠르게 동작하는 것입니다. 하지만 JEP 402 문서에서도 generics는 여전히 erasure 기반이라고 설명합니다.

즉 Valhalla가 들어온다고 해서 primitive generics 성능 문제가 한 번에 해결되는 것은 아닙니다.

기대해도 되는 것:
- primitive와 wrapper 사이의 불필요한 간극 감소
- value class 기반 최적화 가능성
- 향후 specialized generics로 이어질 기반

아직 조심해야 하는 것:
- List<int>가 곧바로 int[]처럼 되는 기대
- 모든 generic 코드가 자동으로 빨라질 것이라는 기대

Valhalla는 한 번의 기능 추가라기보다 단계적으로 Java 타입 시스템과 JVM을 바꾸는 흐름에 가깝습니다.

JDK 28에서 기대할 수 있는 것과 아직 이른 것

JVM Weekly 등에서는 JEP 401이 JDK 28을 target으로 한다는 흐름을 언급했습니다. 다만 중요한 것은 Preview라는 점입니다. Preview 기능은 실제 사용해보며 피드백을 받고, 이후 버전에서 수정될 수 있습니다.

JDK 28 시점에 기대할 만한 것은 다음과 같습니다.

  • value class 문법과 동작을 실험해볼 수 있음
  • identity 없는 객체 모델을 체감할 수 있음
  • 작은 값 객체의 설계 방향을 검토할 수 있음
  • JVM이 어떤 최적화를 제공하는지 벤치마크할 수 있음

아직 이른 기대도 있습니다.

  • 기존 대규모 서비스를 바로 value class로 전환
  • 모든 DTO나 record를 value class로 교체
  • generics 성능 문제가 즉시 해결된다고 판단
  • Go/Rust와 같은 데이터 layout 제어를 그대로 기대

실무에서는 먼저 작은 실험과 벤치마크가 맞습니다.

실무 개발자는 무엇을 준비하면 좋을까

지금 당장 모든 코드를 바꿀 필요는 없습니다. 대신 다음 관점으로 코드를 바라보면 좋습니다.

첫째, identity가 필요 없는 타입을 구분해봅니다.

Money
Point
Range
UserId
OrderId
EventTime
MetricPoint

둘째, 성능 때문에 primitive로 내려간 코드가 있는지 찾아봅니다. 나중에 value class가 안정화되면 이런 부분이 다시 의미 있는 타입으로 돌아올 후보가 됩니다.

셋째, 벤치마크 기준을 준비합니다. Valhalla는 실제 데이터 크기와 코드 패턴에 따라 효과가 달라질 수 있습니다. JMH 같은 도구로 allocation rate, throughput, GC behavior를 함께 보는 것이 좋습니다.

넷째, Preview 기능이라는 점을 잊지 않아야 합니다. 프로덕션 전면 도입보다 학습과 실험이 먼저입니다.

결론

JDK 28 Project Valhalla에서 기대되는 변화는 Java 개발자에게 꽤 중요합니다. 특히 JEP 401의 value class는 Java가 오랫동안 가지고 있던 객체 모델과 성능 모델 사이의 간극을 직접 건드립니다.

하지만 기대는 현실적으로 해야 합니다. Valhalla는 Java를 Rust나 Go로 바꾸는 기능이 아닙니다. Java가 Java다운 방식으로 더 나은 성능 특성을 갖도록 만드는 변화입니다.

저는 이 방향이 좋습니다. Java를 오래 써왔고 여전히 좋아하는 입장에서, 익숙한 언어가 현대적인 성능 요구에 맞춰 계속 좋아지는 것은 반가운 일입니다. 실제로 나오면 여러 방식으로 테스트해봐야겠지만, 개인적으로는 충분히 기대하고 있습니다.

참고 자료

  • 원글: Java Project Valhalla와 value class, Java 성능 개선의 희망이 될까
  • OpenJDK Project Valhalla: https://openjdk.org/projects/valhalla/
  • JEP 401: Value Classes and Objects (Preview): https://openjdk.org/jeps/401
  • JEP 402: Enhanced Primitive Boxing (Preview): https://openjdk.org/jeps/402
  • JVM Weekly, Project Valhalla Explained: https://www.jvm-weekly.com/p/project-valhalla-explained-how-a