Javascript

[JavaScript] 프로미스(Promise)란 - 개념편

코딩 1.5 2023. 11. 12. 18:58

프로미스의 정의

An object that is used as a placeholder for the future result of an asynchronous operation.

 

프로미스란 비동기 작업의 미래 결과를 위해 자리표시자 같은 객체이다. 즉, 미래의 값을 위한 컨테이너라고 생각하면 된다. 여기서 미래의 값은 AJAX와 같이 Call이 시작될 때는 값이 없지만 미래에 값이 생기는 것을 의미한다. 즉, 미래의 값을 위해 Promise를 사용한다.

 

프로미스는 로또 복권을 생각하면 굉장히 쉽게 이해할 수 있다. 로또는 번호(결과)를 맞추면 나중에 돈을 받는 것을 약속(Promise)한다. 당첨 여부를 결정하는 추첨은 비동기(asynchronous)적으로 나중에 발생한다. 만약 번호(결과)를 맞추면 돈을 받고(fulfilled) 아니면 못(rejected) 받는다. 참고로 Promise는 ES6에서 도입되었다.

Promise를 복권에 비유한 설명

 

프로미스의 장점

  • 프로미스를 사용하면 비동기적 결과를 처리하기 위해 이벤트(event)와 콜백(callback)을 비동기 함수(function)에 넣는 방식에 의존하는 것을 벗어날 수 있다. (We no longer need to rely on events and callbacks passed into asynchronous functions to handle asynchronous results)
  • 콜백을 연속적으로 사용하는 것을 대신하여, 연속적인(sequence) 비동기 동작을 위해 프로미스를 체인(chain promises)처럼 사용할 수 있다. - 콜백 지옥 탈출 (Instead of nesting callbacks, we can chain promises for a sequence of asynchronous operations: escaping callback hell)

 

프로미스 라이프사이클(Lifecycle)

프로미스 라이프사이클

 

Promise는 비동기(Asynchronous) 작업과 함께 동작하기 때문에 시간이 지나면서 여러가지 상태로 바뀌게 된다. 이를 Promise의 라이프사이클(Lifecycle)이라고 한다. 

 

최초의 상태는 'Pending(보류)'이다. 이는 비동기 작업으로 가져오는 미래의 값을 사용하기 이전이다. 이후 비동기(Async) 동작(Task)이 일어나고 작업이 끝이나면, 'Settled(정해짐)' 상태로 이동한다. 이때 두 가지 유형 중 한 의 상태가 선택된다. 조건이 맞으면 'Fulfilled(성공)'를 그렇지 않으면 'Rejected(실패)'를 반환한다. Fulfilled가 되면 값을 사용할 수 있다. 반면, Rejected된 Promise는 비동기 작업 동안 에러가 있었다는 뜻이다. 예를 들어, 인터넷 연결이 되지 않아 API 서버에 연결되지 못한 경우가 있을 수 있다.

 

Promise를 사용할 때 명심할 점은 'Settled'은 오로지 한 번만 결정된다는 것이다. 'Fulfilled' 또는 'Rejected' 둘 중 하나이겠지만, 그때부터 상태는 영원히 변하지 않으며 바꾸는 것이 불가능하다.

 

프로미스의 소비(Consume)와 정의(Build)

Promsie가 초보자를 많이 햇갈리게 하는 것은 '소비(Consume)와 정의(Build)를 구분하지 않고 설명하는 블로그가 많기 때문이다.

상기 모든 과정은 Promise의 소비(Consume)에 관한 설명이다. 이는 Fetch API와 같은 함수 문법을 통해 이미 Promise를 가지고 있다는 가정하에 설명한 것이다. 이때는 별도로 Promise를 만들 필요가 없다. 하지만, 가끔은 직접 Promise를 만들어야 한다. 해당 블로그에서는 이 두개의 과정을 분리하여 설명할 예정이다. 

 

Promise Build와 Consume