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의 최신 기능인 가상 스레드에 대해 더 궁금하신가요?
'기술 학습' 카테고리의 다른 글
| 소켓(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 |