-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #42 from Wannabe-Woowa-Article/soi-ha
- Loading branch information
Showing
1 changed file
with
371 additions
and
0 deletions.
There are no files selected for viewing
371 changes: 371 additions & 0 deletions
371
Aug/article/Axios-vs-Fetch-API:-Selecting-the-Right-Tool-for-HTTP-Requests.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,371 @@ | ||
## π [Axios vs. Fetch API: Selecting the Right Tool for HTTP Requests](https://medium.com/@johnnyJK/axios-vs-fetch-api-selecting-the-right-tool-for-http-requests-ecb14e39e285) | ||
|
||
### ποΈ λ²μ λ μ§: 2024.08.05 | ||
|
||
### π§ λ²μν ν¬λ£¨: μν(μ΅μμ°) | ||
|
||
--- | ||
|
||
<img width="500px" src="https://miro.medium.com/v2/resize:fit:1400/format:webp/1*quTpcb5i1NuOx235KQynOg.jpeg"/> | ||
|
||
μννΈμ¨μ΄ κ°λ° λΆμΌμμλ μΉμ ν΅ν΄ μ격 μλ²μ μννκ² μνΈ μμ©νκ³ λ°μ΄ν°λ₯Ό κ΅ννλ λ₯λ ₯μ΄ λ§€μ° μ€μν©λλ€. APIμμ λ°μ΄ν°λ₯Ό κ°μ Έμ€κ±°λ, CRUD μμ μ μννκ±°λ, κΈ°ν λ€νΈμν¬ κ΄λ ¨ μμ μ μννλ κ²½μ° HTTP μμ²μ λ§λλ κ²μ μ€μμ±μ μ무리 κ°μ‘°ν΄λ μ§λμΉμ§ μμ΅λλ€. Fetchμ AxiosλΌλ λ κ°μ λ리 μ¬μ©λλ JavaScript λΌμ΄λΈλ¬λ¦¬λ HTTP μμ²μ μ²λ¦¬νκ³ μ νλ κ°λ°μλ€μκ² μ΅κ³ μ μ νμ΄ λμμ΅λλ€. | ||
|
||
μ΄ κΈ°μ¬μμλ Axiosμ Fetchλ₯Ό λΉκ΅νμ¬ λ€μν μμ μ μννλ λ°©λ²μ μ΄ν΄λ³΄κ² μ΅λλ€. μ΄ κΈμ λ§μΉ λμ―€μ΄λ©΄ λ APIμ λν΄ λ μ μ΄ν΄νκ² λ κ²μ λλ€. | ||
|
||
### AXIOS | ||
|
||
Axiosλ λ€νΈμν¬ μμ²μ λ§λλ λ° μ¬μ©λλ third-party HTTP ν΄λΌμ΄μΈνΈ λΌμ΄λΈλ¬λ¦¬μ λλ€. Promiseλ₯Ό κΈ°λ°μΌλ‘ νλ©° μμ² λ° μλ΅μ μ²λ¦¬νκΈ° μν κΉλνκ³ μΌκ΄λ APIλ₯Ό μ 곡ν©λλ€. | ||
|
||
μ½ν μΈ λ°°ν¬ λ€νΈμν¬(CDN) λλ ν¨ν€μ§ κ΄λ¦¬μ(μ: npm)λ₯Ό μ¬μ©νμ¬ νλ‘μ νΈμ μΆκ°ν μ μμ΅λλ€. ν΅μ¬ κΈ°λ₯ μ€ μΌλΆλ λ€μκ³Ό κ°μ΅λλ€: | ||
λΈλΌμ°μ λ΄μμ XMLHttpRequests μν, node.js νκ²½ λ΄μμ http μμ² μν, μμ² μ·¨μ, μμ² λ° μλ΅ κ°λ‘μ±κΈ° | ||
|
||
### FETCH | ||
|
||
Axiosμ λ§μ°¬κ°μ§λ‘ Fetchλ Promise κΈ°λ° HTTP ν΄λΌμ΄μΈνΈμ λλ€. λ΄μ₯ APIμ΄λ―λ‘ μ€μΉνκ±°λ κ°μ Έμ¬ νμκ° μμ΅λλ€. νλμ λͺ¨λ λΈλΌμ°μ μμ μ¬μ©ν μ μμΌλ©° [caniuse](https://caniuse.com/fetch)μμ νμΈν μ μμ΅λλ€. λν node.jsμμλ μ¬μ©ν μ μμ΅λλ€. | ||
|
||
μ΄μ λ μΈκΈ° μλ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ΄ν΄νκΈ° μν΄ κΈ°λ³Έ ꡬ문, κΈ°λ₯ λ° μ¬μ© μ¬λ‘λ₯Ό λΉκ΅ν΄ λ³΄κ² μ΅λλ€. | ||
|
||
### 기본 ꡬ문 | ||
|
||
Axiosλ μμ² λ§€κ°λ³μ(ν€λ, λ°μ΄ν°, μμ² λ©μλ λ±)λ₯Ό κ°λ¨νκ² κ΅¬μ±ν μ μλ μ°κ²° κ°λ₯ν APIλ₯Ό μ 곡νμ¬ HTTP μμ²μ κ°μνν©λλ€. | ||
|
||
λ€μμ Axiosλ₯Ό μ¬μ©νμ¬ μ¬μ©μ μ μ ν€λμ ν¨κ» URLμ [POST] μμ²μ 보λ΄λ λ°©λ²μ λλ€. Axiosλ λ°μ΄ν°λ₯Ό μλμΌλ‘ JSONμΌλ‘ λ³ννλ―λ‘ μ§μ λ³νν νμκ° μμ΅λλ€. | ||
|
||
```jsx | ||
const axios = require('axios'); | ||
|
||
const url = 'https://jsonplaceholder.typicode.com/posts'; | ||
const data = { | ||
title: 'Hello World', | ||
body: 'This is a test post.', | ||
userId: 1, | ||
}; | ||
|
||
axios | ||
.post(url, data, { | ||
headers: { | ||
Accept: 'application/json', | ||
'Content-Type': 'application/json;charset=UTF-8', | ||
}, | ||
}) | ||
.then(({ data }) => { | ||
console.log('POST request successful. Response:', data); | ||
}) | ||
.catch((error) => { | ||
console.error('Error:', error); | ||
}); | ||
``` | ||
|
||
ν΄λΉ μ½λλ₯Ό fetch API μ½λμ λΉκ΅ν΄ 보면, μ νν λμΌν κ²°κ³Όλ₯Ό μ»μ μ μμ΅λλ€. | ||
|
||
```jsx | ||
const url = 'https://jsonplaceholder.typicode.com/todos'; | ||
|
||
const options = { | ||
method: 'POST', | ||
headers: { | ||
Accept: 'application/json', | ||
'Content-Type': 'application/json;charset=UTF-8', | ||
}, | ||
body: JSON.stringify({ | ||
title: 'Hello World', | ||
body: 'This is a test post.', | ||
userId: 1, | ||
}), | ||
}; | ||
|
||
fetch(url, options) | ||
.then((response) => response.json()) | ||
.then((data) => { | ||
console.log('POST request successful. Response:', data); | ||
}); | ||
``` | ||
|
||
Fetchλ POST μμ²μ λ°μ΄ν°λ₯Ό 보λ΄λ λ° body μμ±μ μ¬μ©νλ λ°λ©΄, Axiosλ data μμ±μ νμ©ν©λλ€. Axiosλ μλ²μ μλ΅ λ°μ΄ν°λ₯Ό μλμΌλ‘ λ³ννμ§λ§, Fetchλ₯Ό μ¬μ©ν λλ response.json() λ©μλλ₯Ό νΈμΆνμ¬ λ°μ΄ν°λ₯Ό JavaScript κ°μ²΄λ‘ νμ±ν΄μΌ ν©λλ€. λν Axiosλ λ°μ΄ν° μλ΅μ data κ°μ²΄ λ΄μ μ λ¬νλ λ°λ©΄, Fetchλ μ΅μ’ λ°μ΄ν°λ₯Ό μ΄λ€ λ³μμλ μ μ₯ν μ μλλ‘ ν©λλ€. | ||
|
||
### μλ΅ λ° μ€λ₯ μ²λ¦¬ | ||
|
||
Fetchλ λ‘λ© νλ‘μΈμ€μ λν μ νν μ μ΄λ₯Ό μ 곡νμ§λ§ λ κ°μ μ½μμ μ²λ¦¬ν΄μΌ νλ―λ‘ λ³΅μ‘μ±μ΄ μΆκ°λ©λλ€. λν μλ΅μ λ€λ£° λ Fetchλ .json() λ©μλλ₯Ό μ¬μ©νμ¬ JSON λ°μ΄ν°λ₯Ό νμ±ν΄μΌ ν©λλ€. κ·Έλ° λ€μ κ²μλ μ΅μ’ λ°μ΄ν°λ μ΄λ€ λ³μμλ μ μ₯ν μ μμ΅λλ€. | ||
|
||
HTTP μλ΅ μ€λ₯μ κ²½μ° Fetchλ μλμΌλ‘ μ€λ₯λ₯Ό λμ§μ§ μμ΅λλ€. λμ μλ²μμ μ€λ₯ μν μ½λ(μ: 404 Not found)λ₯Ό λ°ννλλΌλ μλ΅μ μ±κ³΅ν κ²μΌλ‘ κ°μ£Όν©λλ€. | ||
|
||
Fetchμμ HTTP μ€λ₯λ₯Ό λͺ μμ μΌλ‘ μ²λ¦¬νλ €λ©΄ κ°λ°μλ `.then()` λΈλ‘ λ΄μμ 쑰건문μ μ¬μ©νμ¬ `response.ok` μμ±μ νμΈν΄μΌ ν©λλ€. `response.ok`κ° falseμ΄λ©΄ μλ²κ° μ€λ₯ μν μ½λλ‘ μλ΅νμμ μλ―Ένλ―λ‘ κ°λ°μλ ν΄λΉ μ€λ₯λ₯Ό μ μ ν μ²λ¦¬ν μ μμ΅λλ€. | ||
|
||
λ€μμ Fetchλ₯Ό μ¬μ©ν [GET] μμ²μ λλ€: | ||
|
||
```jsx | ||
fetch('https://jsonplaceholder.typicode.com/todos') | ||
.then((response) => { | ||
if (!response.ok) { | ||
throw Error(`HTTP error: ${response.status}`); | ||
} | ||
return response.json(); | ||
}) | ||
.then((data) => { | ||
console.log('Data received:', data); | ||
}) | ||
.catch((error) => { | ||
console.error('Error message:', error.message); | ||
}); | ||
``` | ||
|
||
λ°λ©΄μ Axiosλ data μμ±μ μ§μ μ‘μΈμ€ν μ μκ² νμ¬ μλ΅ μ²λ¦¬λ₯Ό κ°μνν©λλ€. 200-299 λ²μ(μ±κ³΅μ μΈ μλ΅)λ₯Ό λ²μ΄λ μλ΅μ μλμΌλ‘ κ±°λΆν©λλ€. `.catch()` λΈλ‘μ μ¬μ©νλ©΄ μλ΅μ λ°μλμ§, λ°μλ€λ©΄ μν μ½λκ° λ¬΄μμΈμ§ λ± μ€λ₯μ λν μ 보λ₯Ό μ»μ μ μμ΅λλ€. μ΄λ μ€ν¨ν μλ΅λ ν΄κ²°λλ fetchμ λμ‘°λ©λλ€. | ||
|
||
λ€μμ Axiosλ₯Ό μ¬μ©ν [GET] μμ²μ λλ€: | ||
|
||
```jsx | ||
const axios = require('axios'); | ||
|
||
axios | ||
.get('https://jsonplaceholder.typicode.com/todos') | ||
.then((response) => { | ||
console.log('Data received:', response.data); | ||
}) | ||
.catch((error) => { | ||
if (error.response) { | ||
console.error(`HTTP error: ${error.response.status}`); | ||
} else if (error.request) { | ||
console.error('Request error: No response received'); | ||
} else { | ||
console.error('Error:', error.message); | ||
} | ||
}); | ||
``` | ||
|
||
Axiosλ μλμΌλ‘ μ€ν¨ν μλ΅μ λν΄ μ€λ₯λ₯Ό λ°μμν€λ―λ‘, μ€λ₯ μ²λ¦¬λ₯Ό κ°μννκ³ κ°λ°μκ° κ° μλ΅μ μ±κ³΅ λλ μ€ν¨λ₯Ό μλμΌλ‘ νμΈνμ§ μκ³ λ μ μ ν μ€λ₯ μ²λ¦¬ λ‘μ§μ ꡬννλ λ° μ§μ€ν μ μλλ‘ ν©λλ€. | ||
|
||
### HTTP μμ² λ° μλ΅ κ°λ‘μ±κΈ°(Intercepting) | ||
|
||
Axiosμ μ£Όμ κΈ°λ₯ μ€ νλλ HTTP μμ²μ μΈν°μ νΈν μ μλ€λ κ²μ λλ€. HTTP μΈν°μ ν°λ μ ν리μΌμ΄μ μμ μλ²λ‘ λλ κ·Έ λ°λλ‘ HTTP μμ²μ κ²μ¬νκ±°λ λ³κ²½ν΄μΌ ν λ μ μ©ν©λλ€. λ‘κΉ , μΈμ¦ λλ μ€ν¨ν HTTP μμ²μ λ€μ μλνλ κ²κ³Ό κ°μ λ€μν μμ μ νμμ μ λλ€. | ||
|
||
μΈν°μ ν°λ₯Ό μ¬μ©νλ©΄ κ° HTTP μμ²μ λν΄ λ³λμ μ½λλ₯Ό μμ±ν νμκ° μμ΅λλ€. HTTP μΈν°μ ν°λ μμ² λ° μλ΅μ μ²λ¦¬νλ λ°©λ²μ λν μ μ μ λ΅μ μ€μ νκ³ μ ν λ μ μ©ν©λλ€. | ||
|
||
λ€μμ Axiosλ₯Ό μ¬μ©νμ¬ HTTP μμ²μ μΈν°μ νΈνλ λ°©λ²μ λλ€: | ||
|
||
```jsx | ||
const axios = require('axios'); | ||
|
||
// μΈν°μ ν° μμ² λ±λ‘ | ||
axios.interceptors.request.use((config) => { | ||
// HTTP μμ²μ΄ μ μ‘λκΈ° μ μ λ©μμ§λ₯Ό κΈ°λ‘ν©λλ€. | ||
console.log('Request was sent'); | ||
return config; | ||
}); | ||
|
||
// GET μμ² μ μ‘ | ||
axios | ||
.get('https://jsonplaceholder.typicode.com/todos') | ||
.then(({ data }) => { | ||
console.log('Data received:', data); | ||
}) | ||
.catch((error) => { | ||
console.error('Error:', error.message); | ||
}); | ||
``` | ||
|
||
μ΄ μ½λμμλ `axios.interceptors.request.use()` λ©μλλ₯Ό μ¬μ©νμ¬ HTTP μμ²μ΄ μ μ‘λκΈ° μ μ μ€νν μ½λλ₯Ό μ μν©λλ€. | ||
|
||
λν `axios.interceptors.response.use()`λ₯Ό μ¬μ©νμ¬ μλ²μ μλ΅μ μΈν°μ ν°ν μλ μμ΅λλ€. μλ₯Ό λ€μ΄ λ€νΈμν¬ μ€λ₯κ° λ°μν κ²½μ° μλ΅ μΈν°μ ν°λ₯Ό μ¬μ©νμ¬ λμΌν μμ²μ λ€μ μλν μ μμ΅λλ€. | ||
|
||
κΈ°λ³Έμ μΌλ‘ fetch()λ μμ²μ μΈν°μ νΈν λ°©λ²μ μ 곡νμ§ μμ§λ§, μ°νμ± μ μ°Ύλ κ²μ μ΄λ ΅μ§ μμ΅λλ€. μ μ fetch() λ©μλλ₯Ό μ¬μ μνκ³ λ€μκ³Ό κ°μ΄ μΈν°μ ν°λ₯Ό μ μν μ μμ΅λλ€. | ||
|
||
λ€μμ Fetchλ₯Ό μ¬μ©νμ¬ HTTP μμ²μ μΈν°μ νΈνλ λ°©λ²μ λλ€. | ||
|
||
```jsx | ||
fetch = ((originalFetch) => { | ||
return (...arguments) => { | ||
return originalFetch.apply(this, arguments).then((response) => { | ||
if (!response.ok) { | ||
throw new Error(`HTTP error: ${response.status}`); | ||
} | ||
console.log('Request was sent'); | ||
return response; | ||
}); | ||
}; | ||
})(fetch); | ||
|
||
fetch('https://jsonplaceholder.typicode.com/todos') | ||
.then((response) => response.json()) | ||
.then((data) => { | ||
console.log('Data received:', data); | ||
}) | ||
.catch((error) => { | ||
console.error('Error:', error.message); | ||
}); | ||
``` | ||
|
||
Fetchλ Axiosμ λΉν΄ λ λ§μ 보μΌλ¬νλ μ΄νΈ μ½λλ₯Ό κ°μ§λ κ²½ν₯μ΄ μμ΅λλ€. νμ§λ§ μ νμ μ¬μ© μ¬λ‘μ κ°μΈμ μΈ νμμ λ°λΌ μ΄λ£¨μ΄μ ΈμΌ ν©λλ€. | ||
|
||
### μλ΅ μκ° μ΄κ³Ό | ||
|
||
μλ΅ μκ° μ΄κ³Όλ Fetchμ Axiosλ₯Ό λΉκ΅ν λ λ λ€λ₯Έ μ€μν μμμ λλ€. μλ΅ μκ° μ΄κ³Όλ ν΄λΌμ΄μΈνΈκ° μλ²μ μλ΅μ κΈ°λ€λ¦¬λ μκ°μΌλ‘, μ΄ μκ°μ΄ μ§λλ©΄ μμ²μ΄ μ€ν¨ν κ²μΌλ‘ κ°μ£Όν©λλ€. | ||
|
||
Axiosμμ μκ°μ μ€μ νλ κ°κ²°ν¨μ μΌλΆ κ°λ°μκ° Fetchλ³΄λ€ Axiosλ₯Ό μ νΈνλ μ΄μ μ€ νλμ λλ€. Axiosμμλ config κ°μ²΄μ μ νμ timeout μμ±μ μ¬μ©νμ¬ μμ²μ΄ μ€λ¨λκΈ° μ μ λ°λ¦¬μ΄ λ¨μλ‘ μκ°μ μ€μ ν μ μμ΅λλ€. μ΄ μ§κ΄μ μΈ μ κ·Ό λ°©μμ κ°λ°μκ° μμ² κ΅¬μ± λ΄μμ μ§μ μκ° μ΄κ³Ό κΈ°κ°μ μ μν μ μκ² νμ¬ λ ν° μ μ΄μ ꡬν μ©μ΄μ±μ μ 곡ν©λλ€. | ||
|
||
λ€μμ Axiosλ₯Ό μ¬μ©νμ¬ μ§μ λ μκ° μ νμ΄ μλ [GET] μμ²μ λλ€. | ||
|
||
```jsx | ||
const axios = require('axios'); | ||
|
||
// νμμμ μκ°μ λ°λ¦¬μ΄ λ¨μλ‘ μ μν©λλ€. | ||
const timeout = 5000; // 5μ΄ | ||
|
||
// νμμμ μμ±μ΄ μλ config κ°μ²΄λ₯Ό μμ±ν©λλ€. | ||
const config = { | ||
timeout: timeout, | ||
}; | ||
|
||
// μ§μ λ νμμμμΌλ‘ GET μμ²μ 보λ λλ€. | ||
axios | ||
.get('https://jsonplaceholder.typicode.com/todos', config) | ||
.then((response) => { | ||
console.log('Data received:', response.data); | ||
}) | ||
.catch((error) => { | ||
console.error('Error fetching data:', error.message); | ||
}); | ||
``` | ||
|
||
Axiosλ₯Ό μ¬μ©νμ¬ GET μμ²μ 보λ΄κ³ μμΌλ©°, λ λ²μ§Έ μΈμλ‘ config κ°μ²΄λ₯Ό μ λ¬νμ¬ μκ° μ νμ μ§μ νκ³ μμ΅λλ€. μμ²μ΄ μ±κ³΅νλ©΄ μμ ν λ°μ΄ν°κ° μ½μμ λ‘κ·Έλ©λλ€. μμ² μ€μ μ€λ₯κ° λ°μνκ±°λ μκ°μ΄ μ΄κ³Όλλ©΄ μ€λ₯ λ©μμ§κ° μ½μμ λ‘κ·Έλ©λλ€. | ||
|
||
Fetchλ AbortController μΈν°νμ΄μ€λ₯Ό ν΅ν΄ μ μ¬ν κΈ°λ₯μ μ 곡νμ§λ§ Axios λ²μ λ§νΌ μ§κ΄μ μ΄μ§λ μμ΅λλ€. | ||
|
||
λ€μμ Fetchλ₯Ό μ¬μ©νμ¬ HTTP μμ²μ μΈν°μ νΈνλ λ°©λ²μ λλ€. | ||
|
||
```jsx | ||
const timeout = 5000; // 5μ΄ | ||
// AbortController μΈμ€ν΄μ€λ₯Ό μμ±ν©λλ€. | ||
const controller = new AbortController(); | ||
const signal = controller.signal; | ||
|
||
// μ§μ λ νμμμ νμ fetch μμ²μ μ€λ¨νκΈ° μν΄ setTimeout ν¨μλ₯Ό μ€μ ν©λλ€. | ||
const timeoutId = setTimeout(() => { | ||
controller.abort(); | ||
}, timeout); | ||
|
||
// μ§μ λ URLκ³Ό μ νΈλ‘ fetch μμ²μ 보λ λλ€. | ||
fetch('https://jsonplaceholder.typicode.com/todos', { signal }) | ||
.then((response) => { | ||
if (!response.ok) { | ||
throw new Error('Network response was not ok'); | ||
} | ||
return response.json(); | ||
}) | ||
.then((data) => { | ||
console.log('Data received:', data); | ||
}) | ||
.catch((error) => { | ||
// μ€λ₯κ° μμ²μ΄ μ€λ¨λ κ² λλ¬ΈμΈμ§ νμΈν©λλ€. | ||
if (error.name === 'AbortError') { | ||
console.error('Request timed out'); | ||
} else { | ||
console.error('Error fetching data:', error.message); | ||
} | ||
}) | ||
.finally(() => { | ||
// μμ²μ΄ μλ£λ νμ νμμμμ΄ λ°μνμ§ μλλ‘ νμμμμ ν΄μ ν©λλ€. | ||
clearTimeout(timeoutId); | ||
}); | ||
``` | ||
|
||
5μ΄ νμμμμ΄ fetch μμ²μ μ€μ λλ©°, μ΄ μ ν μκ°μ μ΄κ³Όν κ²½μ° μμ²μ μ·¨μνκΈ° μν΄ `AbortController`κ° μμ±λ©λλ€. `setTimeout`μ μ¬μ©νμ¬ μ΄ κΈ°κ°μ΄ μ§λλ©΄ μμ²μ μ€λ¨μν€λ νμ΄λ¨Έκ° μμλ©λλ€. κ·Έλ° λ€μ fetch μμ²μ΄ μ μ‘λλ©°, μ€λ¨ μ νΈκ° ν¬ν¨λ©λλ€. μλ΅μ΄ λμ°©νλ©΄ μ±κ³΅ μ¬λΆλ₯Ό νμΈνκ³ λ°μ΄ν°λ₯Ό νμ±ν©λλ€. `timeouts`κ³Ό κ°μ μ€λ₯λ μ μ νκ² μ²λ¦¬λ©λλ€. λ§μ§λ§μΌλ‘, μμ²μ΄ μλ£λ ν λΆνμν μ§μ°μ νΌνκΈ° μν΄ νμμμμ΄ ν΄μ λ©λλ€. | ||
|
||
### λμ μμ² | ||
|
||
Fetchμ Axiosλ₯Ό λΉκ΅ν λ λ λ€λ₯Έ μ€μν μμμ λμ μμ² λλ μ¬λ¬ μμ²μ λμμ ν μ μλ κΈ°λ₯μ λλ€. μ΄ κΈ°λ₯μ μ±λ₯κ³Ό λ°μμ±μ΄ μ€μν μ ν리μΌμ΄μ μμ νΉν μ€μν©λλ€. | ||
|
||
Axiosλ `axios.all()` λ©μλλ₯Ό μ 곡νμ¬ μ¬λ¬ μμ²μ λμμ ν μ μμ΅λλ€. μ΄ λ©μλμ μμ² λ°°μ΄μ μ λ¬ν ν `axios.spread()`λ₯Ό μ¬μ©νμ¬ μλ΅μ κ°λ³ μΈμλ‘ νΌμΉ μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ κ° μλ΅μ κ°λ³μ μΌλ‘ μ²λ¦¬ν μ μμ΅λλ€. | ||
|
||
λ€μμ Axiosλ₯Ό μ¬μ©νμ¬ λμμ HTTP μμ²μ 보λ΄λ λ°©λ²μ λλ€: | ||
|
||
```jsx | ||
const axios = require('axios'); | ||
|
||
// μμ²μ κΈ°λ³Έ URL μ μ | ||
const baseURL = 'https://jsonplaceholder.typicode.com/todos'; | ||
|
||
// μμ²μ μν URL μ μ | ||
const urls = [`${baseURL}/1`, `${baseURL}/2`, `${baseURL}/3`]; | ||
|
||
// Axios μμ² νλΌλ―Έμ€ λ°°μ΄ μμ± | ||
const axiosRequests = urls.map((url) => axios.get(url)); | ||
|
||
// `axios.all()`μ μ¬μ©νμ¬ μ¬λ¬ μμ²μ λμμ μ μ‘ | ||
axios | ||
.all(axiosRequests) | ||
.then( | ||
axios.spread((...responses) => { | ||
// λͺ¨λ μμ²μ μλ΅ μ²λ¦¬ | ||
responses.forEach((response, index) => { | ||
console.log(`Response from ${urls[index]}:`, response.data); | ||
}); | ||
}) | ||
) | ||
.catch((error) => { | ||
console.error('Error fetching data:', error.message); | ||
}); | ||
``` | ||
|
||
Fetchλ₯Ό μ¬μ©νμ¬ λμΌν κ²°κ³Όλ₯Ό μ»κΈ° μν΄μλ λ΄μ₯λ `Promise.all()` λ©μλμ λͺ¨λ fetch μμ²μ λ°°μ΄λ‘ μ λ¬ν΄μΌ ν©λλ€. κ·Έλ° λ€μ async ν¨μλ₯Ό μ¬μ©νμ¬ μλ΅μ μ²λ¦¬ν©λλ€. | ||
|
||
λ€μμ Fetchλ₯Ό μ¬μ©νμ¬ λμμ HTTP μμ²μ 보λ΄λ λ°©λ²μ λλ€: | ||
|
||
```jsx | ||
// μμ²ν base URL μ μ | ||
const baseURL = 'https://jsonplaceholder.typicode.com/todos'; | ||
|
||
// μμ²ν URLs μ μ | ||
const urls = [`${baseURL}/1`, `${baseURL}/2`, `${baseURL}/3`]; | ||
|
||
// fetch μμ²μ νλ‘λ―Έμ€λ₯Ό μ μ₯ν λ°°μ΄ μμ± | ||
const fetchRequests = urls.map((url) => fetch(url)); | ||
|
||
// `Promise.all()`μ μ¬μ©νμ¬ μ¬λ¬ μμ²μ λμμ 보λ | ||
Promise.all(fetchRequests) | ||
.then((responses) => { | ||
// λͺ¨λ μμ²μ μλ΅μ μ²λ¦¬ | ||
responses.forEach((response, index) => { | ||
if (!response.ok) { | ||
throw new Error(`Request ${urls[index]} failed with status ${response.status}`); | ||
} | ||
response.json().then((data) => { | ||
console.log(`Response from ${urls[index]}:`, data); | ||
}); | ||
}); | ||
}) | ||
.catch((error) => { | ||
console.error('Error fetching data:', error.message); | ||
}); | ||
``` | ||
|
||
μ΄ μ κ·Ό λ°©μμ μ€ν κ°λ₯νμ§λ§, λΉλκΈ° νλ‘κ·Έλλ° κ°λ μ μ΅μνμ§ μμ κ°λ°μλ€μκ²λ μΆκ°μ μΈ λ³΅μ‘μ±κ³Ό μ€λ²ν€λλ₯Ό μ΄λν μ μμ΅λλ€. | ||
|
||
### νμ νΈνμ± | ||
|
||
νμ νΈνμ±μ μννΈμ¨μ΄ μμ€ν μ΄λ μ νμ΄ μ’ μμ±μ μ΄μ λ²μ κ³Ό ν¨κ» μ¬μ©λκ±°λ μ΄μ νκ²½μμ μ¬μ©λ λμλ μ¬λ°λ₯΄κ² λλ ν¨κ³Όμ μΌλ‘ μλν μ μλ λ₯λ ₯μ λ§ν©λλ€. | ||
|
||
Axiosλ κΈ°λ³Έμ μΌλ‘ λ λμ νμ νΈνμ±μ μ 곡νλ©°, μ΄μ μμ€ν μ΄λ μ½λλ² μ΄μ€μμ νΈνμ±μ μ©μ΄νκ² νλ μΆκ° κΈ°λ₯μ μ 곡ν©λλ€. Axiosμ μ£Όμ μ₯μ μ€ νλλ XMLHttpRequestλ₯Ό κΈ°λ°μΌλ‘ νμ¬ IE11κ³Ό κ°μ μ€λλ λΈλΌμ°μ λ₯Ό ν¬ν¨ν κ΄λ²μν λΈλΌμ°μ λ₯Ό μ§μνλ€λ κ²μ λλ€. | ||
|
||
λ°λ©΄μ Fetchλ Chrome, Firefox, Edge, Safariμ κ°μ νλ λΈλΌμ°μ λ₯Ό μ£Όλ‘ λμμΌλ‘ νλ λ μ νλ λΈλΌμ°μ μ§μμ μ 곡ν©λλ€. Fetchμ κΈ°λ₯μ΄ μ§μλμ§ μλ λΈλΌμ°μ μμ νλ‘μ νΈλ₯Ό μ§νν΄μΌ νλ κ²½μ° 'whatwg-fetch'μ κ°μ polyfillμ ν΅ν©νμ¬ κ²©μ°¨λ₯Ό ν΄μν μ μμ΅λλ€. μ΄ ν΄λ¦¬νμ Fetch μ§μμ μ€λλ λΈλΌμ°μ λ‘ νμ₯νμ¬ νΈνμ±μ 보μ₯ν©λλ€. | ||
|
||
μ¬μ©νλ €λ©΄ npm λͺ λ Ήμ μ¬μ©νμ¬ μ€μΉν μ μμ΅λλ€: | ||
|
||
```bash | ||
npm install whatwg-fetch - save | ||
``` | ||
|
||
κ·Έλ€μμλ λ€μκ³Ό κ°μ΄ μμ²μ λ³΄λΌ μ μμ΅λλ€: | ||
|
||
```jsx | ||
import 'whatwg-fetch' | ||
|
||
window.fetch(β¦) | ||
``` | ||
|
||
μΌλΆ μ€λλ λΈλΌμ°μ μμλ promise polyfillμ΄ νμν μλ μλ€λ μ μ μ μν΄ μ£ΌμΈμ. | ||
|
||
### κ²°λ‘ | ||
|
||
Axiosλ κ°κ²°ν¨, κ²¬κ³ ν¨, κ΄λ²μν λΈλΌμ°μ μ§μμΌλ‘ μΈν΄ μ€λλ λΈλΌμ°μ μμ νμ νΈνμ±μ΄ νμν νλ‘μ νΈμ μ΄μμ μΈ μ νμ λλ€. λ°λ©΄μ Fetchλ μ€νΈλ¦¬λ° κΈ°λ₯κ³Ό λ€λ₯Έ μΉ νλ«νΌ APIμ μννκ² μμ ν μ μλ κΈ°λ₯μ μ§μνλ λΈλΌμ°μ μ μ§μ λ΄μ₯λ λ³΄λ€ λ€μ΄ν°λΈν μ κ·Ό λ°©μμ μ 곡ν©λλ€. | ||
|
||
Axiosμ Fetch μ€μμ μ νν λ κ°λ°μλ μ¬μ© νΈμμ±, μ±λ₯ κ³ λ €μ¬ν, λΈλΌμ°μ νΈνμ± λ° νμν μΆκ° κΈ°λ₯ λ± νλ‘μ νΈ μꡬ μ¬νμ μ μ€νκ² νκ°ν΄μΌ ν©λλ€. |