[React] fetchํ•จ์ˆ˜

์งฑ์ซ‘ยท2021๋…„ 12์›” 9์ผ
0
post-thumbnail

๐Ÿฆ fetch()

๋ฐฑ์•ค๋“œ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋ ค๋ฉด API๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์‘๋‹ต๋ฐ›๋Š”๋‹ค. ์ด๋•Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Web API fetch()ํ•จ์ˆ˜๋ฅผ ์“ฐ๊ฑฐ๋‚˜ axios๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
Web API๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‚ด์žฅํ•จ์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. ์‹ค๋ฌด์—์„œ๋Š” ์ด๋Ÿฐ์ €๋Ÿฐ ์ด์œ ๋กœ axios๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€๋งŒ, fetchํ•จ์ˆ˜๋กœ๋„ ์–ด์ง€๊ฐ„ํ•œ ๊ธฐ๋Šฅ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 

๐Ÿ” fetch() ํ•จ์ˆ˜ ๊ธฐ๋ณธ

fetch('api ์ฃผ์†Œ')
  .then(res => res.json())
  .then(res => {
    // data๋ฅผ ์‘๋‹ต ๋ฐ›์€ ํ›„์˜ ๋กœ์ง
  });

์ด๊ฒƒ์€ fetchํ•จ์ˆ˜์˜ ๊ธฐ๋ณธ ํ˜•ํƒœ์ด๋‹ค. ๊ฐ ๋‹จ๊ณ„๊ฐ€ ๋ญ˜ ๋œปํ•˜๋Š”์ง€ ๋ช…ํ™•ํžˆ ์•Œ์•„์•ผ ํ•œ๋‹ค.
์ด๊ฒƒ์„ ES5 ํ•จ์ˆ˜ ์„ ์–ธ์‹์œผ๋กœ ๋ฐ”๊ฟ”๋ณด๋ฉด

fetch('api ์ฃผ์†Œ')
  .then(function(res) {
    return res.json();
  })
  .then(function(res) {
    // data๋ฅผ ์‘๋‹ต ๋ฐ›์€ ํ›„์˜ ๋กœ์ง
  });

์ด๋ ‡๊ฒŒ ๋‚˜์˜จ๋‹ค. ๋ณ€์ˆ˜์˜ scope๋Š” ๊ฐ ํ•จ์ˆ˜์ด๋ฏ€๋กœ ์ฒซ ๋ฒˆ์งธ then์ด๋ž‘ ๋‘ ๋ฒˆ์งธ then์•ˆ์— ์žˆ๋Š” res๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒƒ์ด๋‹ค.
! res๋Š” response์˜ ์ค„์ž„๋ง์ด๋‹ค.

๐Ÿค fetch() ํ•จ์ˆ˜ - method๊ฐ€ get์ธ ๊ฒฝ์šฐ

fetch()ํ•จ์ˆ˜์—์„œ default method๋Š” get์ด๋‹ค.

์„ค๋ช…: ์œ ์ € ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
base url: https://api.google.com
endpoint: /user/3
method: get
์‘๋‹ตํ˜•ํƒœ:
    {
        "success": boolean,
        "user": {
            "name": string,
            "batch": number
        }
    }

์œ„์™€ ๊ฐ™์€ API๋ช…์„ธ๋ฅผ ๋ณด๊ณ  ์–ด๋–ป๊ฒŒ fetch()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ ๊นŒ?

fetch('https://api.google.com/user/3')
  .then(res => res.json())
  .then(res => {
    if (res.success) {
        console.log(`${res.user.name}` ๋‹˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค);
    }
  });

API์ฃผ์†Œ๋ฅผ ๋ณด๋‹ˆ user๋’ค์— ์žˆ๋Š” 3์ด user id์ธ๊ฒƒ ๊ฐ™๋‹ค. ๊ณ ์ •๋œ API๋ผ๋ฉด ๊ทธ๋ƒฅ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์—์„œ๋„ ๊ณ ์ •ํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋˜์ง€๋งŒ API์ฃผ์†Œ๋ฅผ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์œ ๋™์ ์œผ๋กœ ๋ฐ”๊ฟ”์ค˜์•ผ ํ•  ๋•Œ๊ฐ€ ์•„์ฃผ ๋งŽ๋‹ค.

