[JAYโŒจ๏ธJS] fetch()๋ฅผ ํ™œ์šฉํ•ด API๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์Šค๋‹ˆํŽซ ๋งŒ๋“ค๊ธฐ!

2023. 5. 26. 17:22ใ†javascript

๋ฐ˜์‘ํ˜•

[JAYโŒจ๏ธJS] fetch()๋ฅผ ํ™œ์šฉํ•ด API๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์Šค๋‹ˆํŽซ ๋งŒ๋“ค๊ธฐ

 ๐Ÿค” ํฌ์ŠคํŒ… ์ž‘์„ฑ์— ์•ž์„œ ๊ถŒ๊ณ ๋“œ๋ฆฝ๋‹ˆ๋‹ค!
  • ํ˜น์‹œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ž…๋ฌธ์ž ๋ถ„์ด ์ด ๊ธ€์„ ์ฝ๊ณ  ๊ณ„์‹œ๋‹ค๋ฉด fetch(), promise ๊ฐ์ฒด์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํ•œ ์ดํ•ด๋ฅผ ๋จผ์ € ์ง„ํ–‰ํ•˜์‹œ๊ธฐ๋ฅผ ๊ถŒ์žฅ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
  • ์ € ์—ญ์‹œ ์ž…๋ฌธ์ž๋กœ API ํ˜ธ์ถœ ํŒจํ„ด์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํžˆ ๋ฐ˜๋ณตํ•™์Šต์„ ์ง„ํ–‰ํ•œ ๋’ค์— ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ณ  ์ƒ์‚ฐ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์Šค๋‹ˆํŽซ ์ œ์ž‘์„ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ํ•ด๋‹น ๊ฒŒ์‹œ๋ฌผ์€ fetch() ๋ฉ”์†Œ๋“œ๋ฅผ promise.then ๋ฉ”์†Œ๋“œ๋ฅผ ํ™œ์šฉํ•ด ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹๊ณผ, async/await์„ ํ™œ์šฉํ•ด ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹ ๋‘ ๊ฐ€์ง€๋กœ  ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ Visual Studio Code ํ”„๋กœ๊ทธ๋žจ์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 ๐Ÿ˜Ž ์Šค๋‹ˆํŽซ ์„ค์ • ๋ฐฉ๋ฒ•
  1. vscode ์—์„œ ์‚ฌ์šฉ์ž ์ฝ”๋“œ ์กฐ๊ฐ ๊ตฌ์„ฑ(snippets) ์„ค์ •์œผ๋กœ ์ด๋™.
  2. ์ „์—ญ(global.code-snippets), ํ˜น์€ javascript.json์„ ์„ ํƒํ•ด์„œ ์Šค๋‹ˆํŽซ ์ •์˜.
  3. json ํ˜•์‹์œผ๋กœ ์Šค๋‹ˆํŽซ ์ž‘์„ฑ.

 

F1 ํ‚ค๋ฅผ ๋ˆ„๋ฅธ ํ›„ snippets ๊ฒ€์ƒ‰์ƒ๋‹จ๋ฉ”๋‰ด > ๊ธฐ๋ณธ์„ค์ • > ์‚ฌ์šฉ์ž ์ฝ”๋“œ ์กฐ๊ฐ ๊ตฌ์„ฑ ์„ ํƒ
์‚ฌ์šฉ์ž ์ฝ”๋“œ ์กฐ๊ฐ ๊ตฌ์„ฑ(snippets) ์„ค์ •์œผ๋กœ ์ด๋™

 

 

 

 1๏ธโƒฃ Promise.then์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šค๋‹ˆํŽซ ๋งŒ๋“ค๊ธฐ.
  • ์Šค๋‹ˆํŽซ ํ˜ธ์ถœ ์‹œ fetchPromise ์ฝ”๋“œ ์‹คํ–‰
  • ํ•ด๋‹น ์Šค๋‹ˆํŽซ์˜ fetch()๋Š” ๊ฐ€์ ธ์˜ค๊ณ ์ž ํ•˜๋Š” API ํ˜ธ์ถœ ๊ฒฝ๋กœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ•˜๋‚˜์˜ arguments๋งŒ ๋ฐ›๋Š”๋‹ค.
  • ์‹คํ–‰ ์‹œ '$1' ๊ตฌ๋ฌธ์— API ํ˜ธ์ถœ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค.
  • ์‘๋‹ต์€ Response ๊ฐ์ฒด๋กœ ํ‘œํ˜„๋˜๋ฏ€๋กœ JSON ๋ณธ๋ฌธ ์ฝ˜ํ…์ธ ๋ฅผ ์ถ”์ถœํ•˜๊ธฐ ์œ„ํ•ด .json()๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด Parsing์„ ์ง„ํ–‰ํ•˜๊ณ  Promise๋ฅผ  ํ•œ๋ฒˆ ๋” ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • promise๊ฐ€ ์ดํ–‰(resolve)๋  ๋•Œ console.log๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜ ๋“ค์–ด์™”๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  • promise๊ฐ€ ๊ฑฐ๋ถ€(reject)๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” catch() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์—๋Ÿฌ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅํ•œ๋‹ค.

 

