[TIL] AJAX, Callbackํ•จ์ˆ˜, Promise, Async/await

Soyeon Wonยท2022๋…„ 4์›” 28์ผ
1
post-thumbnail

๐Ÿ‘ฉโ€๐Ÿ’ป ์ด ํฌ์ŠคํŒ…์—์„œ๋Š” ๋น„๋™๊ธฐ์™€ ๊ด€๋ จ๋œ ๊ฐœ๋…๋“ค์— ๋Œ€ํ•ด ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋™๊ธฐ(Sync)์™€ ๋น„๋™๊ธฐ(Async)์˜ ์ฐจ์ด?

  • ๋™๊ธฐ์‹ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ด๋– ํ•œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๋‹ค์Œ ์ฝ”๋“œ๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ
  • ๋น„๋™๊ธฐ์‹ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์™„๋ฃŒ๋˜๊ธธ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ

๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€

ํŠน์ • ์ฝ”๋“œ์˜ ์™„๋ฃŒ ์—ฌ๋ถ€์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ์ฆ‰์‹œ ๋‹ค์Œ ์ฝ”๋“œ๋กœ ๋„˜์–ด๊ฐ„๋‹ค. ๋น„๋™๊ธฐ ๋ฐฉ์‹์ด ํ•„์š”ํ•œ ์ด์œ ๋Š” ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋œ๋‹ค๋ฉด ๊ทธ๋™์•ˆ ๋นˆ ํ™”๋ฉด์ด ๋ Œ๋”๋ง ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค. ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•˜๋ฉด์„œ ์ž์›์˜ ํšจ์œจ์  ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๋‹ค.

๋น„๋™๊ธฐ ๋ฐฉ์‹์ด๋ž€

์›นํŽ˜์ด์ง€๋ฅผ ๋ฆฌ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ์‹.
Ajax๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์— ์š”์ฒญํ•œ ํ›„ ๋ฉˆ์ถฐ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ”„๋กœ๊ทธ๋žจ์€ ๊ณ„์† ๋Œ์•„๊ฐ„๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๋‚ดํฌํ•˜๊ณ  ์žˆ๋‹ค.



AJAX

Asynchronous JavaScript and XML์˜ ์•ฝ์ž.
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•ด ์„œ๋ฒ„์™€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ํ†ต์‹  ๊ธฐ๋Šฅ์ด๋‹ค.

  • ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ๋ฆฌ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ  ํŽ˜์ด์ง€์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ์ผ๋ถ€๋งŒ ๋ฆฌ๋กœ๋“œํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.
  • ์ตœ๊ทผ์—๋Š” XML๋ณด๋‹ค JSON์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

AJAX์˜ ์žฅ๋‹จ์ 

์žฅ์ 

  • ์ „์ฒด๋ฅผ ๋ฆฌ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ  ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋ฆฌ๋กœ๋“œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์›นํŽ˜์ด์ง€์˜ ์†๋„๊ฐ€ ํ–ฅ์ƒ๋œ๋‹ค.
  • ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋งŒ ์ „์†กํ•˜๋ฉด ๋˜๋ฏ€๋กœ ์ „์ฒด์ ์ธ ์ฝ”๋“œ ์–‘์ด ์ค„์–ด๋“ ๋‹ค.

๋‹จ์ 

  • SEO์— ๋ถˆ๋ฆฌํ•˜๋‹ค. AJAX ๋ฐฉ์‹์˜ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ•œ ๋ฒˆ ๋ฐ›์€ HTML์„ ๋ Œ๋”๋ง ํ•œ ํ›„, ์„œ๋ฒ„์—์„œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ๊ทธ๋ ค๋‚ด๋Š”๋ฐ ์ฒ˜์Œ ๋ฐ›๋Š” HTML ํŒŒ์ผ์—๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฑ„์šฐ๊ธฐ ์œ„ํ•œ ํ‹€๋งŒ ์ž‘์„ฑ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ๋•Œ๋ฌธ์— ์‚ฌ์ดํŠธ์˜ ์ •๋ณด ์ˆ˜์ง‘์ด ์–ด๋ ต๋‹ค.
  • ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ์—ฐ์†์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋ฉด ์„œ๋ฒ„์— ๊ณผ๋ถ€ํ•˜๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค.
  • ํŽ˜์ด์ง€์˜ ์ด๋™์ด ์—†๋Š” ํ†ต์‹ ์œผ๋กœ ๋ณด์•ˆ์ƒ์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.



์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ๊ฐœ๋…

  • ๋‹ค๋ฅธํ•จ์ˆ˜์˜ ์ธ์ž๋กœ์จ ์ด์šฉ๋˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.
  • ์ˆœ์ฐจ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  • ES6 ์ด์ „์— ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ๋•Œ ์‚ฌ์šฉ๋œ ๋ฐฉ๋ฒ•์ด๋‹ค.
  • ์ฝœ๋ฐฑ์ง€์˜ฅ์— ๋น ์ง€๋ฉด ๋“ค์—ฌ์“ฐ๊ธฐ ์ˆ˜์ค€์ด ๋†’์•„์ง€๋ฉฐ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง„๋‹ค. Promise๋‚˜ Async/Await๋ฅผ ์ด์šฉํ•ด ๋ณด์™„ํ•œ๋‹ค.



