๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Front-end/Browser

๋ธŒ๋ผ์šฐ์ €์™€ Node JS : ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•๋“ค (์ถ”๊ฐ€์ค‘)

by ciocio 2021. 10. 20.

๐Ÿ“  ํด๋ผ์ด์–ธํŠธ ๋‹จ์˜ API ํ˜ธ์ถœ์„ ๋„์™€์ฃผ๋Š” Node.js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

 

โœ”  request

โœ”  axios

โœ”  jQuery

 

 

๐Ÿ“  ํด๋ผ์ด์–ธํŠธ ๋‹จ์˜ API ํ˜ธ์ถœ์„ ๋„์™€์ฃผ๋Š” ๋ธŒ๋ผ์šฐ์ € ๋‚ด์žฅ ๊ฐ์ฒด or ํ•จ์ˆ˜

 

โœ”  XMLHttpRequest - ๊ฐ์ฒด

โœ”  fetch( ) - ํ•จ์ˆ˜

 

 

๐Ÿ“Œ  XMLHttpRequest ํŠน์ง•

 

โ—พ  XML๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

โ—พ  ์˜ค๋ž˜๋œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์•„์ง๊นŒ์ง€๋„ ์“ด๋‹ค.

โ—พ  fetch๊ฐ€ ์•„์ง ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋Š” ์ผ๋“ค์„ ์œ„ํ•ด ์“ฐ์ธ๋‹ค. ( ex. ์—…๋กœ๋“œ ์ง„ํ–‰ ์ƒํ™ฉ ์ถ”์ ํ•˜๊ธฐ )

โ—พ  ๋ฐ์ดํ„ฐ๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜๋„ ์žˆ๊ณ , ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜๋„ ์žˆ๋‹ค.

 

 

๐Ÿ“Œ  XMLHttpRequest ์‚ฌ์šฉ๋ฒ•

 

๐Ÿ“Ž  ๋ฌธ๋ฒ•

// request๋ฅผ ์š”์ฒญํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 3๊ฐ€์ง€ ๋‹จ๊ณ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
// 01 XMLHttpRequest ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. (์ƒ์„ฑ๊ณผ ํ•จ๊ป˜ ๋ชจ๋“  ์š”์ฒญ์€ ์ดˆ๊ธฐํ™”๋œ๋‹ค.)
// 02 request ์š”์ฒญ์— ํ•„์š”ํ•œ ์˜ต์…˜์„ ์ •์˜ํ•ด์ค€๋‹ค.
// 03 request ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.

// 01
let xhr = new XMLHttpRequest();

// 02
xhr.open(method, URL, [options]);  // options์—์„œ asunc, uer, password ๋“ฑ ์„ค์ • ๊ฐ€๋Šฅ

โœ”  Asynchronous
// xhr.open(method, URL, true) ์˜ต์…˜์„ ์ถ”๊ฐ€๋กœ ์ค€๋‹ค.
โœ”  Synchronous
// (default๊ฐ’์œผ๋กœ ์„ค์ •๋˜์žˆ์Œ)
// xhr.open(method, URL, false) ์˜ต์…˜์„ ์ถ”๊ฐ€๋กœ ์ฃผ๊ฑฐ๋‚˜ ์•ˆ์ ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

// 03
xhr.send([body]);

 

// XMLHttpRequest ๋ฉ”์„œ๋“œ๋Š” ์‘๋‹ต์„ xhr event handler ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

// load : ์‘๋‹ต์ด ์™„๋ฒฝํžˆ ๋ฐ›์•„์ ธ์™”์„ ๋•Œ (์„ฑ๊ณต/์‹คํŒจ ์ƒ๊ด€์—†์ด ์ฒ˜๋ฆฌ)
// error : ์‘๋‹ต์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์„ ๋•Œ (๋„คํŠธ์›Œํฌ๊ฐ€ ๋‹ค์šด๋˜์—ˆ๊ฑฐ๋‚˜ URL์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ฒ˜๋ฆฌ)
// progress : ์‘๋‹ต์ด download๋  ๋•Œ์˜ ์ƒํ™ฉ์„ ์ฃผ๊ธฐ์ ์œผ๋กœ ํŠธ๋ฆฌ๊ฑฐํ•ด์•ผํ•  ๋•Œ

xhr.onload = function(){
  console.log('Loaded', `${xhr.status} ${xhr.response}`);
};

xhr.onerror = function(){
  console.log('Error');
};

