async와 await

Frontend/JavaScript

async와 await은 Promise 객체를 더욱 쉽게 작성할 수 있고, 직관적으로 코드를 해석할 수 있는 문법이다.

 

Promise 객체

Promise 객체의 필요성자바스크립트에서 비동기 작업을 처리하는 가장 기본적인 방법은 콜백함수를 사용하는 것이다. 자바스크립트 비동기 처리자바스크립트에서 비동기 처리는 여러 작업을 효

devmark.tistory.com

 

먼저, 프로미스 객체를 사용해 간단한 비동기 처리 함수를 작성해보자.

const delay = (ms) => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve();
    }, ms);
  });
};

const start = () => {
  delay(2000).then(() => {
    console.log('대기');
  });
};

start();

코드 설명

  1. delay함수는 setTimeout함수에서 사용될 지연 시간을 매개변수로 받는다.
  2. Promise 객체를 반환한다.
  3. 지정된 시간 후 resolve함수를 호출한다.
  4. start함수를 이용해 delay함수를 호출한다.
  5. start함수는 delay함수의 인수로 2000을 넘겨 2초동안 지연시키고, then 메서드를 사용해 '대기'라는 단어를 출력한다.

이제, 위 코드를 async/await을 이용해 더 직관적으로 작성해보자.

 

async

async 키워드는 함수 선언 앞에 작성된다.

const start = async () => {
  delay(2000).then(() => {
    console.log('대기');
  });
};

async키워드가 붙은 함수는 자동으로 Promise 객체를 반환하는 비동기 처리 함수가 된다.


실제로 async키워드가 붙은 start함수를 출력해보면 Promise {<pending>}, 즉 state가 pending인 Promise가 출력되는 것을 볼 수 있다.

따라서 async 함수는 then 메서드를 사용할 수 있다

const start = async () => {
  return '대기';
};

start().then((res) => {
  console.log(res);  // '대기' 출력
});

코드를 실행해보면 '대기'가 출력되는데, 이는 start함수의 반환 값과 start함수가 반환하는 프로미스 객체의 resolve값이 동일하기 때문이다.

 

await

await키워드는 특정 함수의 앞에 작성되며, then키워드를 대신하여 사용할 수 있다.

const start = async () => {
  await delay(2000);
  console.log('대기');
};

start();

await의 특징

  • async함수 내부에서만 사용 가능
  • 해당 Promise가 처리될 때까지 기다린 다음 결과값을 받음
  • await이 작성된 코드가 종료되기 전에는 그 아래 코드들이 실행되지 않음

await 없이 실행:

const start = async () => {
  delay(2000);  // await 없음
  console.log('대기');
};

start();  // '대기'가 즉시 출력

 

 

await과 함께 실행:

const start = async () => {
  await delay(2000);  // await 있음
  console.log('대기');
};

start();  // 2초 후 '대기' 출력

이렇게 async와 await으로 비동기 함수를 처리하면 프로미스 객체를 편리하고 가독성있게 사용할 수 있고, 비동기 함수의 실행 순서를 예측할 수 있다.

 

에러 핸들링

async와 await을 이용한 비동기 처리 함수에서는 try-catch문법을 이용해 예외처리를 할 수 있다.

const delay = (ms) => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve();
    }, ms);
  });
};

const start = async () => {
  try {
    await delay(2000);
    console.log('대기');
  } catch (error) {
    console.log(error);
  }
};

start();

동작 방식

  1. try블록 안의 코드가 실행된다.
  2. 에러가 발생하면 catch 블록의 코드가 실행된다.
  3. 발견된 에러는 error 객체에 담겨 전달된다.
  4. 이를 이용해 어떤 에러가 발생했는지 확인하고 처리할 수 있다.

에러 처리 예시:

const delay = (ms) => {
  return new Promise((resolve, reject) => {
    if (ms < 0) {
      reject('시간은 0보다 커야 합니다');
    }
    setTimeout(() => {
      resolve();
    }, ms);
  });
};

const start = async () => {
  try {
    await delay(-1000);  // 에러 발생
    console.log('대기');
  } catch (error) {
    console.log(`에러 발생: ${error}`);  // '에러 발생: 시간은 0보다 커야 합니다' 출력
  }
};

start();

'Frontend > JavaScript' 카테고리의 다른 글

Vanilla JS 컴포넌트 설계 패턴  (0) 2025.11.10
화살표 함수와 객체  (0) 2025.11.09
API 호출  (0) 2025.10.31
Promise 객체  (0) 2025.10.31
자바스크립트 비동기 처리  (0) 2025.10.31
'Frontend/JavaScript' 카테고리의 다른 글
  • 화살표 함수와 객체
  • API 호출
  • Promise 객체
  • 자바스크립트 비동기 처리
고견
고견
개발 자국 남기기
  • 고견
    개발자국
    고견
  • 전체
    오늘
    어제
    • 분류 전체보기 (157) N
      • Frontend (29)
        • Next.js (16)
        • JavaScript (7)
      • CS (19) N
        • 자료구조 (9)
        • 알고리즘 (5)
        • 운영체제 (4) N
        • 네트워크 (1) N
      • TIL (93)
      • Dev Log (16)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    트러블 슈팅
    자료구조
    memory
    클래스
    타입 좁히기
    algorithm
    emotion diary
    앱 라우터
    App Router
    generic
    함수 타입
    ai 감성 일기장
    Trouble Shooting
    페이지 라우터
    CS
    알고리즘
    cs50
    문자열
    react
    바닐라 자바스크립트
    Pages Router
    배열
    Spa
    인터페이스
    제네릭
    useState
    Next.js
    C
    javascript
    typescript
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
고견
async와 await
상단으로

티스토리툴바