[JavaScript] fetch API ๐Ÿ’ฌ

ํ˜œํ˜œยท2024๋…„ 11์›” 4์ผ
1

JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
5/9
post-thumbnail

๐Ÿ’ก ํ•ต์‹ฌ

async function logJSONData() {
  const response = await fetch("http://example.com/movies.json");
  const jsonData = await response.json();
  console.log(jsonData);
}
  • ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ํ˜•ํƒœ์˜ fetch()๋Š” ๊ฐ€์ ธ์˜ค๊ณ ์ž ํ•˜๋Š” ๋ฆฌ์†Œ์Šค์˜ ๊ฒฝ๋กœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ธ์ˆ˜ 1๊ฐœ๋งŒ ๋ฐ›์Œ

Response ๊ฐ์ฒด

  • ์‘๋‹ต์€ Response ๊ฐ์ฒด

    • Response
      • body
      • bodyUsed : ์‘๋‹ต ๋ณธ๋ฌธ์ด ์‚ฌ์šฉ๋๋Š”์ง€ ์•„๋‹Œ์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ถˆ๋ฆฌ์–ธ
      • headers
      • ok : ์‘๋‹ต์˜ ์„ฑ๊ณต ์—ฌ๋ถ€ ๋‚˜ํƒ€๋‚ด๋Š” ๋ถˆ๋ฆฌ์–ธ(200-299)
      • redirected : ์‘๋‹ต์ด ๋ฆฌ๋””๋ ‰์…˜์˜ ๊ฒฐ๊ณผ์ธ์ง€
      • status : ์‘๋‹ต ์ƒํƒœ์ฝ”๋“œ
      • statusText : ์ƒํƒœ ์ฝ”๋“œ์— ํ•ด๋‹นํ•˜๋Š” ์ƒํƒœ ๋ฉ”์‹œ์ง€ (ex. 200์ด๋ฉด โ€˜OKโ€™)
      • type : ์‘๋‹ต ์œ ํ˜•(ex. basic, cros)
      • url : ์‘๋‹ต URL
      • error() : ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜์™€ ์—ฐ๊ด€๋œ ์ƒˆ๋กœ์šด Response ๊ฐ์ฒด ๋ฐ˜ํ™˜
      • redirect() : ๋‹ค๋ฅธ URL์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ƒˆ๋กœ์šด ์‘๋‹ต ์ƒ์„ฑ
      • arrayBuffer() : ์‘๋‹ต ๋ณธ๋ฌธ์„ ArrayBuffer๋กœ ์ดํ–‰ํ•˜๋Š” ํ”„๋กœ๋ฏธ์Šค ๋ฐ˜ํ™˜
      • blob() : ์‘๋‹ต ๋ณธ๋ฌธ์„ Blob์œผ๋กœ ์ดํ–‰ํ•˜๋Š” ํ”„๋กœ๋ฏธ์Šค ๋ฐ˜ํ™˜
      • clone() : Response ๊ฐ์ฒด ๋ณต์‚ฌ๋ณธ ์ƒ์„ฑ
      • formData() : ์‘๋‹ต ๋ณธ๋ฌธ์„ FormData์œผ๋กœ ์ดํ–‰ํ•˜๋Š” ํ”„๋กœ๋ฏธ์Šค ๋ฐ˜ํ™˜
      • json() : ์‘๋‹ต ๋ณธ๋ฌธ์„ JSON์œผ๋กœ ํŒŒ์‹ฑํ•œ ๊ฒฐ๊ณผ๋กœ ์ดํ–‰ํ•˜๋Š” ํ”„๋กœ๋ฏธ์Šค ๋ฐ˜ํ™˜
      • text() : ์‘๋‹ต ๋ณธ๋ฌธ์„ text๋กœ ์ดํ–‰ํ•˜๋Š” ํ”„๋กœ๋ฏธ์Šค ๋ฐ˜ํ™˜
    • Response๋Š” HTTP ์‘๋‹ต ์ „์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด๋กœ, JSON ๋ณธ๋ฌธ ์ปจํ…์ธ ๋ฅผ ์ถ”์ถœํ•˜๋ ค๋ฉด json()์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ
  • fetch() ํ”„๋กœ๋ฏธ์Šค๋Š” ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ ๊ฑฐ๋ถ€๋˜๋ฉฐ,
    404 ๋“ฑ HTTP ์˜ค๋ฅ˜ ์‹œ์—๋Š” reject ๋˜์ง€ ์•Š์Œ

    โ‡’ then() ์ฒ˜๋ฆฌ๊ธฐ๋Š” ๋ฐ˜๋“œ์‹œ Response.ok ๋˜๋Š” Response.status ์†์„ฑ ํ™•์ธ

