TypeScript/비동기/Lesson 04
async / await — 반환 타입을 박으면 호출부가 자동 추론된다
30분·theory
이 챕터
4/7
TypeScript
async / await — 반환 타입을 박으면 호출부가 자동 추론된다
💡 왜 배워야 할까요? — async 함수의 시그니처가 곧 계약서
🎯
JS 의 async 함수는 무엇을 돌려주는지 함수 본문을 다 읽어야 알 수 있습니다.
💼
TS 의 async 함수는 시그니처에 `Promise` 같이 박아두면, 호출부는 본문 안 봐도 안전하게 사용 가능합니다.
⚡
`await` 의 결과 타입은 자동 추론됩니다 — 한 번 박은 타입이 await 체인 끝까지 흐릅니다.
🔗
try/catch 의 `err` 는 TS 4.4+ 부터 `unknown` 입니다. `instanceof Error` 같이 좁혀야 message 에 접근 가능.
🏢 실무에서는
Next.js Server Component, Server Action, API Route 핸들러 — 전부 async 함수입니다. 반환 타입을 명시하면 그 함수를 import 해서 쓰는 클라이언트·서버 모든 곳에서 IDE 가 매개변수·반환값을 알려줍니다. 명시 안 하면 매번 `as User` 강제 캐스팅이 누적됩니다.
async 함수 = 항상 Promise 반환, await = 풀기
1. async 함수는 반환 타입이 자동 Promise
- ▸
async가 붙은 함수는 항상 Promise 를 반환합니다. - ▸반환 타입은
Promise<...>형태여야 합니다 (그 외 타입을 시그니처에 적으면 컴파일 에러). - ▸본문에서
return value하면 자동으로Promise.resolve(value)로 감싸짐. - ▸본문에서
throw err하면 자동으로Promise.reject(err)가 됨.
2. await 의 결과는 자동 추론
3. catch 의 err 는 unknown (TS 4.4+)
4. Promise 반환 함수와 async 함수는 같다
취향에 따라 골라 쓰지만, await 을 본문에서 쓰려면 async 가 강제됩니다.
💡 💡 async/await TS 핵심 5
1. async 함수의 반환 타입은 시그니처에 명시한다
시그니처만 봐도 호출자가 의도를 안다.
2. await 의 결과는 추론에 맡겨도 OK
명시하면 가독성 ↑, 생략해도 안전.
3. err 는 unknown — 좁혀서 써라
tsconfig 의 useUnknownInCatchVariables: true 가 TS 4.4+ strict 의 기본.
4. async 함수 안에서 Promise 를 다시 감싸지 마라
5. Promise.all 의 결과는 튜플로 받는다 (이미 promise lesson 에서 다룸)
⚡ 직접 실행해보기 — async/await
타입을 뗀 실행 버전. await 으로 순차 처리, try/catch 로 에러 잡기를 확인합니다.
✏️ JS 코드
📟 콘솔 출력
▶ 실행 버튼을 눌러보세요
⚠️ 브라우저 샌드박스에서 실행 — console.log()만 지원, alert/fetch 불가
확인 퀴즈
TS 4.4+ 에서 `try { ... } catch (err) { console.log(err.message); }` 가 컴파일 에러를 내는 이유는?
먼저 읽으면 좋은 개념: Promise<T> — JS vs TS 차이