{
  "[Fetch API] Promise.then": {
    "prefix": "fetchPromise",
    "body": [
      "fetch('$1')",
      "  .then(response => response.json())",
      "  .then(data => console.log(data))",
      "  .catch(error => console.error('Error:', error));"
    ],
    "description": "[Fetch API] Promise.then"
  }
}

 

 

 

 2๏ธโƒฃ Async/await์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šค๋‹ˆํŽซ ๋งŒ๋“ค๊ธฐ.
  • ์Šค๋‹ˆํŽซ ํ˜ธ์ถœ ์‹œ fetchAsync ์ฝ”๋“œ ์‹คํ–‰
  • ํ•ด๋‹น ์Šค๋‹ˆํŽซ์˜ fetch()๋Š” ๊ฐ€์ ธ์˜ค๊ณ ์ž ํ•˜๋Š” API ํ˜ธ์ถœ ๊ฒฝ๋กœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ•˜๋‚˜์˜ arguments๋งŒ ๋ฐ›๋Š”๋‹ค.
  • ์‹คํ–‰ ์‹œ '$1' ๊ตฌ๋ฌธ์— API ํ˜ธ์ถœ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค.
  • function ํ‚ค์›Œ๋“œ ์•ž์— async ๋งŒ ๋ถ™์—ฌ์ฃผ๊ณ , ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๋ถ€๋ถ„ ์•ž์— await ๋งŒ ๋ถ™์—ฌ์ฃผ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ๊ฐ„๊ฒฐํ•œ ๋กœ์ง ์‹คํ–‰ ๊ฐ€๋Šฅ.
  • await๋Š” ์ด๋ฆ„๊ณผ ๊ฐ™์ด Promise ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์ฝ”๋“œ ์‹คํ–‰์„ ์ผ์‹œ ์ค‘์ง€ํ•œ๋‹ค๋Š” ์˜๋ฏธ.
    fetch() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•œ APIํ˜ธ์ถœ, json() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•œ Parsing์„ ์ง„ํ–‰ํ•  ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ 2๋ฒˆ ๋ถ™์—ฌ์ค€๋‹ค.

 

{
  "[Fetch API] Async/Await": {
    "prefix": "fetchAsync",
    "body": [
      "async function fetchData() {",
      "  const response = await fetch('$1');",
      "  const data = await response.json();",
      "  console.log(data);",
      "}"
    ],
    "description": "[Fetch API] Async/Await"
  }
}

 

 

 3๏ธโƒฃ Try/Catch ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•œ Async/Await ์Šค๋‹ˆํŽซ ๋งŒ๋“ค๊ธฐ
  • ์Šค๋‹ˆํŽซ ํ˜ธ์ถœ ์‹œ fetchTryAsync ์ฝ”๋“œ ์‹คํ–‰.
  • ํ•ด๋‹น ์Šค๋‹ˆํŽซ์˜ fetch()๋Š” ๊ฐ€์ ธ์˜ค๊ณ ์ž ํ•˜๋Š” API ํ˜ธ์ถœ ๊ฒฝ๋กœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ•˜๋‚˜์˜ arguments๋งŒ ๋ฐ›๋Š”๋‹ค.
  • ์‹คํ–‰ ์‹œ '$1' ๊ตฌ๋ฌธ์— API ํ˜ธ์ถœ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค.
  • ์‘๋‹ต(200-299 ๋ฒ”์œ„์˜ HTTP ์ƒํƒœ ์ฝ”๋“œ)์ด ์„ฑ๊ณตํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์—๋Ÿฌ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋Š” if(!response.ok) ์กฐ๊ฑด๋ฌธ ์ถ”๊ฐ€.
  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” try/catch๋ฌธ์œผ๋กœ ๊ฐ์‹ธ์„œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ.
  • 1๏ธโƒฃ, 2๏ธโƒฃ ๋ฒˆ ์Šค๋‹ˆํŽซ ๊ตฌ์กฐ์— ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ๋” ๊ฒฌ๊ณ ํ•ด์ง„ ์ฝ”๋“œ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