Promise์˜ ๊ฐœ๋…

  • ๋น„๋™๊ธฐ๋ฅผ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์˜ค๋ธŒ์ ํŠธ์ด๋‹ค.
  • ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•ด ES6์—์„œ ์ƒˆ๋กœ ๋‚˜์˜จ ๋ฌธ๋ฒ•์ด๋‹ค.
  • ์„ฑ๊ณต(resolve), ์‹คํŒจ(reject)๋ฅผ return
  • new Promise์˜ ์ธ์ž์ธ ์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” ํ˜ธ์ถœํ•  ๋•Œ ๋ฐ”๋กœ ์‹คํ–‰, ๋‚ด๋ถ€์— resolve ๋˜๋Š” reject ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ตฌ๋ถ„์ด ์‹คํ–‰๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๋‹ค์Œ then or catch ๊ตฌ๋ฌธ์œผ๋กœ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค.

Promise์˜ ์ƒํƒœ

new Promise()๋กœ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ 3๊ฐ€์ง€ ์ƒํƒœ๋ฅผ ๊ฐ–๋Š”๋‹ค.

  1. Pending(๋Œ€๊ธฐ) : ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋กœ์ง์ด ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ์ƒํƒœ
  2. Fulfilled(์ดํ–‰) : ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜์–ด ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์ค€ ์ƒํƒœ
  3. Rejected(์‹คํŒจ) : ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์‹คํŒจํ•˜๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ์ƒํƒœ

Promise ์‚ฌ์šฉ ์˜ˆ์ œ ์ฝ”๋“œ

function getData(){
  return new Promise(function (resolve, reject){
    $.get('url ์ฃผ์†Œ/products/1', function(response){
      if(response){
        resolve(response);
      }
      reject(new Error('Request is failed'));
    });
  });
}

//Fulfilled ๋˜๋Š” Rejected์˜ ๊ฒฐ๊ณผ ๊ฐ’ ์ถœ๋ ฅ

getData().then(function(data){
  console.log(data); //response ๊ฐ’ ์ถœ๋ ฅ
}).catch(function(err){\
console.log(err); //error์ถœ๋ ฅ
})



async await

  • ๊ธฐ์กด์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์™€ Promise์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•ด์„œ ๋‚˜์˜จ ๋ฌธ๋ฒ•.
  • Promise ์œ„์— ์กฐ๊ธˆ ๋” ๊ฐ„ํŽธํ•œ api๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • ๋‹ค์ˆ˜์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ž‘์—…์„ ํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.
  • try/catch๋ฅผ ์ด์šฉํ•ด์„œ ์—๋Ÿฌ๋ฅผ ํ•ธ๋“ค๋ง ํ•œ๋‹ค.

async / await ์‚ฌ์šฉ ์˜ˆ์ œ ์ฝ”๋“œ

async function ํ•จ์ˆ˜๋ช…(){
  await ๋น„๋™๊ธฐ_์ฒ˜๋ฆฌ_๋ฉ”์„œ๋“œ_๋ช…();
}

ํ•จ์ˆ˜ ๋‚ด๋ถ€ ๋กœ์ง ์ค‘ HTTP ํ†ต์‹ ์„ ํ•˜๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ฝ”๋“œ ์•ž์— await๋ฅผ ๋ถ™์ธ๋‹ค.
! ์ฃผ์˜ํ•ด์•ผํ•  ์  ! : ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ๊ฐ€ ๊ผญ Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ await๊ฐ€ ์˜๋„๋Œ€๋กœ ๋™์ž‘ํ•œ๋‹ค.


์ผ๋ฐ˜์ ์œผ๋กœ await์˜ ๋Œ€์ƒ์ด ๋˜๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๋Š” axios๋“ฑ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” APIํ˜ธ์ถœ ํ•จ์ˆ˜์ด๋‹ค.



async / await ์™€ Promise์˜ ์ฐจ์ด

โœ”๏ธ ์—๋Ÿฌ ํ•ธ๋“ค๋ง

  • Promise๋Š” .catch()๋ฌธ์œผ๋กœ ์—๋Ÿฌ ํ•ธ๋“ค๋ง์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • Async / await์€ ์—๋Ÿฌ ํ•ธ๋“ค๋ง ๊ธฐ๋Šฅ์ด ๋”ฐ๋กœ ์—†์–ด try/catch()๋ฌธ์„ ํ™œ์šฉํ•œ๋‹ค.
  • Promise๋Š” .then()์ด ์ด์–ด์ง€๋Š” then ์ง€์˜ฅ์˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์งˆ์ˆ˜๋ก async/await๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ๊ฐ€๋…์„ฑ์— ์ข‹๋‹ค.
profile
Frontend

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

comment-user-thumbnail
2023๋…„ 3์›” 3์ผ

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค^^

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