비동기 처리: CallBack → Promise → async/await

2025. 10. 13. 23:20·Frontend/Javascript Essentials

자바스크립트에서 비동기 처리를 처음 접하면 대부분 콜백 함수를 사용한다.

하지만 전통적인 콜백 패턴에는 몇 가지 문제점이 있다.

 

1. 콜백 패턴의 문제점

1. 콜백 헬 (Callback Hell)

비동기 함수 내부에서 또 다른 비동기 작업을 수행해야 할 때, 콜백 함수가 중첩되며 코드 복잡도가 급격히 증가한다.

getData((res1) => {
  getMoreData(res1, (res2) => {
    getExtraData(res2, (res3) => {
      console.log(res3);
    });
  });
});

코드가 계속 오른쪽으로 들여쓰기되어 가독성이 나쁘다.

또한 비동기 처리 결과를 함수 외부로 반환하거나 상위 스코프 변수에 할당하기 어렵다.

2. 에러 처리의 어려움

콜백 내부에서 발생한 에러는 외부 try/catch로 잡기 어렵다.

예를 들어, setTimeout의 콜백에서 발생한 에러는 이미 호출한 함수가 콜 스택에서 제거되었기 때문에 잡히지 않는다.

 

각 콜백마다 개별적으로 에러 핸들링을 해야 하고, 비동기 단계가 많아질수록 에러 전파가 어렵다.

이런 이유로 콜백 패턴만 사용하면 코드가 복잡하고 유지보수가 어렵다.

 

2. Promise: 콜백 패턴의 대안

ES6에서 도입된 Promise는 비동기 작업의 상태를 명확히 표현하고, 콜백 패턴의 단점을 보완한다.

const promise = new Promise((resolve, reject) => {
  // 비동기 처리 수행
  if (성공) resolve(result);
  else reject(error);
});
  • resolve: 성공 시 호출, 결과 전달
  • reject: 실패 시 호출, 에러 전달
  • 프로미스 상태는 pending → fulfilled / rejected로 결정된다.

즉, Promise는 비동기 처리 상태와 결과를 관리하는 객체다.

1. 후속 처리 메서드

.then()

  • 첫 번째 콜백: Promise가 성공(resolve)했을 때 호출된다.
  • 두 번째 콜백: Promise가 실패(reject)했을 때 호출된다.
promise.then(
  (result) => console.log(result),
  (error) => console.error(error)
);

.catch()

  • 실패(rejected) 상태일 때만 호출된다.
  • 체이닝 중간의 에러까지 모두 잡을 수 있다.
promise
  .then((result) => doSomething(result))
  .catch((error) => console.error(error));

 

.finally()

  • 성공/실패 관계없이 항상 호출된다.
promise.finally(() => console.log("작업 완료"));

 

2. 프로미스 체이닝 (Promise Chaining)

.then()과 .catch()는 항상 새로운 Promise를 반환하므로 연속 호출이 가능하다.

fetch('/data.json')
  .then((res) => res.json())
  .then((data) => console.log(data))
  .catch((err) => console.error(err))
  .finally(() => console.log("작업 완료"));

여러 비동기 작업을 순차적으로 처리할 수 있다. 하지만 체인이 길어지면 여전히 가독성이 떨어진다.

 

3. async/await: 프로미스 문법적 설탕

async/await는 Promise 위에서 동작하는 문법적 설탕이다. 동기 코드처럼 읽기 쉽고 try/catch로 에러 처리가 간단하다.

async function getData() {
  try {
    const res = await fetch('/data.json');
    const data = await res.json();
    console.log(data);
  } catch (e) {
    console.error(e);
  } finally {
    console.log("작업 완료");
  }
}

getData();
  • async : 함수가 항상 Promise를 반환하게 한다.
  • await : Promise가 처리될 때까지 기다리고 결과를 변수에 할당한다.

즉, 비동기 코드도 마치 동기 코드처럼 작성할 수 있다.

 

3. 요약

방식 장점 단점
콜백 간단한 단일 비동기 중첩 시 콜백 헬, 에러 처리 어려움
Promise 상태 관리 가능, 체이닝 가능 체인 길어지면 가독성 떨어짐
async/await 동기 코드처럼 읽기 쉬움, try/catch로 에러 처리 가능 병렬 처리 시 주의 필요

 

  • 단순 비동기 → 콜백도 가능
  • 연속/복잡한 비동기 → Promise 또는 async/await 추천
  • 실무 → 대부분 async/await + try/catch 조합을 사용한다.

'Frontend > Javascript Essentials' 카테고리의 다른 글

this — 호출 방식에 따라 달라지는 자바스크립트의 핵심 키워드  (0) 2025.10.14
호이스팅(Hoisting)  (0) 2025.10.14
클로저 — 함수가 변수를 기억하는 방식  (0) 2025.10.12
프로토타입 기반 상속  (0) 2025.10.12
이벤트 루프  (0) 2025.10.11
'Frontend/Javascript Essentials' 카테고리의 다른 글
  • this — 호출 방식에 따라 달라지는 자바스크립트의 핵심 키워드
  • 호이스팅(Hoisting)
  • 클로저 — 함수가 변수를 기억하는 방식
  • 프로토타입 기반 상속
JTB
JTB
웹/앱 개발 정보를 공유하고 있습니다.
  • JTB
    JTechBlog
    JTB
  • 전체
    오늘
    어제
    • All About Programming;) N
      • Computer Science
        • Terminology and Concepts
        • Network
        • Operating System
        • Database
        • Data Structure
      • Frontend N
        • Javascript Essentials N
        • Perfomance Optimization
        • JS Patterns
        • Next.js
        • Flutter
        • Testing
      • Backend
        • Node.js
      • DevOps
        • Docker & Kubernetes
      • Coding Test N
        • LeetCode
        • Programmers N
      • Tech Books & Lectures
        • Javascript_Modern JS Deep d..
        • Network_IT 엔지니어를 위한 네트워크 입문
      • Projects
        • PolyLingo_2025
        • Build Your Body_2024
        • JStargram_2021
        • Covid19 Tracker_2021
        • JPortfolio_2021
      • BootCamp_Codestates
        • TIL
        • TILookCloser
        • Pre Tech Blog
        • IM Tech Blog
        • Daily Issues and DeBugging
        • First Project
        • Final Project
        • Sprint Review
        • Good to Know
        • Socrative Review
        • HTML & CSS
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 글쓰기
    • 관리
  • 공지사항

  • 인기 글

  • 태그

    프론트엔드 성능 최적화 가이드
    Threads and Multithreading
    js pattern
    Time complexity and Space complexity
    자바스크립트
    CPU scheduling algorithm
    TCP/IP
    polylingo
    structure of os
    DOM
    Shared resources
    딥다이브
    indie hacker
    Operating System
    Javascript Essentials
    Network
    Data Structure
    스코프
    Binary Tree BFS
    need a database
    이벤트
    자바스크립트 딥다이브
    leetcode
    mobile app
    testing
    커리어
    database
    VoiceJournal
    How memory manage data
    모던 자바스크립트 Deep Dive
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
JTB
비동기 처리: CallBack → Promise → async/await
상단으로

티스토리툴바