[JAYโŒจ๏ธJS] ์„œ๋ฒ„์— ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์ƒˆ๋กœ์šด ์ •๋ณด๋ฅผ ๋ฐ›์•„์˜ค๋Š” API ์š”์ฒญ์„ ์œ„ํ•œ ์—ด์‡  fetch() ๋ฉ”์„œ๋“œ

2023. 5. 21. 18:33ใ†javascript

๋ฐ˜์‘ํ˜•

 

 

[JAYโŒจ๏ธJS] ์„œ๋ฒ„์— ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์ƒˆ๋กœ์šด ์ •๋ณด๋ฅผ ๋ฐ›์•„์˜ค๋Š” fetch() ๋ฉ”์„œ๋“œ

 1๏ธโƒฃ fetch API ๋ž€?
  • API(์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ธํ„ฐํŽ˜์ด์Šค)๊ฐ€ ๋“ฑ์žฅํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•ด์•ผ ํ•  ํ•„์š”์„ฑ์ด ์ปค์ง์— ๋”ฐ๋ผ ํ˜„์žฌ HTTP ์š”์ฒญ์˜ ์ค‘์š”์„ฑ์€ ์•„๋ฌด๋ฆฌ ๊ฐ•์กฐํ•ด๋„ ์ง€๋‚˜์น˜์ง€ ์•Š๊ฒŒ ๋˜์—ˆ๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—๋Š” ์ด๋Ÿฌํ•œ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋งค์šฐ ํŽธ๋ฆฌํ•œ ๋‚ด์žฅ ๋ฉ”์„œ๋“œ์ธ fetch() ๊ฐ€ ์žˆ๋‹ค.
  • fetch()๋Š” HTTP ์š”์ฒญ์— ์‚ฌ์šฉ๋˜๋Š” Promise ๊ธฐ๋ฐ˜ API ์ด๋ฉฐ,  ์ด์ „์˜ XMLHttpRequest์™€ ๊ฐ™์€ ๋ณต์žกํ•œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์ ˆ์ฐจ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๋„๋ก ๊ฐœ์„ ํ•œ ๋ฌธ๋ฒ•์ด๋‹ค.

 

 

 

 2๏ธโƒฃ fetch API์˜ ์ฃผ์š” ์žฅ์ 
  • Fetch๋Š” promise ๊ธฐ๋ฐ˜์œผ๋กœ, ๋น„๋™๊ธฐ ์ž‘์—…์„ ์‚ฌ์šฉํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์‰ฝ๊ฒŒ ํ•ด์ค€๋‹ค.
  • ๊ฐ„๋‹จํ•˜๊ณ  ๊น”๋”ํ•œ ๊ตฌ๋ฌธ์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ๋”์šฑ ์‰ฌ์›Œ์ง„๋‹ค.
  • catch ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํšจ์œจ์ ์ด๊ณ  ๊ฐ„์†Œํ™”๋œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•œ๋‹ค.
  • IE๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์™€ ํ˜ธํ™˜๋œ๋‹ค. IE์˜ ๊ฒฝ์šฐ ํ˜ธํ™˜์„ ์œ„ํ•ด ํด๋ฆฌํ•„ ์‚ฌ์šฉ.
  • ๋ฉ”์„œ๋“œ, ํ—ค๋”, ๋ณธ๋ฌธ ์ฝ˜ํ…์ธ  ๋“ฑ ์š”์ฒญ ๋ฐ ์‘๋‹ต์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๋†’์€ ์ˆ˜์ค€์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 3๏ธโƒฃ Promise 'then'์„ ์‚ฌ์šฉํ•œ fetch()
