JavaScript

[새로운 기능] Promise_01 Callback hell과 Promise

  • -
반응형

자바스크립트에서 비동기 호출은 이해하기가 쉽지 않고 막상 코드를 작성해도 왠지 개운치가 않을 경우가 많다. 이번 포스트에서는 ES6에 추가된 Promise라는 객체를 이용해서 비동기 작업을 처리하는 방법에 대해 알아보자.

 

비 동기 작업과 callback hell

 

동기(synchronous) 작업과 비동기(asynchronous) 작업

동기 작업은 코드를 한 줄 한줄 실행하면서 이전 코드의 동작 결과를 받은 후 다음 코드가 실행되는 구조이다. 반면 비동기 작업은 코드를 실행하다가 이전 코드의 동작 결과를 받지 않고 바로 다음 코드를 실행하는 구조이다. 

간단한 비동기 작업으로 setTimeout 함수를 사용해보자.

let num = 0;

setTimeout(() => {
  console.log(`작업 진행: ${num++} 번째 작업 진행 ..`);
}, 1000);

console.log(`작업 결과 num: ${num}`);

위의 코드에서 setTimeout은 1초 후에 처리될 작업(callback)을 비 동기로 만들어서 던져버리고 바로 "작업 결과~~"가 콘솔에 출력된다. 그리고 언젠가 "작업 진행~~~"의 내용이 출력된다. 최초의 의도가 비동기 작업이 끝난 후 결과를 출력하고 싶었다면 낭패다. 

만약 비동기 작업 후 결과를 받아서 처리하려면 다음과 같이 callback 내에 코드가 작성되어야 한다.

let num = 0;

setTimeout(() => {
  console.log(`작업 진행: ${num++} 번째 작업 진행 ..`);
  console.log(`작업 결과 num: ${num}`);
}, 1000);

 

Callback Hell

문제는 1초 후에 또 1초 후에, 또 1초 후에 이런식으로 계속 callback 내에서 다른 callback을 불러야 하는 경우가 발생한다.

setTimeout(() => {
    console.log(`작업 진행: ${num++} 번째 작업 진행 ..`);
    console.log(`작업 결과 num: ${num}`);
        setTimeout(() => {
            console.log(`작업 진행: ${num++} 번째 작업 진행 ..`);
            console.log(`작업 결과 num: ${num}`);
        setTimeout(() => {
            console.log(`작업 진행: ${num++} 번째 작업 진행 ..`);
            console.log(`작업 결과 num: ${num}`);
        }, 1000);
    }, 1000);
}, 1000);

물론 동작은 잘 하지만 이런 코드가 심각해지면 코드를 쳐다보는 것만으로도 숨이 턱턱 막히게 되고 어디서 잘못되었는지 추적하기란 하늘의 별따기가 될 것이다. 이를 callback hell이라 한다.

자료출처: https://medium.com/gousto-engineering-techbrunch/avoiding-callback-hell-97734e303de1

Promise

물론 위의 상황은 아주 극단적인 상황이지만 아무튼 기존의 방식으로 비동기를 처리하기에는 코드가 썩 깔끔하지 않다. 이런 callback hell을 해결하기 위해 등장한 객체가 Promise이다.

Promise - JavaScript | MDN (mozilla.org)

 

Promise - JavaScript | MDN

Promise 객체는 비동기 작업이 맞이할 미래의 완료 또는 실패와 그 결과 값을 나타냅니다.

developer.mozilla.org

다음 포스트에서는 Promise에 대해 상세히 알아보자.

[다음 연관 글]

 

[새로운 기능] Promise_02 Promise 기본 사용법

이번 포스트에서는 Promise객체를 이용해서 Callback Hell에서 탈출해보자. Promise Promise의 상태 Promise는 총 3개의 상태를 갖는다. 최초로 Pending 상태에 있다가 fulfilled와 rejected 상태로 변경되고 이후 작

goodteacher.tistory.com

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.