๋ฆฌ์•กํŠธ์—์„œ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•˜๋ฉด

import React, { useEffect } from 'react';

function User(props) {
  useEffect(() => {
      const { userId } = props;
	    fetch(`https://api.google.com/user/${userId}`)
	      .then(res => res.json())
	      .then(res => {
	        if (res.success) {
	            console.log(`${res.user.name}` ๋‹˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค);
	        }
	    });      
    }, []);
  ...
}

์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿบ fetch() ํ•จ์ˆ˜ - method๊ฐ€ post์ธ ๊ฒฝ์šฐ

fetch()๊ธฐ๋ณธ์€ get์ด๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ฌด๊ฒƒ๋„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ get์œผ๋กœ ํ˜ธ์ถœํ–ˆ๋Š”๋ฐ, post์ธ ๊ฒฝ์šฐ์—๋Š” fetch()ํ•จ์ˆ˜์— method ์ •๋ณด๋ฅผ ์ธ์ž๋กœ ๋„˜๊ฒจ์ค˜์•ผ ํ•œ๋‹ค.
๋งŒ์•ฝ api๊ฐ€ get์ธ์ง€ post์ธ์ง€ ๋ชจ๋ฅด๋ฉด ๋ฐฑ์•ค๋“œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ฌผ์–ด๋ด์•ผ ํ•œ๋‹ค. api์ •๋ณด๋ฅผ ์•„๋Š” ๊ฒƒ์€ ์˜ค๋กœ์ง€ ๊ทธ๊ฒƒ์„ ๋งŒ๋“  ๊ฐœ๋ฐœ์ž๋ฟ์ด๋‹ค.

์„ค๋ช…: ์œ ์ €๋ฅผ ์ €์žฅํ•œ๋‹ค.
base url: https://api.google.com
endpoint: /user
method: post
์š”์ฒญ body:
    {
        "name": string,
        "batch": number
    }

์‘๋‹ต body:
    {
        "success": boolean
    }

์œ„์™€๊ฐ™์€ ๋ช…์„ธ๋ฅผ ๋ฐ›์œผ๋ฉด

fetch('https://api.google.com/user', {
    method: 'post',
    body: JSON.stringify({
        name: "yeri",
        batch: 1
    })
  })
  .then(res => res.json())
  .then(res => {
    if (res.success) {
        alert("์ €์žฅ ์™„๋ฃŒ");
    }
  })

์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•œ๋‹ค.
get method๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ณต์žกํ•œ๊ฑฐ ๊ฐ™๋‹ค.
1. ๋‘ ๋ฒˆ์งธ ์ธ์ž์— method์™€ body๋ฅผ ๋ณด๋‚ด์ค˜์•ผ ํ•œ๋‹ค.
2. method๋Š” post
3. body๋Š” JSONํ˜•ํƒœ๋กœ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ดJSON.stringfy()ํ•จ์ˆ˜์— ๊ฐ์ฒด๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜์—ฌ JSONํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ–ˆ๋‹ค.

fetchํ•จ์ˆ˜๋Š” post๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ๋•Œ JSON.stringfy๋ฅผ ํ•ด์ค˜์•ผ ํ•˜๋Š” ๋ฐ˜๋ฉด์— axios๋Š” ๊ฐ์ฒด๋ฅผ ๊ทธ๋Œ€๋กœ ์ž‘์„ฑํ•ด๋„ ๋˜๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. axios๋Š” ์†Œ์†Œํ•œ ํŽธ์˜์„ฑ์„ ์ œ๊ณตํ•ด์ฃผ๊ณ  ์š”์ฒ˜์˜ค๊ฐ€ ์‘๋‹ต์— ๋Œ€ํ•œ ํ™•์žฅ์„ฑ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ— fetch() ํ•จ์ˆ˜ - method๊ฐ€ get์ธ๋ฐ parameter๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

