목록으로

프로그래밍 · Java

Java 21 실무 가이드: Virtual Thread부터 Spring Boot 적용까지

BeanCon
Java 21의 Virtual Thread와 Spring Boot 적용을 상징하는 대표 이미지

Java 21의 주요 기능, Virtual Thread, Structured Concurrency, Record Pattern, Pattern Matching, Sequenced Collections, Spring Boot 3.3 적용과 운영 고려사항을 정리합니다.

Java 21은 현대 클라우드 환경과 대규모 분산 시스템 개발에 필요한 기능을 담은 최신 LTS 버전이다.

특히 Project Loom을 통해 도입된 Virtual Thread는 Java 동시성 모델의 큰 전환점으로 평가받는다.

이 글에서는 Java 21의 핵심 기능, Spring Boot 실무 적용, 운영 환경 고려사항, 마이그레이션 전략, 미래 전망까지 순서대로 살펴본다.

1. Java 21 개요

출시일: 2023년 9월

지원 유형: LTS(Long-Term Support)

현재 기업들이 선택하는 대표적인 Java 버전은 Java 17과 Java 21이다.

Java 8 → Java 11 → Java 17 → Java 21 순으로 업그레이드가 진행되고 있다.

Java 21 핵심 목표

  • Kubernetes
  • Docker
  • Microservices

고성능 동시성 처리

  • Virtual Thread
  • Structured Concurrency

개발 생산성 향상

  • Record Pattern
  • Pattern Matching
  • String Template

2. Java 21 주요 변경사항

기능상태
Virtual Thread정식
Record Pattern정식
Pattern Matching Switch정식
Sequenced Collection정식
Structured ConcurrencyPreview
String TemplatePreview
Scoped ValuesPreview

3. Virtual Thread 이해하기

기존 Thread의 문제

Java Thread
    ↓
OS Thread
    ↓
CPU

문제점

  • 생성 비용 높음
  • 메모리 사용량 큼
  • 컨텍스트 스위칭 비용 발생

대량 요청 환경에서는 한계가 존재한다.

Virtual Thread 등장

Project Loom에서 개발

Virtual Thread
        ↓
JVM Scheduler
        ↓
Carrier Thread
        ↓
OS Thread
  • 매우 가벼움
  • 수백만 개 생성 가능
  • 메모리 사용량 감소
  • 높은 동시성 제공

4. 기존 Thread와 Virtual Thread 비교

기존 Thread

ExecutorService executor =
Executors.newFixedThreadPool(200);

executor.submit(() -> {
    callApi();
});
  • Thread Pool 크기 제한
  • 대기 스레드 증가
  • 메모리 증가

Virtual Thread

try (var executor =
     Executors.newVirtualThreadPerTaskExecutor()) {

    executor.submit(() -> {
        callApi();
    });
}
  • Thread Pool 관리 불필요
  • 대량 요청 처리 가능
  • 코드 단순화

생성 예제

Thread.startVirtualThread(() -> {
    System.out.println("Virtual Thread");
});

5. Spring Boot에서 Virtual Thread 적용

요구사항

  • Java 21
  • Spring Boot 3.2 이상

application.yml 설정

spring:
  threads:
    virtual:
      enabled: true

이 설정만으로도 Tomcat Request 처리에 Virtual Thread가 적용된다.

REST API 예제

@RestController
@RequestMapping("/api")
public class UserController {

    @GetMapping("/users")
    public List users() {

        Thread.sleep(3000);

        return userService.findAll();
    }
}

기존 Thread Pool에서는 동시 요청 증가 시 스레드 부족 현상이 발생할 수 있다.

Virtual Thread에서는 훨씬 많은 요청을 처리할 수 있다.

6. Structured Concurrency

기존 방식

CompletableFuture user =
    CompletableFuture.supplyAsync(
        () -> getUser()
    );

CompletableFuture order =
    CompletableFuture.supplyAsync(
        () -> getOrder()
    );

코드 복잡도가 증가한다.

Java 21 방식

try (var scope =
     new StructuredTaskScope.ShutdownOnFailure()) {

    var userTask =
        scope.fork(this::getUser);

    var orderTask =
        scope.fork(this::getOrder);

    scope.join();

    return new Result(
        userTask.get(),
        orderTask.get()
    );
}

장점

  • 가독성 향상
  • 에러 처리 단순화
  • 병렬 처리 효율 증가

7. Record Pattern 활용

기존 코드