fetch('https://api.example.com/data')
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('Error:', error));
  1. fetch๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•ด์„œ API๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. (ex. https://api.example.com/data')
  2. API๋ฅผ ์š”์ฒญํ•œ ํ›„ ์ดํ–‰(resolved)์ด ๋˜๋ฉด response promise๋ฅผ ๋ฐ˜ํ™˜.
  3. response promise๋ฅผ json ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜.
  4. promise๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ดํ–‰(resolved)๋˜๋ฉด ์ฝ˜์†”์— ๋กœ๊ทธ๋ฅผ ์ฐ์–ด์„œ ํ™•์ธ ๊ฐ€๋Šฅ.
  5. ์–ด๋–ค ์‹œ์ ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅ.

 

 

API ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์–ป๊ธฐ ์œ„ํ•œ ๋ฉ”์„œ๋“œ

response.text()  ์‘๋‹ต์„ ํ…์ŠคํŠธ ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜
response.json()  ์‘๋‹ต์„ ํŒŒ์‹ฑํ•ด JSON ๊ฐ์ฒด๋กœ ๋ณ€๊ฒฝ
response.formData()  ์‘๋‹ต์„ FormData ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜
response.blob()  ์‘๋‹ต์„ Blob(ํƒ€์ž…์ด ์žˆ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ) ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜
response.arrayBuffer()  ์‘๋‹ต์„ ArrayBuffer(๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ์šฐ ๋ ˆ๋ฒจ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ) ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜

 

 

 

4๏ธโƒฃ async/await๋ฅผ ์ด์šฉํ•œ fetch()
async function fetchData() {
  try {
    let response = await fetch('https://api.example.com/data');
    let data = await response.json();
    console.log(data);
  } catch (error) {
    console.error('Error:', error);
  }
}
fetchData();
  1. promise .then ๋ฉ”์„œ๋“œ๋ณด๋‹ค ๋”์šฑ ๊น”๋”ํ•˜๊ฒŒ fetch API๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์„คํƒ• ๋ฌธ๋ฒ•์œผ๋กœ async/await์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ํ•จ์ˆ˜ ์•ž์— async๋ฅผ ๋ถ™์ด๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ ,
    promise๊ฐ€ ์•„๋‹Œ ๊ฒƒ์€ promise๋กœ ๊ฐ’์„ ๊ฐ์‹ธ์„œ ์ดํ–‰(resolved) ์ƒํƒœ์˜ promise๊ฐ€ ๋ฐ˜ํ™˜๋˜๋„๋ก ํ•œ๋‹ค.
  3. await๋Š” async ํ•จ์ˆ˜ ์•ˆ์—์„œ๋งŒ ๋™์ž‘ํ•˜๋ฉฐ, promise๊ฐ€ ์ฒ˜๋ฆฌ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.
  4. ์ผ๋ฐ˜์ ์œผ๋กœ fetch ์š”์ฒญ์—์„œ ์‘๋‹ต์„ awaitํ•˜๊ณ , ์‘๋‹ต์„ JSON ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” await ํ•˜๋Š” ๋‘ ๊ฐœ์˜ await ํ˜ธ์ถœ๋กœ ๊ตฌ์„ฑ.
  5. ์–ด๋–ค ์‹œ์ ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด try/catch ๋ฌธ์„ ํ™œ์šฉํ•ด์„œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ

 

 

 

5๏ธโƒฃ fetch() ์‚ฌ์šฉ ์‹œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
fetch('https://api.example.com/data')
  .then(response => {
    // response.ok – ์‘๋‹ต ์ƒํƒœ๊ฐ€ 200๊ณผ 299 ์‚ฌ์ด์— ์žˆ๋Š” ๊ฒฝ์šฐ true
    if (!response.ok) {
      throw new Error(`HTTP error! Status: ${response.status}`);
    }
    return response.json();
  })
  .then(data => console.log(data))
  • Fetch๋กœ ์ž‘์—…ํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ค‘์š”ํ•œ ์ ์€ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹!
  • XMLHttpRequest์™€ ๊ฐ™์€ ์ด์ „ API์™€ ๋‹ฌ๋ฆฌ fetch()๋Š” ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ์—๋งŒ Promise ๊ฑฐ๋ถ€(rejects) ๊ฐ’์„ ๋ฐ˜ํ™˜.
  •  HTTP 404 ๋˜๋Š” 500 ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด๋„ fetch๋Š” rejects ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜์— ๋Œ€ํ•ด ๋ช…์‹œ์ ์ธ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค.

 

response ๊ฐ์ฒด์˜ property

response.status ์‘๋‹ต์˜ HTTP ์ฝ”๋“œ
response.ok ์‘๋‹ต ์ƒํƒœ๊ฐ€ 200๊ณผ 299 ์‚ฌ์ด์— ์žˆ๋Š” ๊ฒฝ์šฐ 
trueresponse.headers ๋งต๊ณผ ์œ ์‚ฌํ•œ ํ˜•ํƒœ์˜ HTTP ํ—ค๋”

 

 

 

 

๐Ÿ™‹๐Ÿป‍โ™€๏ธ ์š”์•ฝ!
  • fetch()๋Š” HTTP ์š”์ฒญ์— ์‚ฌ์šฉ๋˜๋Š” Promise ๊ธฐ๋ฐ˜ API ์ด๋ฉฐ, ๋ณต์žกํ•œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์ ˆ์ฐจ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๋„๋ก ๊ฐœ์„ ํ•œ ๋ฌธ๋ฒ•.
  • promise๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ .then() ๋ฉ”์„œ๋“œ์™€ async/await ํ†ตํ•ด fetch API ์š”์ฒญ ๊ฐ€๋Šฅ.
  • async/await์„ ํ†ตํ•ด fetch() ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์ธ fetch ์š”์ฒญ์€ ๋‘ ๊ฐœ์˜ await ํ˜ธ์ถœ๋กœ ๊ตฌ์„ฑ.
  • Fetch๋กœ ์ž‘์—…ํ•  ๋•Œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ๊ผญ ํ•ด์ค„ ๊ฒƒ!

 

 

 

 

๋ฐ˜์‘ํ˜•