기술 학습

Java 비동기

hawon6691 2026. 2. 5. 14:41
728x90

Java도 비동기 처리가 아주 잘 되어 있습니다.

하지만 Java(Spring)와 TypeScript(NestJS)는 비동기를 대하는 '태도' 가 조금 다릅니다. TypeScript는 태생부터 비동기가 필수였던 반면, Java는 멀티스레드라는 강력한 무기를 바탕으로 비동기 기술을 점진적으로 발전시켜 왔거든요.

Java에서 비동기를 처리하는 대표적인 방법들은 다음과 같습니다.


1. 초기 방식: Future

Java 5부터 도입된 개념입니다. "지금 당장 결과는 없지만, 나중에 줄게"라는 약속권 같은 것이죠. 하지만 결과를 받을 때까지 기다려야(Blocking) 하는 한계가 있었습니다.

2. 현대적 방식: CompletableFuture (Java 8+)

TypeScript의 Promise와 가장 유사한 개념입니다. 비동기 작업이 끝난 후 실행할 콜백을 체이닝(thenAccept, thenApply 등)할 수 있습니다.

Java

// Java의 비동기 예시
CompletableFuture.supplyAsync(() -> "Hello")
    .thenApply(s -> s + " World")
    .thenAccept(System.out::println);

3. 선언적 방식: @Async (Spring)

Spring 프레임워크에서는 메서드 위에 @Async 어노테이션만 붙이면, 해당 메서드를 별도의 스레드에서 비동기적으로 실행해 줍니다. 매우 편리하죠!


TypeScript(Promise) vs Java(CompletableFuture)

두 언어의 비동기 처리 철학을 비교해 보면 재미있습니다.

비교 항목 TypeScript (Promise) Java (CompletableFuture)
핵심 목적 효율성: 싱글 스레드가 쉬지 않게 함 성능: 여러 CPU 코어를 활용해 병렬 처리함
기본 동작 이벤트 루프가 작업 관리 스레드 풀(ForkJoinPool)에서 작업 수행
문법 스타일 async / await (매우 직관적) 메서드 체이닝 또는 가상 스레드(Project Loom)

4. 최근의 혁명: 가상 스레드 (Virtual Threads)

최근 Java 21에서는 Project Loom이라는 프로젝트를 통해 '가상 스레드'가 도입되었습니다.

과거 Java는 비동기 코드가 TypeScript에 비해 작성하기 복잡하다는 평이 있었는데, 이제는 "동기 방식(순차적)으로 코드를 짜도 내부적으로는 비동기(Non-blocking)처럼 가볍게 돌아가는" 수준까지 발전했습니다.


요약

  • Java도 비동기가 있습니다. (심지어 매우 강력합니다.)
  • 다만, Java는 "더 많은 스레드를 효율적으로 쓰자" 는 방향으로 발전했고,
  • TypeScript는 "있는 스레드 하나라도 제대로 굴리자" 는 방향으로 발전했습니다.

혹시 Java의 CompletableFuture 와 TypeScript의 Promise 코드를 나란히 비교해보고 싶으신가요? 아니면 Java의 최신 기능인 가상 스레드에 대해 더 궁금하신가요?

728x90

'기술 학습' 카테고리의 다른 글

소켓(Socket)과 패킷(Packet)의 관계  (0) 2026.02.09
소켓(Socket) 이란?  (0) 2026.02.09
TypeScript는 싱글 스레드  (0) 2026.02.05
NestJS와 Spring에 연관성  (0) 2026.02.05
NestJS는 왜 TypeScript를 사용할까?  (0) 2026.02.05