[JS]fetch

Na Jeongยท2022๋…„ 11์›” 30์ผ
0

๐Ÿ““fetch์˜ ์ •์˜

ํŠน์ • ์ •๋ณด๊ฐ€ ํ•„์š”ํ•  ๋•Œ ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์— HTTP ํ†ต์‹ ์œผ๋กœ ์š”์ฒญ(request)์„ ๋ณด๋‚ด๊ณ , ์ •๋ณด๋ฅผ ์‘๋‹ต(response) ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
์ด๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ fetch ๋ฉ”์„œ๋“œ์ด๋‹ค.
ํด๋ผ์ด์–ธํŠธ๋Š” fetch ๋ฉ”์„œ๋“œ๋กœ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•ด์„œ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑ, ์ˆ˜์ •, ์‚ญ์ œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ““fetch ์š”์ฒญ(request)

fetch ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ์ „๋‹ฌํ•œ API ์ฃผ์†Œ์— ์ •๋ณด๋ฅผ ๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•˜๊ณ  ์‘๋‹ต์„ ๋ฐ›๋Š”๋‹ค.
์•„๋ž˜์˜ ํ˜•ํƒœ๊ฐ€ fetch ๋ฉ”์„œ๋“œ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ์ด๋‹ค.

// fetch ์ „๋ฌธ ์˜ˆ์‹œ

fetch('api์ฃผ์†Œ', {
  method: '...',
  headers: { 'key': 'value' },
  body: JSON.stringify({ 'key': 'value' }),
})                                      //์š”์ฒญ
  .then((response) => response.json())
  .then((data) => console.log(data));
                                        //์‘๋‹ต

fetch ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ. ์ธ์ž 2๊ฐœ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ธ์ž ์ž๋ฆฌ์—๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•  API ์ฃผ์†Œ๋ฅผ ํ•„์ˆ˜๋กœ ๋„ฃ๋Š”๋‹ค. ๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” ์š”์ฒญ์˜ ์˜ต์…˜ ๊ฐ’๋“ค๋กœ ํ•„์š”์— ๋”ฐ๋ผ ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, method, headers, body, mode, credentials, omit, same-origin, include, cache, redirect, referrer, referrerPolicy, integrity, keepalive, signal๋“ฑ์˜ key์™€ ๊ฐ๊ฐ ํ•ด๋‹นํ•˜๋Š” value๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.
์—ฌ๊ธฐ์—์„œ ์ค‘์š”ํ•œ ๊ฑด, ํด๋ผ์ด์–ธํŠธ์˜ ์ž…์žฅ์—์„œ ์„œ๋ฒ„์—๊ฒŒ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ด๋‹ค.์–ด๋””์—์„œ ์š”์ฒญํ•˜๊ณ , ์–ด๋””์—์„œ ์‘๋‹ต๋ฐ›๋Š”์ง€ ๋ฐฉํ–ฅ์ด ํ˜ผ๋™๋˜๋ฉด ๊ฐœ๋… ์ •๋ฆฝ์— ์ข€ ๋” ๋งŽ์€ ์‹œ๊ฐ„์ด ํ• ์• ๋  ์ˆ˜ ์žˆ๋‹ค.

fetch๋Š” ํฌ๊ฒŒ ์š”์ฒญ๊ณผ ์‘๋‹ต ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š”๋ฐ ์—ฌ๊ธฐ์„œ๋Š” ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฐ์ฒด์˜ key์ค‘ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” method, headers, ๊ทธ๋ฆฌ๊ณ  body๊ฐ€ ์žˆ๋Š” ์š”์ฒญ๊ณผ body๊ฐ€ ์—†๋Š” ์š”์ฒญ์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“—์ฒซ๋ฒˆ์งธ ์ธ์ž(api์ฃผ์†Œ) - ํ•„์ˆ˜

fetch()์ฒซ ๋ฒˆ์งธ ์ธ์ž ์ž๋ฆฌ์— ์ •๋ณด๋ฅผ ์š”์ฒญํ•  API ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•œ๋‹ค. API ์ฃผ์†Œ๋Š” ์„œ๋ฒ„์—์„œ ๋ฐ›์•„์•ผ ํ•œ๋‹ค.
API ์ฃผ์†Œ๋Š” http:// ํ˜น์€ https://, IP ์ฃผ์†Œ(with ํฌํŠธ๋ฒˆํ˜ธ) ํ˜น์€ ๋„๋ฉ”์ธ ์ฃผ์†Œ, ์—”๋“œ ํฌ์ธํŠธ๋กœ ๊ตฌ์„ฑ๋ผ์žˆ๋‹ค.