{
  "[Fetch API]Async/Await with Try/Catch": {
    "prefix": "fetchTryAsync",
    "body": [
      "async function fetchData() {",
      "  try {",
      "    const response = await fetch('$1');",
      "    if (!response.ok) {",
      "      throw new Error('HTTP error ' + response.status);",
      "    }",
      "    const data = await response.json();",
      "    console.log(data);",
      "  } catch (error) {",
      "    console.error('Error:', error);",
      "  }",
      "}"
    ],
    "description": "[Fetch API] Async/Await with Try/Catch and HTTP error check"
  }
}

 

 

 

4๏ธโƒฃ Promise.all ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•œ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ ์Šค๋‹ˆํŽซ ๋งŒ๋“ค๊ธฐ
  • ์Šค๋‹ˆํŽซ ํ˜ธ์ถœ ์‹œ fetchMultipleAsync ์ฝ”๋“œ ์‹คํ–‰.
  • ํ•ด๋‹น ์Šค๋‹ˆํŽซ์˜ fetch()๋Š” ๊ฐ€์ ธ์˜ค๊ณ ์ž ํ•˜๋Š” API ํ˜ธ์ถœ ๊ฒฝ๋กœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‘ ๊ฐœ์˜ arguments๋ฅผ ๋ฐ›๋Š”๋‹ค.
  • await ํ‚ค์›Œ๋“œ๋ฅผ ์“ฐ๋ฉด ๋น„๋™๊ธฐ๊ฐ€ ๊ฐ•์ œ์ ์œผ๋กœ ๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์–ด ์ฝ”๋“œ๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ
    ํ•œ ๊ฐœ ์ด์ƒ์˜ API๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰์‹œํ‚ฌ ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ promise.all() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ
    ๋ณ‘๋ ฌ๋กœ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  • Promise.all() ์€ ๋ฐฐ์—ด ๋‚ด์˜ ์ธ์ž๋กœ ๋ฐ›์€ promise ๋ชจ๋‘๊ฐ€ ์ดํ–‰(resolve)๋˜์–ด์•ผ  ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ด ๋ฐ›๋Š”๋‹ค. 
    ๋ฐฐ์—ด ์ธ์ž์˜ ๊ฐ ํ”„๋กœ๋ฏธ์Šค ํ•จ์ˆ˜๋“ค์€ ์ œ๊ฐ๊ฐ ๋น„๋™๊ธฐ๋กœ ์ฆ‰์‹œ ์‹คํ–‰๋˜์–ด ์‹œ๊ฐ„์ด ๋‹จ์ถ•๋˜๋Š” ํŠน์ง•์ด ์žˆ์œผ๋ฉฐ, ๋ฐฐ์—ด์— ๊ฐ’์„ ๋‹ด์•„์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

{
  "[Fetch Multiple APIs] Promise.all and Async/Await": {
    "prefix": "fetchMultipleAsync",
    "body": [
      "async function fetchData() {",
      "  try {",
      "    const [response1, response2] = await Promise.all([fetch('$1'), fetch('$2')]);",
      "    if (!response1.ok || !response2.ok) {",
      "      throw new Error('HTTP error ' + response1.status + ' or ' + response2.status);",
      "    }",
      "    const [data1, data2] = await Promise.all([response1.json(), response2.json()]);",
      "    console.log('Data1:', data1);",
      "    console.log('Data2:', data2);",
      "  } catch (error) {",
      "    console.error('Error:', error);",
      "  }",
      "}"
    ],
    "description": "[Fetch multiple APIs] Promise.all and Async/Await"
  }
}

 

 

 

 

๋ฐ˜์‘ํ˜•