본문 바로가기
프로그래머로의 여정

자바스크립트에서 Promise란

by nunaaa 2025. 8. 5.

Promise란 무엇인가요?

Promise는 자바스크립트에서 비동기 작업의 최종 완료 또는 실패를 나타내는 객체입니다. '미래의 어떤 시점에 결과를 약속하는 객체'라고 이해할 수 있습니다.

자바스크립트는 기본적으로 한 번에 하나의 작업만 처리하는 싱글 스레드(Single Thread) 언어입니다. 파일 읽기, 네트워크 요청과 같은 시간이 오래 걸리는 작업을 처리할 때, 이 작업이 끝날 때까지 기다리면 다음 코드를 실행할 수 없게 됩니다. 이때 Promise가 등장하여, 이런 비동기 작업을 효율적으로 처리할 수 있게 도와줍니다.


Promise의 세 가지 상태

Promise는 생성된 후 다음 세 가지 상태 중 하나에 있게 됩니다.

  • Pending (대기): 비동기 작업이 아직 완료되지 않은 초기 상태입니다.
  • Fulfilled (이행): 비동기 작업이 성공적으로 완료되었고, 결과 값을 반환한 상태입니다.
  • Rejected (거부): 비동기 작업이 실패했고, 오류(Error)를 반환한 상태입니다.

!


Promise 사용 방법

Promise는 주로 then(), catch(), finally() 메서드와 함께 사용됩니다.

1. then(onFulfilled, onRejected)

then() 메서드는 Promise가 성공적으로 완료되었을 때(Fulfilled) 실행될 콜백 함수를 등록합니다.

const myPromise = new Promise((resolve, reject) => {
  // 비동기 작업 수행 (예: 네트워크 요청)
  const success = true; 
  if (success) {
    resolve("작업 성공!"); // 성공 시 resolve 호출
  } else {
    reject("작업 실패!"); // 실패 시 reject 호출
  }
});

myPromise.then(message => {
  console.log("성공:", message); // "작업 성공!" 출력
});

2. catch(onRejected)

catch() 메서드는 Promise가 실패했을 때(Rejected) 실행될 콜백 함수를 등록합니다. 이는 then(null, onRejected)와 동일합니다.

myPromise.catch(error => {
  console.log("오류:", error); // "작업 실패!" 출력
});

3. finally()

finally() 메서드는 Promise의 성공 여부와 관계없이 작업이 최종적으로 완료되었을 때 실행됩니다. 주로 리소스 정리(예: 로딩 상태 해제)에 사용됩니다.

myPromise.finally(() => {
  console.log("Promise 작업이 종료되었습니다.");
});

async/await와 Promise

asyncawait 키워드는 **Promise를 더 쉽게 다루기 위한 문법적 설탕(Syntactic Sugar)**입니다. 이 둘은 내부적으로 Promise를 기반으로 동작합니다. await는 Promise가 완료될 때까지 기다렸다가 그 결과를 반환하므로, 비동기 코드를 동기 코드처럼 직관적으로 작성할 수 있게 해줍니다.