await은 넘겨받은 값이 Promise가 아니면 알아서 Promise로 감싸버리기 때문입니다. 자바스크립트 엔진은 생각보다 친절하고 유연합니다.
1. "값"을 받으면 즉시 해결된 Promise로 간주
await 뒤에 일반적인 값(숫자, 문자열 등)이 오면, 엔진은 내부적으로 이를 Promise.resolve(value)로 처리합니다.
async function getMagicNumber() {
const result = await 42; // Promise가 아닌 일반 숫자
console.log(result); // 42
}
getMagicNumber();
위 코드에서 await 42는 사실상 await Promise.resolve(42)와 동일하게 동작합니다. 굳이 기다릴 필요가 없는 확정된 값이라도, **비동기 흐름의 형식을 맞추기 위해 래핑(Wrapping)**을 해주는 것이죠.
2. "Thenable" 객체라는 비밀 통로
자바스크립트에는 Thenable이라는 개념이 있습니다. 객체인데 .then()이라는 메서드를 가지고 있다면, await은 이를 Promise처럼 취급합니다.
const customThenable = {
then: (resolve) => {
setTimeout(() => resolve("짠! 나타났습니다."), 1000);
}
};
async function test() {
const value = await customThenable;
console.log(value); // 1초 후 "짠! 나타났습니다." 출력
}
이 특성 덕분에 라이브러리마다 각자 구현한 Promise 모조품(?)들도 await 키워드 하나로 매끄럽게 연동될 수 있습니다.
3. 왜 이렇게 설계되었을까?
만약 await이 오직 "순수 Promise 객체"만 허용했다면 어땠을까요?
- 내가 다루는 데이터가 비동기로 올지, 이미 메모리에 있는 값인지 매번 if 문으로 체크해야 했을 겁니다.
- 다양한 라이브러리 간의 호환성이 떨어졌을 겁니다.
결국 **"어떤 값이든 비동기 흐름 안에서 일관되게 처리하겠다"**는 자바스크립트의 유연한 철학이 반영된 결과라고 볼 수 있습니다.
💡 요약하자면!
- 자동 래핑: await 뒤의 일반 값은 Promise.resolve()로 변환된다.
- Thenable 지원: .then() 메서드만 있다면 무엇이든 기다려준다.
- 일관성: 비동기와 동기 로직을 섞어 쓸 때 발생할 수 있는 복잡함을 줄여준다.
반응형
'IT관련' 카테고리의 다른 글
| [Linux] 스와핑(Swapping) 발생 시 CPU 점유율이 높아지는 이유 (0) | 2026.03.17 |
|---|---|
| [Git/소스트리] 브랜치 변경 시 파일이 순식간에 바뀌는 마법 같은 원리 (0) | 2026.03.16 |
| GitHub에서 글 작성 시 사용하는 마크다운 정리 (0) | 2026.03.13 |
| 📑 UTF-8 with BOM 한눈에 이해하기 (0) | 2026.03.04 |
| 🚀 [Angular] 서버 사이드 렌더링(SSR)과 정적 사이트 생성(SSG) 완벽 정리 (0) | 2026.03.03 |