xhr.onprogress = function(event){
  console.log(`Received ${event.loaded} of ${event.total}`);
  // event.loaded : ๋‹ค์šด๋กœ๋“œํ•œ ๋ฐ”์ดํŠธ ์ˆ˜ ํ™•์ธ ๊ฐ€๋Šฅ
  // event.total : ์ด ๋ฐ”์ดํŠธ ์ˆ˜ ํ™•์ธ ๊ฐ€๋Šฅ
  // event.lengthComputable = true ์ด๋ฉด ์„œ๋ฒ„์—์„œ Content-Length ํ—ค๋”๋ฅผ ๋ณด๋‚ด์ค€๋‹ค.
};

 

๐Ÿ“Ž  ์˜ˆ์‹œ 

let xhr = new XMLHttpRequest();

xhr.open('GET', 'https://code-designer.tistory.com/manage/newpost/');

xhr.send();

xhr.onload = function(){
  if(zhr.status === 200){
    console.log('Success', `${xhr.response}`);
  }
  else{
    console.log('Error', `${xhr.status} ${xhr.statusText}`);
  }
  
  // xhr ํ”„๋กœํผํ‹ฐ๋“ค
  // xhr.status : HTTP ์ƒํƒœ ์ฝ”๋“œ
  // xhr.statusText : HTTP ์ƒํƒœ ๋ฉ”์„ธ์ง€
  // xhr.response(xhr.responseText) : ์‘๋‹ต๋œ body
  
};

xhr.onerror = function(){
  console.log('Error');
};

// xhr.onprogress = function(event){
//   if(event.lengthComputable){
//     console.log(`Received ${event.loaded} of ${event.total} bytes`);
//   }
//   ์‘๋‹ต์— Content-Length ํ—ค๋”๊ฐ€ ์—†์„ ๋•Œ
//   else{
//     console.log(`Reveived ${event.loaded} bytes`);
//   }
// }

 

 

๐Ÿ“Œ  Fetch API ํŠน์ง•

 

โ—พ  Fetch API๋Š” ์–ธ์ œ๋‚˜ Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

โ—พ  HTTP error ์ผ๋•Œ reject๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ , ๋Œ€์‹  ok ์ƒํƒœ๊ฐ€ false์ธ resolve๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

       -->  Promise์˜ ํŠน์„ฑ๊ณผ ์™„์ „ํžˆ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ์Œ

       -->  BUT  ๋„คํŠธ์›Œํฌ ์žฅ์• ๋‚˜ ์š”์ฒญ ์ž์ฒด๊ฐ€ ์™„๋ฃŒ๋˜์ง€ ๋ชปํ•˜๋ฉด reject๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

โ—พ  Fetch API๋Š” ์ฟ ํ‚ค๋Š” ์ฃผ๊ณ  ๋ฐ›์ง€ ์•Š๋Š”๋‹ค. ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•˜๊ณ ์‹ถ์œผ๋ฉด credential ์˜ต์…˜์„ ๋ฐ˜๋“œ์‹œ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.  

 

 

๐Ÿ“Œ  Fetch API ์‚ฌ์šฉ๋ฒ•

 

๐Ÿ“Ž  ๋ฌธ๋ฒ•

// fetch()
// ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ URL, ๋‘๋ฒˆ์งธ ์ธ์ž๋กœ ์˜ต์…˜ ๊ฐ์ฒด๋ฅผ ๋ฐ›๋Š”๋‹ค.

fetch(url, [options])
  .then((response) => console.log(response))
  .catch((error) => console.log(error));

 

๐Ÿ“Ž  ์˜ˆ์‹œ 1

fetch('https://code-designer.tistory.com/manage/newpost/')
  .then((response) => console.log(response));
  
// Response 
// {type: 'basic', redirected: false, status: 200, ok: true, 
//  url: 'https://code-designer.tistory.com/manage/newpost/'…}

 

๐Ÿ“Ž  ์˜ˆ์‹œ 2

// ์ด๋ ‡๊ฒŒ ์˜ต์…˜์— ๋ฉ”์„œ๋“œ์™€ ํ—ค๋”, ๋ฐ”๋””๊นŒ์ง€ ์ •์˜ํ•œ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•ด fetch ์š”์ฒญ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
// ์˜ต์…˜ ๊ฐ์ฒด๊ฐ€ ์—†์œผ๋ฉด default๋กœ GET ์š”์ฒญ์ด ๋œ๋‹ค.

let url = 'https://code-designer.tistory.com/manage/newpost/';
let data = { id: 1 };

fetch(url, {
  method: 'POST' // ๋˜๋Š” 'PUT'
  headers: {
    'Content-Type': 'application/json'
  }
  body: JSON.stringify(data), // data๋Š” ๋ฌธ์ž๊ฑฐ๋‚˜ ๊ฐ์ฒด ๊ฐ€๋Šฅ.
}).then(res => res.json())
  .then(data => console.log('Success', data))
  .catch(error => console.log('Error', error));

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€