if(user instanceof User u){
    System.out.println(u.name());
}

Java 21

record User(
    String name,
    int age
){}

if(obj instanceof User(
    String name,
    int age
)){
    System.out.println(name);
}

데이터 추출이 훨씬 간결해진다.

8. Pattern Matching for Switch

기존 방식

if(obj instanceof String){
}
else if(obj instanceof Integer){
}

Java 21

String result =
switch(obj){

    case String s ->
        "String : " + s;

    case Integer i ->
        "Integer : " + i;

    default ->
        "Unknown";
};

가독성과 유지보수성이 향상된다.

9. Sequenced Collections

Java 21에서 새롭게 추가된 컬렉션 API

기존

LinkedHashSet set =
new LinkedHashSet<>();

Java 21

SequencedSet set =
new LinkedHashSet<>();

새로운 기능

set.getFirst();
set.getLast();

set.reversed();

10. Java 21 성능 향상 요소

Virtual Thread

대량 동시 접속 처리

G1 GC

GC Pause 감소

ZGC

초대형 Heap 지원

수십~수백 GB 메모리 환경에 적합

JIT 최적화

실행 속도 향상

11. Spring Boot 3.3 기반 실전 예제

build.gradle

plugins {
    id 'java'
    id 'org.springframework.boot'
}

java {
    sourceCompatibility =
        JavaVersion.VERSION_21
}

비동기 서비스

@Service
public class UserService {

    public User findUser() {

        Thread.sleep(1000);

        return repository.findById(1L);
    }
}

Controller

@RestController
public class UserController {

    @GetMapping("/user")
    public User getUser() {
        return service.findUser();
    }
}

Virtual Thread 활성화

spring:
  threads:
    virtual:
      enabled: true

설정 완료 후 별도 코드 수정 없이 적용 가능하다.

12. 운영 환경 고려사항

적합한 경우

외부 API 호출

Client
  ↓
Spring API
  ↓
External API

DB 조회 중심

Client
  ↓
Application
  ↓
Database

I/O 대기 시간이 긴 환경에서 매우 효과적이다.

부적합한 경우

CPU 집약적 연산

예시

  • 이미지 처리
  • 암호화
  • AI 추론
  • 영상 인코딩

이 경우 기존 Thread Pool이 더 적합할 수 있다.

13. Java 21 마이그레이션 전략

Java 8 → Java 21

추천 순서

Java 8
   ↓
Java 17
   ↓
Java 21

검토 항목

라이브러리 호환성

  • Spring Boot
  • Hibernate
  • Kafka Client

JVM 옵션 검토

불필요한 옵션 제거

-XX:+UseConcMarkSweepGC

CMS GC는 제거되었다.

14. Java 21과 클라우드 네이티브

Java 21은 클라우드 환경을 적극 고려하여 설계되었다.

대표 기술

  • Kubernetes
  • Docker
  • Spring Boot
  • Kafka
  • gRPC

GraalVM 연동

Native Image

native-image app.jar

장점

  • 빠른 시작
  • 적은 메모리
  • 서버리스 최적화

15. 미래 전망

Project Loom

Virtual Thread 확대

Structured Concurrency

정식 채택 예정

AI 서비스 백엔드

Java 활용 증가

예시

  • Spring AI
  • LangChain4j
  • AI Gateway
  • RAG Platform

엔터프라이즈 시장

Java 21은 향후 수년간 기업 환경의 표준 LTS 버전으로 자리 잡을 가능성이 높다.

16. 결론

Java 21은 단순한 버전 업그레이드가 아니라 Java 플랫폼의 패러다임 전환을 의미한다.

특히 Virtual Thread는 기존 Thread Pool 중심 아키텍처를 크게 변화시키며, 높은 동시성과 효율적인 자원 사용을 가능하게 한다.

Spring Boot 3.2 이상에서는 설정만으로 Virtual Thread를 사용할 수 있어 도입 장벽도 매우 낮다.

기업 환경에서는 Java 17과 Java 21이 향후 수년간 핵심 LTS 버전으로 활용될 것이며, 클라우드 네이티브 환경, 마이크로서비스 아키텍처, AI 백엔드 서비스 구축에 있어 Java 21은 매우 강력한 선택지가 될 것이다.

지금 Java를 새롭게 시작하거나 기존 시스템을 현대화하려는 조직이라면 Java 21은 가장 우선적으로 검토해야 할 플랫폼이라고 할 수 있다.

댓글

0

댓글을 불러오는 중입니다.