// ์ฒซ๋ฒˆ์งธ ์ธ์ž ์˜ˆ์‹œ

fetch('http://10.58.113.116:8000/sign-in');
fetch('https://jsonplaceholder.typicode.com/posts');

๐Ÿ“—๋‘๋ฒˆ์งธ ์ธ์ž(method) - ์„ ํƒ์‚ฌํ•ญ

์–ด๋–ค method๋กœ ์š”์ฒญํ• ์ง€ ์ ๋Š”๋‹ค.
(GET, POST, PUT, PATCH, DELETE ...)

// method ์˜ˆ์‹œ

fetch('https://jsonplaceholder.typicode.com/posts', {
  method: 'POST',
});

๐Ÿ“—๋‘๋ฒˆ์งธ ์ธ์ž(headers) - ์„ ํƒ์‚ฌํ•ญ

headers ๋Š” ์„œ๋ฒ„์— ์š”์ฒญํ•  ๋•Œ ๋ณด๋‚ผ ๋ถ€๊ฐ€์ ์ธ ์ •๋ณด๋ฅผ ๋‹ด๋Š”๋‹ค.
(HOST, user-Agent, Authorization, Content-Type ...)

// headers ์˜ˆ์‹œ

fetch('https://jsonplaceholder.typicode.com/posts', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json;charset=utf-8',
  },
});

๐Ÿ“—๋‘๋ฒˆ์งธ ์ธ์ž(body) - ์„ ํƒ์‚ฌํ•ญ

body์—๋Š” ์„œ๋ฒ„์— ์š”์ฒญํ•  ๋•Œ ๋ณด๋‚ผ ์‹ค์งˆ์ ์ธ ์ •๋ณด๋ฅผ ๋‹ด๋Š”๋‹ค.
์—ฌ๊ธฐ์—์„œ ์š”์ฒญ body๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์™€ ์—†๋Š” ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“–์š”์ฒญ body๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ

์„œ๋ฒ„์— ๋ณด๋‚ผ ์ •๋ณด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ์š”์ฒญ body์— ๋‹ด์•„์„œ ๋ณด๋‚ธ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ body value๋ฅผ ๋ณด๋ฉด JSON.stringify๋ผ๋Š” ๋ฉ”์„œ๋“œ์— ๋‹ด์•„์„œ ๋ณด๋‚ด๊ณ  ์žˆ๋‹ค.

fetch('https://jsonplaceholder.typicode.com/posts', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json;charset=utf-8',
  },
  body: JSON.stringify({
    title: 'update title',
    content: '์„œ๋ฒ„์— ์š”์ฒญํ• ๋•Œ ๋‹ด์•„์„œ ๋ณด๋‚ด๋Š” ์ •๋ณด',
  }),
});

body์— ๋‹ด๊ธด ์ •๋ณด๋ฅผ ์„œ๋ฒ„๋กœ ๋ณด๋‚ผ ๋•Œ ๋ฐ์ดํ„ฐ ํ˜•ํƒœ๋ฅผ JSON ํ˜•ํƒœ๋กœ ๋ณด๋‚ด๊ณ  ๋ฐ›์•„์•ผ ํ•˜๋Š”๋ฐ, JSON์œผ๋กœ ํ˜• ๋ณ€ํ™˜์„ ํ•ด์ฃผ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ JSON.stringify์ด๋‹ค.

๐Ÿ’ก์™œ JSON์ผ๊นŒ ?
ํ†ต์‹  ๊ฐ„, ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๋Š” ๊ฐ™์€ ์–ธ์–ด์ผ ์ˆ˜๋„ ์žˆ๊ณ , ๋‹ค๋ฅธ ์–ธ์–ด์ผ ์ˆ˜๋„ ์žˆ๋‹ค. ๊ฐ™์€ ์–ธ์–ด๋ผ๋ฉด ๋ฌธ์ œ๊ฐ€ ์—†๊ฒ ์ง€๋งŒ ๋‹ค๋ฅธ ์–ธ์–ด๋ผ๋ฉด ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜๊ฐ€ ์—†๋‹ค.
JSON ํ˜•ํƒœ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ค ์–ธ์–ด์—์„œ๋“  ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. JSON์˜ ํ˜•ํƒœ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ฐ์ฒด์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ, javascript๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„ JSON์„ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ๋Œ€๋ถ€๋ถ„ ์–ธ์–ด์—์„œ ์ œ๊ณต๋œ๋‹ค.
๊ทธ๋ž˜์„œ JSON ํ˜•ํƒœ๋กœ ํ†ต์‹ ์„ ์ฃผ๊ณ ๋ฐ›์•„์•ผ ํ•œ๋‹ค. ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ JSON.stringify ๋ฉ”์„œ๋“œ ์ธ์ž์— ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์œผ๋ฉด, JSON๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค.

