핵심 요약
Java 25 (2025-09)는 새 LTS. Java 21 → 25 사이 가장 큰 변화는 Pattern Matching·String Templates 정식화·Virtual Threads 운영 검증·Stable Values 도입.
- 출시: 2025-09 LTS (2030-09까지 지원)
- 주요: Pattern Matching, String Templates, Stable Values
- 대부분 라이브러리 호환 OK
- Spring Boot 5+, Quarkus 4+ 모두 25 지원
1. Pattern Matching for switch — 정식
// 이전 — instanceof + cast
Object obj = ...;
String result;
if (obj instanceof Integer i) {
result = "int: " + i;
} else if (obj instanceof String s) {
result = "str: " + s;
} else {
result = "unknown";
}
// Java 25 — switch pattern
String result = switch (obj) {
case Integer i -> "int: " + i;
case String s when s.length() > 5 -> "long str: " + s;
case String s -> "str: " + s;
case null, default -> "unknown";
};2. Record Patterns
record Point(int x, int y) {}
record Line(Point start, Point end) {}
Object obj = new Line(new Point(1, 2), new Point(3, 4));
// Destructuring
switch (obj) {
case Line(Point(int x1, int y1), Point(int x2, int y2)) ->
System.out.printf("(%d,%d) -> (%d,%d)%n", x1, y1, x2, y2);
default -> { }
}3. String Templates — 정식
String name = "Alice";
int age = 30;
// 이전
String s1 = "Hello, " + name + "! You are " + age + ".";
String s2 = String.format("Hello, %s! You are %d.", name, age);
// Java 25
String s3 = STR."Hello, \{name}! You are \{age}.";
// 표현식도 가능
String s4 = STR."Sum: \{1 + 2 + 3}, list: \{List.of(1, 2, 3)}";
// 안전한 SQL — 자동 escape
String sql = SQL."SELECT * FROM users WHERE id = \{userId}";
// SQL 처리기는 자동으로 prepared statement 사용4. Stable Values
public class Server {
// 지연 초기화 + thread-safe + 한 번만
private final StableValue<Config> config = StableValue.of();
public Config getConfig() {
return config.computeIfUnset(() -> loadConfig());
// 첫 호출만 loadConfig 실행, 이후 캐시
}
}이전 double-checked locking 패턴이 표준화. 가벼움 + thread-safe.
5. Compact Source Files (preview)
// Hello.java
void main() {
println("Hello");
}
// 컴파일 없이 직접 실행
java Hello.java스크립트 같은 가벼운 자바. 학습·prototype에 유용.
6. Virtual Threads — 25에서 안정화
// 1만 개 동시 작업
List<Future<String>> futures;
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
futures = IntStream.range(0, 10000)
.mapToObj(i -> executor.submit(() -> fetchData(i)))
.toList();
}
// I/O bound 작업에 폭발적 확장. CPU 비용 거의 없음.7. ScopedValue — ThreadLocal 대체
final static ScopedValue<User> CURRENT_USER = ScopedValue.newInstance();
// 호출 시
ScopedValue.where(CURRENT_USER, user).run(() -> {
// 이 스코프 안에서만 user 접근 가능
process();
});
void process() {
User u = CURRENT_USER.get(); // 자동 가져옴
}Virtual Threads 친화. ThreadLocal보다 가볍고 명확.
8. Sealed Classes + Records (이미 21)
sealed interface Shape permits Circle, Square, Triangle {}
record Circle(double radius) implements Shape {}
record Square(double side) implements Shape {}
record Triangle(double base, double height) implements Shape {}
double area(Shape shape) {
return switch (shape) {
case Circle(var r) -> Math.PI * r * r;
case Square(var s) -> s * s;
case Triangle(var b, var h) -> b * h / 2;
// sealed라 default 불필요 (모든 경우 처리)
};
}9. JFR (Java Flight Recorder)
# 실시간 프로파일링
java -XX:StartFlightRecording=duration=60s,filename=app.jfr -jar app.jar
# 분석
jfr print --events CPULoad app.jfr운영 중인 JVM에 실시간 부착도 가능. Datadog APM 대안.
10. GC 선택
| GC | 특징 |
|---|---|
| G1 (default) | 균형형, 일반 워크로드 |
| ZGC | 10ms 이하 일시정지, 큰 heap |
| Shenandoah | ZGC 대안, low-latency |
| Parallel | throughput 최대화 (CPU bound) |
| Generational ZGC (25) | ZGC 개선판, 일반 워크로드도 적합 |
11. 마이그레이션 21 → 25
- Java 25 환경 준비 (Adoptium·Amazon Corretto)
- 의존성 점검 — Spring Boot 5+, Hibernate 6+
- preview 기능 비활성화 (Compact Source Files는 preview)
- JVM 옵션 점검 — 25에서 일부 변경
- JFR로 성능 회귀 측정
실측 — 21 vs 25
| 지표 | 21 | 25 |
|---|---|---|
| Spring Boot 시작 시간 | 3.2초 | 2.6초 |
| 처리량 (REST API) | baseline | +8% |
| 메모리 (idle) | 240MB | 220MB |
| p99 GC pause (G1) | 30ms | 22ms |

댓글 0