path๋ง query string์œผ๋กœ ๋„˜๊ฒจ์ค˜์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์–ธ์ œ๋Š” path, ์–ธ์ œ๋Š” query string์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์ด ์•„๋‹ˆ๋ผ ์˜ˆ์‹œ๋‹ˆ๊นŒ ๊ฐ™์€ API๋ฅผ ์”€...
์‹ค์ œ๋กœ๋Š” ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฐฉ์‹ ๋˜ํ•œ ๋ฐฑ์•ค๋“œ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ฌผ์–ด๋ด์•ผํ•œ๋‹ค.

์„ค๋ช…: ์œ ์ € ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
base url: https://api.google.com
endpoint: /user
method: get
query string: ?id=์•„์ด๋””
์‘๋‹ตํ˜•ํƒœ:
    {
        "success": boolean,
        "user": {
            "name": string,
            "batch": number
        }
    }

ํŠน๋ณ„ํ•œ ๊ฒƒ์€ ์—†๊ณ , API์ฃผ์†Œ๋’ค์— ๋ถ™์—ฌ์ฃผ๋ฉด ๋œ๋‹ค.

fetch('https://api.google.com/user?id=3')
  .then(res => res.json())
  .then(res => {
    if (res.success) {
        console.log(`${res.user.name}` ๋‹˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค);
    }
  });

๐Ÿด fetch() ํ•จ์ˆ˜ - res.json()์˜ ์˜๋ฏธ

์•ž์˜ ์ฝ”๋“œ์—์„œ ์ฒซ ๋ฒˆ์งธ then์—์„œ res => res.json()์ด ๋ญ์˜€์„๊นŒ?

fetch('https://api.google.com/user', {
    method: 'post',
    body: JSON.stringify({
        name: "yeri",
        batch: 1
    })
  })
  .then(res => res.json())   // ์™œ then์ด ๋‘๊ฐœ๊ณ  res.json() ์€ ๋ญ”์ง€?
  .then(res => {
    if (res.success) {
        alert("์ €์žฅ ์™„๋ฃŒ");
    }
  })

์ด๊ฑธ ์ดํ•ดํ•˜๋ ค๋ฉด ์šฐ์„  promise์˜ ๊ฐœ๋…์„ ์•Œ์•„์•ผ ํ•˜์ง€๋งŒ ๋„ˆ๋ฌด ๊ธธ์–ด์ง€๋‹ˆ๊นŒ ์ƒ๋žตํ•˜๊ฒ ๋‹ค.
๋Œ€์ถฉ ๋œป๋งŒ ์•Œ์•„๋ณด์ž!
์ฒซ ๋ฒˆ์žฌ then์˜ res๊ฐ€ ์–ด๋–ค ๊ฐ’์ด ๋“ค์–ด์˜ค๊ธธ๋ž˜ res.json()์„ ๋ฆฌํ„ดํ•˜๋Š”๊ฐ€? console.log์ฐ์–ด๋ณด๋ฉด ์•Œ๊ฒ ์ง€ ๋ญ...
๊ทผ๋ฐ ์ฝ˜์†”์„ ์ฐ์–ด ๋ณด๋ ค๋ฉด returnํ•˜๋Š” ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์— ๋ฐ”๋””๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•œ๋‹ค.

fetch('https://api.google.com/user', {
    method: 'post',
    body: JSON.stringify({
        name: "yeri",
        batch: 1
    })
  })
  .then(res => {       // ์ฒซ ๋ฒˆ์งธ then
    console.log(res);  // ์–ด๋–ค ๊ฐ’์ด ๋‚˜์˜ค๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž. ์‹ค์ œ ์ž˜ ์ž‘๋™ํ•˜๋Š” api ์ฃผ์†Œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

    return res.json();
  })
  .then(res => {       // ๋‘ ๋ฒˆ์งธ then
    if (res.success) {
        alert("์ €์žฅ ์™„๋ฃŒ");
    }
  })