//JSON.stringify๋กœ ๋ณ€ํ™˜๋œ body ํ˜•ํƒœ ์˜ˆ์‹œ

// object
{
  title: 'update title',
  content: '์„œ๋ฒ„์— ์š”์ฒญํ• ๋•Œ ๋‹ด์•„์„œ ๋ณด๋‚ด๋Š” ์ •๋ณด',
};

// JSON
{ "title": "update title", "content": "์„œ๋ฒ„์— ์š”์ฒญํ• ๋•Œ ๋‹ด์•„์„œ ๋ณด๋‚ด๋Š” ์ •๋ณด" }
// JSON.stringify ํ˜• ๋ณ€ํ™˜ ์˜ˆ์‹œ

console.log(JSON.stringify({ x: 5, y: 6 }));
// expected output: "{"x":5,"y":6}"

console.log(
  JSON.stringify([new Number(3), new String('false'), new Boolean(false)])
);
// expected output: "[3,"false",false]"

console.log(JSON.stringify({ x: [10, undefined, function () {}, Symbol('')] }));
// expected output: "{"x":[10,null,null,null]}"

console.log(JSON.stringify(new Date(2006, 0, 2, 15, 4, 5)));
// expected output: ""2006-01-02T15:04:05.000Z""

๐Ÿ“–์š”์ฒญ body๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ

์š”์ฒญ body๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ๋Š” ์„œ๋ฒ„์— ์ „๋‹ฌํ•ด ์ค„ ์ •๋ณด ์—†์ด ์ •๋ณด๋งŒ ๋‹ฌ๋ผ๊ณ  ์š”์ฒญ๋งŒ ํ•œ๋‹ค.

//body๊ฐ€ ์—†๋Š” ์š”์ฒญ ์˜ˆ์‹œ

fetch('https://jsonplaceholder.typicode.com/users/1', { method: 'GET' });

๐Ÿ““๋น„๋™๊ธฐ(asynchronous)

console.log(1);
console.log(2);
setTimeout(() => console.log(3), 3000);
console.log(4);

//output
1
2
4
3

์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด 1,2,3,4 ๋กœ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ 1,2,4,3์œผ๋กœ ์ถœ๋ ฅ์ด ๋œ๋‹ค.
์ด์œ ๋Š” setTimeout ๋ฉ”์„œ๋“œ๊ฐ€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋™๊ธฐ(synchronous)์ ์ธ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์€ ์ด์ „์˜ ์ž‘์—…์ด ๋๋‚˜์•ผ ๋‹ค์Œ ์ž‘์—…์œผ๋กœ ์ด์–ด์ง€๋Š” ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด๋‹ค.
์ด ๋ฐฉ์‹์€ ์„ค๊ณ„๊ฐ€ ๋น„๊ต์  ๊ฐ„๋‹จํ•˜๊ณ  ์ฒ˜๋ฆฌ์˜ ์ˆœ์„œ๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์šฉ์ดํ•˜๋‹ค.
๋‹ค๋งŒ, ์ด์ „ ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ด์„œ ์—ฐ์‚ฐ์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ฑฐ๋‚˜, ์–ธ์ œ ์ข…๋ฃŒ๋ ์ง€ ๋ชจ๋ฅด๋Š” ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ชปํ•˜๊ณ  ๊ธฐ๋‹ค๋ ค์•ผ๋งŒ ํ•˜๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