// POST ๋ฉ”์„œ๋“œ ๊ตฌํ˜„ ์˜ˆ์ œ
async function postData(url = "", data = {}) {
  // ์˜ต์…˜ ๊ธฐ๋ณธ ๊ฐ’์€ *๋กœ ๊ฐ•์กฐ
  const response = await fetch(url, {
    method: "POST", // *GET, POST, PUT, DELETE ๋“ฑ
    mode: "cors", // no-cors, *cors, same-origin
    cache: "no-cache", // *default, no-cache, reload, force-cache, only-if-cached
    credentials: "same-origin", // include, *same-origin, omit
    headers: {
      "Content-Type": "application/json",
      // 'Content-Type': 'application/x-www-form-urlencoded',
    },
    redirect: "follow", // manual, *follow, error
    referrerPolicy: "no-referrer", // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url
    body: JSON.stringify(data), // body์˜ ๋ฐ์ดํ„ฐ ์œ ํ˜•์€ ๋ฐ˜๋“œ์‹œ "Content-Type" ํ—ค๋”์™€ ์ผ์น˜ํ•ด์•ผ ํ•จ
  });
  return response.json(); // JSON ์‘๋‹ต์„ ๋„ค์ดํ‹ฐ๋ธŒ JavaScript ๊ฐ์ฒด๋กœ ํŒŒ์‹ฑ
}

postData("https://example.com/answer", { answer: 42 }).then((data) => {
  console.log(data); // JSON ๋ฐ์ดํ„ฐ๊ฐ€ `data.json()` ํ˜ธ์ถœ์— ์˜ํ•ด ํŒŒ์‹ฑ๋จ
});

