TypeScript/비동기/Lesson 05
Fetch API — 응답 타입을 박는 제네릭 헬퍼 패턴
30분·theory
이 챕터
5/7
TypeScript
2. 가장 흔한 패턴 —
Fetch API — 응답 타입을 박는 제네릭 헬퍼 패턴
💡 왜 배워야 할까요? — fetch 는 항상 any 가 새어나가는 출입구
🎯
`fetch().then(r => r.json())` 의 결과는 기본 `Promise`. 타입 시스템이 끝나는 지점입니다.
💼
TS 는 제네릭 헬퍼 `fetchJson()` 한 번 만들면, 모든 API 호출의 결과를 안전한 타입으로 흘려보낼 수 있습니다.
⚡
런타임 검증(zod·valibot) 과 결합하면 외부 데이터가 정말 그 타입인지까지 보장합니다.
🔗
에러 응답(`!res.ok`), 네트워크 에러, 파싱 에러 — 셋을 분리해서 다루는 게 실무 패턴.
🏢 실무에서는
Next.js Server Component 에서도 `await fetch()` 가 핵심입니다. 같은 데이터 모양을 여기저기 가져다 쓰니까, 한 번 정의한 `User`·`Post` 인터페이스가 fetch 결과부터 컴포넌트 props 까지 일관되게 흘러야 합니다. fetch 출입구에서 타입을 박지 않으면 그 일관성이 깨집니다.
Response · res.json() · 제네릭 헬퍼
1. Response 의 타입은 알지만, body 는 any
2. 가장 흔한 패턴 — as Promise<User>
간단하지만 거짓말 일 수 있음 — 서버가 갑자기 다른 모양을 반환해도 컴파일 통과. 작은 프로젝트면 OK.
3. 제네릭 헬퍼 — 재사용 가능, 캐스트 한 곳에 모음
4. 진짜 안전 — 런타임 검증과 결합
런타임에서 진짜 모양을 검증하므로 거짓말 못함. 외부 API 와 통신할 때 권장.
💡 💡 fetch + TS 실무 패턴 5
1. 프로젝트마다 fetchJson
fetch 의 출입구를 한 곳으로 모으면 캐싱·로깅·에러 정책을 한 군데에서 관리.
2. as Promise
외부 API 면 zod 같은 런타임 검증으로 모양 확인이 안전.
3. HttpError 같은 커스텀 에러로 status 보존
status 별로 다른 UI 처리 가능 (401 → 로그인, 403 → 권한 안내).
4. RequestInit 은 표준 타입 — TS 가 알고 있다
5. Next.js 의 fetch 는 캐시 옵션을 받는다
표준 fetch 의 RequestInit 을 Next 가 확장. 타입도 함께 확장됨.
⚡ 직접 실행해보기 — fetchJson 헬퍼 (Mock)
실제 fetch 는 외부 호출이라 모킹합니다. 헬퍼의 흐름만 체감합니다.
✏️ JS 코드
📟 콘솔 출력
▶ 실행 버튼을 눌러보세요
⚠️ 브라우저 샌드박스에서 실행 — console.log()만 지원, alert/fetch 불가
확인 퀴즈
`async function fetchJson<T>(url: string): Promise<T> { ... return res.json() as Promise<T>; }` 의 약점은?
먼저 읽으면 좋은 개념: async / await — 반환 타입과 err: unknown
다음 추천: 에러 처리 — catch 의 unknown 좁히기