๋น„๋™๊ธฐ(asynchronous)์ ์ธ ์ฒ˜๋ฆฌ๋ฐฉ์‹์€ ์ด์ „ ์ž‘์—…์˜ ์ข…๋ฃŒ ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋™๊ธฐ์ ์ธ ๋ฐฉ์‹๋ณด๋‹ค๋Š” ๋ณต์žกํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ํ†ต์‹ ์€ ์ค‘๊ฐ„์— ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์ด ๋Š๊ธด๋‹ค๊ฑฐ๋‚˜, ์†๋„๊ฐ€ ๋Š๋ ค ์–ธ์ œ ํ†ต์‹ ์ด ๋๋‚ ์ง€ ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
๊ทธ๋ž˜์„œ ํ†ต์‹ ์€ ๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ํ™”๋ฉด์— ์•„๋ฌด๊ฒƒ๋„ ์ถœ๋ ฅ๋˜์ง€ ์•Š์€ ์ฑ„ ๋งˆ๋ƒฅ ๊ธฐ๋‹ค๋ ค์•ผ ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์—๋Ÿฌ ํ™”๋ฉด์ด ๋‚˜์˜ค๋ฉด์„œ ์ •์ƒ์ ์ธ ์ ‘๊ทผ์ด ์–ด๋ ค์šธ ์ˆ˜๋„ ์žˆ๋‹ค.
๊ทธ๋ž˜์„œ ํ†ต์‹ ๊ณผ์ •์€ ๋™๊ธฐ์ ์ธ ์ฒ˜๋ฆฌ ์ˆœ์„œ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋„๋ก ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๊ณ , fetch ํ•จ์ˆ˜๋Š” ๊ทธ๋ž˜์„œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ๋‹ค.

๐Ÿ““fetch ์‘๋‹ต(response)

.then() ๋ฉ”์„œ๋“œ๋Š” Promise๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.
.then()์€ Promise๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ  ๋‘ ๊ฐœ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค. ํ•˜๋‚˜๋Š” Promise๊ฐ€ ์ดํ–‰๋ฌ์„ ๋•Œ, ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๊ฑฐ๋ถ€ํ–ˆ์„ ๋•Œ๋ฅผ ์œ„ํ•œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์ด๋‹ค.
.then() ๋ฉ”์„œ๋“œ๋Š” Promise๋ฅผ ๋ฆฌํ„ด ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฒซ๋ฒˆ์งธ .then()์—์„œ ๋ฐ˜ํ™˜๋œ ๊ฐ’์„ ๋‘๋ฒˆ์งธ .then()์— ์ด์–ด์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹(chaning)์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

.then() ๋ฉ”์„œ๋“œ ๋ฌธ๋ฒ•
.then(function onFullfilled, [function onRejected]

์š”์ฒญ์„ ํ–ˆ์œผ๋ฉด ์‘๋‹ต์„ ๋ฐ›์„ ์ฐจ๋ก€์ด๋‹ค.
์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด .then() ๋ฉ”์„œ๋“œ๊ฐ€ 2๋ฒˆ ๋‚˜์˜จ๋‹ค.

fetch('https://jsonplaceholder.typicode.com/posts', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json;charset=utf-8',
  },
  body: JSON.stringify({
    title: 'update title',
    content: '์„œ๋ฒ„์— ์š”์ฒญํ• ๋•Œ ๋‹ด์•„์„œ ๋ณด๋‚ด๋Š” ์ •๋ณด',
  }),
}) 
                                              //์š”์ฒญ
  .then((response) => response.json())
  .then((data) => console.log(data));
                                              //์‘๋‹ต

์ฒซ ๋ฒˆ์งธ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๋Š” then์˜ ์ฝœ๋ฐฑ์— response๋ผ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ console.log๋กœ ์‹คํ–‰ํ•ด ๋ณด๋ฉด ์•„๋ž˜์˜ ๊ฐ’์ด ๋ฐ˜ํ™˜๋œ๋‹ค.

๐Ÿ“—status code์— ๋”ฐ๋ฅธ ์ฒซ๋ฒˆ์งธ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ

์•„๋ž˜๋Š” response๋ฅผ console๋กœ ์ถœ๋ ฅํ•œ ์ฝ”๋“œ์ด๋‹ค. response ๊ฐ์ฒด์— ์—ฌ๋Ÿฌ๊ฐ€์ง€ key๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ๋ฐ˜ํ™˜๋œ key๋ฅผ ํ™œ์šฉํ•ด ๊ทธ ๋‹ค์Œ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.
-์š”์ฒญ ์„ฑ๊ณต-
-์š”์ฒญ ์‹คํŒจ-

ํ†ต์‹ ์˜ ์„ฑ๊ณต, ์‹คํŒจ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๋Š” ๊ธฐ์ค€์€ status์ด๋‹ค. status๋Š” statuscode๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ํ†ต์‹  ์„ฑ๊ณต์€ 200 - 299์ผ ๋•Œ ok๊ฐ’์ด true์ด๊ณ , ํ†ต์‹ ์ด ์‹คํŒจํ•œ ๊ฒฝ์šฐ statuscode๊ฐ€ 400 - 499 | 500 - 599์ด๊ณ  ok ๊ฐ’์€ false๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค.

//์ฒซ๋ฒˆ์งธ ์‘๋‹ต ๋ถ„๊ธฐ์ฒ˜๋ฆฌ ์˜ˆ์‹œ

