상세 컨텐츠

본문 제목

자바와 자바스크립트에서 비동기 처리 : CompletableFuture과 Promise

😎 지식/자바스크립트_타입스크립트_리액트🌐

by :부셔져버린개발자 2025. 5. 28. 11:20

본문

비슷한 개념이므로 한 번에 블로그에 정리해보려고 한다 (자바!=자바스크립트)

 

먼저 자바에서 스레드를 직접 생성해서 사용하다보면 성능 관리, 예외처리 문제, 결과를 받기 어려움의 문제가 있다 

 

따라서, ExecutorService 기능을 제공하여 스레드 재사용을 돕고, Future를 통해 결과나 예외를 쉽게 관리할 수 있게 해준다.

submit() 메서드를 사용하면 Future 객체가 리턴되고 future.get() 으로 결과를 받을 수 있는데 get()은 작업이 끝날 때까지 현재 스레드를 블로킹하게 된다. 따라서, 이를 비동기적으로 실행하기 위해 CompletableFuture라는 클래스가 도입되었다. 이는 작업이 끝난 후에 로직을 미리 지정할 수 있는 체이닝 메서드를 제공하게 된다. 

 

 

자바스크립트에도 CompletableFuture과 비슷한 역할을 하는 Promise 가 있다.

Promise는 미래에 완료/실패할 비동기 작업의 결과를 나타내는 객체로 기본적으로 아래와 같이 사용된다.

const promise = new Promise((resolve, reject) => {
  // 비동기 작업 (예: 서버에 데이터 요청)
  const success = true;
  if (success) {
    resolve("작업 성공");
  } else {
    reject("작업 실패");
  }
});

 

그리고 아래 처럼 결과를 이어서 처리(체이닝)할 수 있다 

promise
  .then(result => {
    console.log(result); // "작업 성공"
  })
  .catch(error => {
    console.error(error); // "작업 실패"
  });

 

주요 메서드에는 then(), catch(), finally()가 있으며 

then()은 java의 thenApply(), thenAccept()와 비슷하고 

catch()는 exceptionally()와 비슷하다 

 

아 그리고 java에서 스레드 관리는 Executor나 ForkJoinPool을 사용하게 되는 반면에 

Javascript는 브라우저 또는 Node.js 이벤트 루프가 진행한다.

 

그리고 Java 는 비동기 기본 실행 환경이 병렬 스레드 풀인 반면에 JavaScript는 이벤트 루프 기반 단일 스레드 비동기이다

 

자바스크립트가 싱글 스레드 기반이지만 비동기 처리를 할 수 있는 이유는 이벤트 루프 구조이기 때문이다

CallStack이 비었는지 확인하고, Microtask Queue를 확인하여 다 비울 때까지 처리하고 Macrotask Queue를 확인하여 하나만 실꺼내서 실행한다 그리고 다시 CallStack이 비었는지 확인하게 된다 

 

console.log("A");

setTimeout(() => console.log("B"), 0);

Promise.resolve()
  .then(() => console.log("C"))
  .then(() => console.log("D"));

console.log("E");

// A E C(마이크로) D(마이크로) B(메크로)

 

 

javascript에서 비동기 흐름을 효과적으로 설계하려면,

빠르게 처리할 후속 로직은 then()으로 묶어서 microtask로 실행되도록 설계하고

시간이 오래 걸리거나 외부 리소스와 연동되는 작업은 macrotask 에 위임하면 된다 

 

아 그렇다면 microtask로 들어가는 작업들에는 무엇이 있는지 나열해보자

Promise.then() : 비동기 완료 후 실행도리 콜백

async/await의 await이후 로직 : 내부적으로 Promise 기반

MutationObserver : DOM 변경 감지 API 

queueMicrotask() : 명시적을로 마이크로태스크 예약 

 

 

macrotask 로 들어가는 작업에는 setTimeout, 브라우저 이벤트, 네트워크, 파일시스템 등이 있다. 

728x90

관련글 더보기