비동기 통신의 핵심: Promise와 fetch API
Promise(프로미스)
상태(Status)와 결과값을 함께 보관하는 객체.Promise는 아직 도착하지 않은 값을 대신해서 대표하는 객체.

Pending (대기)
Fulfilled (이행)
resolve 호출)Rejected (거부)
reject 호출)Settled 상태란?fetch()는 기존의 XMLHttpRequest보다 간결하며 HTTP 요청을 보내고 그 결과를 Promise로 반환하는 Web API.Promise<Response> 형태로 반환.fetch(url) → Promise<Response>
주의할 점.
실제 응답 본문(body)을 사용하려면 반드시 한 번 더 비동기 처리를 해야함.
response.json() // Promise 반환
fetch는 이중 비동기 구조를 가짐.1 네트워크 요청 (fetch)2 응답 본문 파싱 (response.json)Ex) 택배로 예시
| 단계 | 코드 | 상황 | 비유상태 |
|---|---|---|---|
| 1단계 | fetch(url) | 택배 기사님이 우리 집 벨을 누름 | 연결 성공 |
| 2단계 | response.json() | 상자를 집 안으로 들고 들어와서 칼로 뜯음 | 데이터 확보 (내용물 확인 완료) |
호출
↓
fetch() 호출 즉시 Pending 상태의 Promise 반환.
수행
↓
브라우저 백그라운드에서 네트워크 요청 전송.
정착(Settled)
↓
HTTP 에러 ≠ Promise reject네트워크 장애, 요청 중단만 rejectfetch(url)
.then(response => {
console.log(response.ok); // false 가능
});
| 상황 | fetch 결과 |
|---|---|
| 네트워크 정상 + 200 | fulfilled (ok === true) |
| 네트워크 정상 + 404 | fulfilled (ok === false) |
| 네트워크 정상 + 500 | fulfilled (ok === false) |
| 네트워크 장애 | rejected |
수동으로 에러를 발생(throw)시켜야 함.fetch(url)
.then(response => {
if (!response.ok) {
throw new Error(`HTTP 에러: ${response.status}`);
}
return response.json();
})
.then(data => console.log(data))
.catch(err => console.error(err));
.then() 체이닝
function load() {
fetch(url) // 첫 번째 Promise 반환.
.then(response => {
if (!response.ok) throw new Error('HTTP 에러');
return response.json(); // 두 번째 Promise 반환
})
.then(data => console.log(data))
.catch(e => console.error(e)); // 모든 단계의 에러 포착
}
async / await
async function load() { // async 키워드 필수
try {
const response = await fetch(url); // 첫 번째 비동기
if (!response.ok) throw new Error('HTTP 에러');
const data = await response.json(); // 두 번째 비동기
console.log(data);
} catch (e) {
// try 블록 내의 모든 에러 처리
console.error(e);
}
}