fetch('https://jsonplaceholder.typicode.com/posts', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json;charset=utf-8',
  },
  body: JSON.stringify({
    title: 'update title',
    content: '์„œ๋ฒ„์— ์š”์ฒญํ• ๋•Œ ๋‹ด์•„์„œ ๋ณด๋‚ด๋Š” ์ •๋ณด',
  }),
})
  .then((response) => {
    if (response.ok === true) {
      return response.json();
    }
    throw new Error('์—๋Ÿฌ ๋ฐœ์ƒ!'); //reponse.ok๊ฐ€ true๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ error๋ฅผ throw
  })
  .catch((error) => console.log(error)); //throw๋œ error๋ฅผ ๋ฐ›์•„์„œ console์— ์ถœ๋ ฅ

ํ†ต์‹ ์€ ์„ฑ๊ณต๊ณผ ์‹คํŒจ ์—ฌ๋ถ€๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ์ฒซ ๋ฒˆ์งธ ์‘๋‹ต๋ฐ›์€ status ์ฝ”๋“œ์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. ํ†ต์‹ ์— ์„ฑ๊ณตํ•˜๋ฉด response์˜ body๋ฅผ ๊ฐ์ฒด๋กœ ๋งŒ๋“œ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ํ†ต์‹ ์— ์‹คํŒจํ•˜๋ฉด console์— ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์˜ˆ์‹œ์ด๋‹ค. ๋งŒ์•ฝ ์‹คํŒจํ•˜๋ฉด ์›์ธ์„ ์ฐพ์•„ ์ˆ˜์ •ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ํ†ต์‹ ์— ์„ฑ๊ณตํ•˜๋ฉด ์‘๋‹ต๋ฐ›์€ response ๊ฐ์ฒด ์ค‘ body์˜ ๊ฐ’์€ JSON ํ˜•ํƒœ์ด๋‹ค.
JSON์€ ์ž๋ฐ”์ŠคํŠธ๋ฆฝใ…‡ํŠธ์˜ ๋ฌธ๋ฒ•์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์œผ๋กœ ๋งŒ๋“ค์–ด์•ผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.
์ฒซ ๋ฒˆ์งธ then์—์„œ response.json()๋ฉ”์„œ๋“œ๊ฐ€ JSON ํ˜•ํƒœ๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ์ฒซ๋ฒˆ์งธ then์—์„œ JSON์—์„œ ๊ฐ์ฒด๋กœ ๋ณ€ํ–ˆ๊ณ , ๋ฆฌํ„ด๋œ ๊ฐ์ฒด๋Š” ๋‘๋ฒˆ์งธ then() ๋ฉ”์„œ๋“œ๋กœ ๋„˜๊ฒจ์ง„๋‹ค.

๐Ÿ“—์ฒซ ๋ฒˆ์งธ ์‘๋‹ต์—์„œ ๋ฐ˜ํ™˜๋œ ๊ฐ์ฒด๋กœ ๋‘๋ฒˆ์งธ ์‘๋‹ต์—์„œ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ

ํ†ต์‹ ์— ์„ฑ๊ณตํ•ด์„œ JSON์„ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ–ˆ๋‹ค๋ฉด, ๋ณ€ํ™˜๋œ ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•ด์„œ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

//๋‘๋ฒˆ์งธ ์‘๋‹ต ๋ถ„๊ธฐ์ฒ˜๋ฆฌ ์˜ˆ์‹œ

fetch('๋กœ๊ทธ์ธ API', {
  method: 'post',
  body: JSON.stringify({
    id: 'qawsedrf',
    password: '123456',
  }),
})
  .then((response) => {
    if (response.ok === true) {
      return response.json();
    }
    throw new Error('์—๋Ÿฌ ๋ฐœ์ƒ!');
  })
  .catch((error) => console.log(error))
  .then((data) => {
    if (data.message === 'login success') {
      localStorage.setItem('TOKEN', data.token);
      alert('๋กœ๊ทธ์ธ ์„ฑ๊ณต');
    } else {
      alert('๋กœ๊ทธ์ธ ์‹คํŒจ');
    }
  });

//data ์˜ˆ์‹œ
  data: {
    message: 'login success',
    token:    'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjo1fQ.Dy3PPHIOFFe3ScGTb8x3hewItnpOcgC9YDdW7v27XHg',
  },
profile
๋Š์ž„์—†์ด ๋…ธ๋ ฅํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž (โธโธโขโธโธ) เท†

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