์ฒซ ๋ฒˆ์งธ thenํ•จ์ˆ˜์— ์ „๋‹ฌ๋œ ์ธ์ž res๋Š” httpํ†ต์‹  ์š”์ฒญ๊ณผ ์‘๋‹ต์—์„œ ์‘๋‹ต์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋กœ Response Object๋ผ๊ณ  ํ•œ๋‹ค.
์—ฌ๊ธฐ์„œ ์ฝ˜์†”์„ ํ™•์ธํ•ด๋ณด๋ฉด ๋ฐฑ์•ค๋“œ์—์„œ ๋„˜๊ฒจ์ฃผ๋Š” ์‘๋‹ต body ์ฆ‰, ์‹ค์ œ๋ฐ์ดํ„ฐ๋Š” ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ง์€ {success: true}๋ผ๋Š” JSON๋ฐ์ดํ„ฐ๋Š” ์œ„์˜ ์ฝ”๋“œ๋กœ๋Š” ์ฝ˜์†”์— ์•ˆ์ฐํžŒ๋‹ค๋Š” ๋ง์ด๋‹ค.
์‘๋‹ต์œผ๋กœ ๋ฐ›์€ JSON๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Response Object์˜ jsonํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , returnํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‘ ๋ฒˆ์žฌ thenํ•จ์ˆ˜์—์„œ ์‘๋‹ต body์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿฆ„ fetch() ํ•จ์ˆ˜ - ์ฒซ ๋ฒˆ์งธ then ํ•จ์ˆ˜์— ์ถ”๊ฐ€๋˜๋Š” ๋กœ์ง

๊ทธ๋ ‡๋‹ค๋ฉด fetch().then().then() ํ˜•ํƒœ๋งŒ ๊ธฐ์–ตํ•˜๋ฉด ๋  ๊ฒƒ์„ ๊ตฌ๊ตฌ์ ˆ์ ˆ ์„ค๋ช…ํ•ด๋ดค๋‹ค.
์–ด์ฐจํ”ผ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด์˜€๊ณ , ๋ฐ”๋กœ ๋ฐฑ์•ค๋“œ์—์„œ ์‘๋‹ตbody๋ฅผ ์•ˆ์ฃผ๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
์‘๋‹ตbody๋กœ JSON๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ์ง€ ์•Š๋Š”๋ฐ ํ”„๋ก ํŠธ์—์„œ Response Object์˜ json()์„ ํ˜ธ์ถœํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.
์˜ˆ์‹œ๋ฅผ ๋“ค๋ฉด

์„ค๋ช…: ์œ ์ €๋ฅผ ์ €์žฅํ•œ๋‹ค.
base url: https://api.google.com
endpoint: /user
method: post
์š”์ฒญ body:
    {
        "name": string,
        "batch": number
    }

์‘๋‹ต body:
    1. ์ œ๋Œ€๋กœ ์ €์žฅํ–ˆ์œผ๋ฉด status code๋ฅผ 200 ์ „๋‹ฌ. ์‘๋‹ต body๋Š” ์—†์Œ
    2. ๊ถŒํ•œ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ธฐ๋ฉด status code๋ฅผ 403์œผ๋กœ ์ „๋‹ฌํ•˜๊ณ . ์‘๋‹ต body๋Š” ์•„๋ž˜์™€ ๊ฐ™์Œ
        {
            success: false,
            message: "๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค"
        }

์ด ์ฝ”๋“œ๋ฅผ fetch()๋กœ ๊ตฌํ˜„ํ•ด๋ณด๋ฉด

fetch('https://api.google.com/user', {
    method: 'post',
    body: JSON.stringify({
        name: "yeri",
        batch: 1
    })
  })
  .then(res => {
    if (res.status === 200) {
        alert("์ €์žฅ ์™„๋ฃŒ");
    } else if (res.status === 403) {
        return res.json();
    }
  })
  .then(res => {
    console.log("์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ->", res.message);
  })

์ด๋ ‡๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

profile
ไธๆ€•ๆ…ข, ๅชๆ€•็ซ™

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