fetch()์˜ options

  1. method : GET, POST ๋“ฑ ์š”์ฒญ ๋ฉ”์„œ๋“œ

    +) Origin ํ—ค๋”๋Š” HEAD๋‚˜ GET ๋ฉ”์„œ๋“œ์˜ Fetch ์š”์ฒญ์—์„œ๋Š” ์„ค์ • ์•ˆ ๋จ

  2. headers : ์š”์ฒญ์— ์ถ”๊ฐ€ํ•˜๊ณ ์ž ํ•˜๋Š” ํ—ค๋”๋“ค

    +) Authorization HTTP ํ—ค๋”๋Š” ์š”์ฒญ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์š”์ฒญ์ด ๋‹ค๋ฅธ ์ถœ์ฒ˜๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋˜๋ฉด ์ œ๊ฑฐ๋จ

  3. body : ์š”์ฒญ์— ์ถ”๊ฐ€ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ณธ๋ฌธ

  4. mode : ์š”์ฒญ์— ์‚ฌ์šฉํ•  ๋ชจ๋“œ

    • cors, no-cors, same-origin
  5. credentials : ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž๊ฒฉ์ฆ๋ช…(์ฟ ํ‚ค, HTTP ์ธ์ฆ, TLS ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ)์„ ์–ด๋–ป๊ฒŒ ์ทจ๊ธ‰ํ• ์ง€ ์ œ์–ด

    • omit : ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์š”์ฒญ์—์„œ ์ž๊ฒฉ์ฆ๋ช…์„ ์ œ์™ธ
    • same-origin : ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋™์ผ ์ถœ์ฒ˜ URL ์š”์ฒญ์— ๋Œ€ํ•ด์„œ๋Š” ์ž๊ฒฉ์ฆ๋ช…์„ ๋ณด๋‚ด๊ณ , ๋™์ผ ์ถœ์ฒ˜ URL ์‘๋‹ต์— ํฌํ•จ๋œ ์ž๊ฒฉ์ฆ๋ช…๋„ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์‹œ(๋””ํดํŠธ)
    • include : ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋™์ผ๊ณผ ๊ต์ฐจ ์ถœ์ฒ˜ ์š”์ฒญ ๋ชจ๋‘์— ์ž๊ฒฉ์ฆ๋ช…์„ ๋ณด๋ƒ„
  6. cache : ์š”์ฒญ์ด ๋ธŒ๋ผ์šฐ์ € HTTP ์บ์‹œ์™€ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ• ์ง€ ์ œ์–ด

    • default, no-store, reload, no-cache, force-cache, only-if-cached
  7. redirect : ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์š”์ฒญ ์ฒ˜๋ฆฌ๋ฒ•

    • follow : ์ž๋™์œผ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋”ฐ๋ผ๊ฐ(๋””ํดํŠธ)
    • error : ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋ฐœ์ƒ ์‹œ ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ ์š”์ฒญ ์ค‘๋‹จ
    • manual : ํ˜ธ์ถœ์ž๊ฐ€ ์‘๋‹ต์„ ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•จ
  8. referrer : ์š”์ฒญ ๋ฆฌํผ๋Ÿฌ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฌธ์ž์—ด

    Referer - HTTP | MDN

    • ํ˜„์žฌ ์š”์ฒญ์„ ๋ณด๋‚ธ ํŽ˜์ด์ง€์˜ ์ ˆ๋Œ€ ํ˜น์€ ๋ถ€๋ถ„ ์ฃผ์†Œ
    • ex) ๋งํฌ๋ฅผ ํƒ€๊ณ  ๋“ค์–ด์™”๋‹ค๋ฉด ํ•ด๋‹น ๋งํฌ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ํŽ˜์ด์ง€์˜ ์ฃผ์†Œ
    • ex) ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์— ๋ฆฌ์†Œ์Šค ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŽ˜์ด์ง€์˜ ์ฃผ์†Œ
  9. referrerPolicy

    • ์š”์ฒญ์— ์‚ฌ์šฉํ•  ๋ฆฌํผ๋Ÿฌ ์ •์ฑ… ์ง€์ •
    • no-referrer, no-referrer-when-downgrade, same-origin, origin, strict-origin, origin-when-cross-origin, strict-origin-when-cross-origin, unsafe-url
  10. integrity

    • ์š”์ฒญ์˜ ํ•˜์œ„ ๋ฆฌ์†Œ์Šค ๋ฌด๊ฒฐ์„ฑ ์ง€์ •
    • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ฐ€์ ธ์˜จ ๋ฆฌ์†Œ์Šค๊ฐ€ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์กฐ์ž‘ ์—†์ด ์ „๋‹ฌ๋˜์—ˆ๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š” ๋ณด์•ˆ ๊ธฐ๋Šฅ
  11. keepalive

    • ์š”์ฒญ์ด ํŽ˜์ด์ง€ ์ˆ˜๋ช…๋ณด๋‹ค ์˜ค๋ž˜ ์ง€์†๋˜๋Š” ๊ฑธ ํ—ˆ์šฉ
  12. signal

    • AbortSignal ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค
  13. priority : ๊ฐ™์€ ์ข…๋ฅ˜์˜ ์ทจ๋“ ์š”์ฒญ ์ค‘์—์„œ ์ด ์š”์ฒญ์˜ ์ƒ๋Œ€์  ์ค‘์š”๋„ ์ง€์ •

    • high, low, auto

์ด๋ฏธ์ง€ ์ทจ๋“ ์˜ˆ์ œ

const myImage = document.querySelector("img");

const myRequest = new Request("flowers.jpg");

fetch(myRequest)
  .then((response) => {
    if (!response.ok) {
      throw new Error(`HTTP ์˜ค๋ฅ˜! ์ƒํƒœ: ${response.status}`);
    }

    return response.blob();
  })
  .then((response) => {
    myImage.src = URL.createObjectURL(response);
  });
  • Response.blob()์„ ํ˜ธ์ถœํ•ด ์ ํ•ฉํ•œ MIME ์œ ํ˜• ๋ถ€์—ฌ
  • URL.createObjectURL ๋กœ url ์ƒ์„ฑํ•ด์„œ img ํƒœ๊ทธ์˜ src๋กœ ๋„ฃ์–ด์คŒ
const myImage = document.querySelector("img");

const myHeaders = new Headers();
myHeaders.append("Accept", "image/jpeg");

const myInit = {
  method: "GET",
  headers: myHeaders,
  mode: "cors",
  cache: "default",
};

const myRequest = new Request("flowers.jpg");

fetch(myRequest, myInit).then((response) => {
  // โ€ฆ
});
  • ํ—ค๋” ๊ฐ์ฒด์—๋Š” append() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿ’ก ์ฐธ๊ณ  ์ž๋ฃŒ

profile
์‰ฝ๊ฒŒ๋งŒ์‚ด์•„๊ฐ€๋ฉด์žฌ๋ฏธ์—†์–ด๋น™๊ณ 

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด