๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ—‚ WIL/๐Ÿ“ JavaScript

๐Ÿ’ก axios await/async vs then

by nalong 2022. 8. 11.

๐Ÿ“… ๋ณธ ๊ธ€์€ 2022๋…„ 5์›” 13์ผ ๊ฐœ์ธ github ์— ์ž‘์„ฑ๋œ ๊ธ€์ž…๋‹ˆ๋‹ค.

๐Ÿš€ axios await / async vs then

ํ”„๋กœ์ ํŠธ ๋ฐฐํฌ ๋‹น์ผ ๋ฐค์„ ๊ผฌ๋ฐ• ์ƒˆ์šฐ๊ณ  ์•„์นจ์— ๊ธ‰ํ•˜๊ฒŒ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด์•ผํ•˜๋Š” ์ผ์ด ์ƒ๊ฒผ๋‹ค.
ํ”„๋ก ํŠธ์—์„œ๋Š” ๋‚ด๊ฐ€ ๋งก์•„์„œ ํ•˜๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, ๊ฐ„๋‹จํ•œ ๊ธฐ๋Šฅ์ด์—ฌ์„œ ๋นจ๋ฆฌ ๋๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‚ด ์˜ˆ์ƒ๊ณผ ๋‹ฌ๋ฆฌ,๋ฐฑ ์—ฐ๊ฒฐ์—์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋‹ค. axios ๋ฅผ ์ด์šฉํ•ด์„œ get ์š”์ฒญ์„ ํ–ˆ๋Š”๋ฐ, data๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ–ˆ๋‹ค..๐Ÿ˜ต‍๐Ÿ’ซ ์ฒ˜์Œ์—๋Š” axios ๋ฌธ์ œ์ธ์ง€ ๋ชจ๋ฅด๊ณ  ๋‹ค๋ฅธ ๋ถ€๋ถ„์— ๋ฌธ์ œ์ธ๊ฑด๊ฐ€ ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด ์ด๋ฆฌ์ €๋ฆฌ ๊ณ ์ณ๋ณด๋‹ค, ์™œ ์ด๋Ÿด๊นŒ...ํ•œ์ฐธ ๊ณ ๋ฏผํ•˜๋‹ค ๊ทธ๋ƒฅ then ์„ ์ด์šฉํ•˜๋‹ˆ data ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์—ˆ๋‹ค...๊ฑฐ์˜ 1์‹œ๊ฐ„ ๋™์•ˆ์˜ ์‚ฝ์งˆ์ด์˜€๋‹ค...

๋ฌธ์ œ์˜ ์ฝ”๋“œ..๐Ÿฅฒ

  const [commentList, setCommentList] = useState([]);
  useEffect(() => {
    try {
      const res = Api.get('comment');
     console.log(res.data); // undefined
  }, []);

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

const [commentList, setCommentList] = useState([]);
useEffect(() => {
  try {
    Api.get('comment').then((res) => {
      setCommentList(res.data);
    });
  } catch (error) {
    console.log(error);
  }
}, []);

โš ๏ธ const ์™€ then ์˜ ์ฐจ์ด...?

์ฒ˜์Œ์—๋Š” ๋ณ€์ˆ˜๋กœ ๋ฐ›๋Š” ๊ฒƒ๊ณผ then ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ฐจ์ด์ธ ์ค„ ์•Œ์•˜๋‹ค. ๋‚˜๋„ ๋ชจ๋ฅด๋Š” ์ฐจ์ด์ ์ด ์žˆ๊ตฌ๋‚˜ ํ•˜๊ณ ...ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„์ด ๋๋‚˜๊ณ  ์ด ๋ฌธ์ œ์˜ ์›์ธ์„ ์•Œ๊ธฐ ์œ„ํ•ด ์•„๋ฌด๋ฆฌ ๊ตฌ๊ธ€์— ๊ฒ€์ƒ‰์„ ํ•ด๋„ ์ด ๋‘˜์˜ ์ฐจ์ด์ ์€ ๋‚˜์˜ค์ง€ ์•Š์•˜๋‹ค. ๊ทผ๋ฐ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•ด๋„...์ฐจ์ด๊ฐ€ ์žˆ๋‚˜ ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ๋‹ค์‹œ ๋ฌธ์ œ์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ˆ..await async ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค..๐Ÿฅฒ
async await ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‹ค์‹œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด๋‹ˆ ๋ฌธ์ œ์—†์ด data ๋ฅผ ๊ฐ€์ ธ์™”๋‹ค..!!

 

const [commentList, setCommentList] = useState([]);
useEffect(() => {
  sample();
}, []);
const sample = async () => {
  const res = await Api.get('comment');
  setCommentList(res.data);
};

 

๊ทธ๋Ÿผ then์„ ์‚ฌ์šฉํ•˜๋ฉด async await ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ๊ฒƒ์ธ๊ฐ€? ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ๐Ÿคฆ‍โ™€๏ธ
๊ธ€์„ ์ •๋ฆฌํ•˜๋ฉด์„œ ์ ๋Š” ์ด ์ˆœ๊ฐ„์—๋„ ์ด๋Ÿฐ ๊ฒƒ์„ ์ œ๋Œ€๋กœ ๋ชฐ๋ž๋‹ค๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋„ˆ๋ฌด..์–ด์ด๊ฐ€ ์—†๋‹ค.
์‹ฌ์ง€์–ด ๋ถ€๋„๋Ÿฝ๊ฒŒ๋„ ๋“œ๋ฆผ์ฝ”๋”ฉ ์œ ํŠœ๋ธŒ๋ฅผ ํ†ตํ•ด ๋“ฃ๊ณ  ์ •๋ฆฌ๊นŒ์ง€ ํ•œ ๋ถ€๋ถ„๋“ค์ธ๋ฐ,,,,์•„๋ฌด ์ƒ๊ฐ์—†์ด ํ–ˆ๊ตฌ๋‚˜. ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์ด๋ฒˆ ๊ธ€์˜ ์ฃผ์ œ๋Š” axios then , await/async ์ด๋‹ค!

โš ๏ธ ์ผ๋‹จ ๋น„๋™๊ธฐ ๋‹ค์‹œ ํ•œ๋ฒˆ ๋” ์•Œ์•„๋ณด์ž!

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

โญ๏ธ  Promise ๋ž€?

  const [commentList, setCommentList] = useState([]);
  useEffect(() => {
    try {
      const res = Api.get('comment');
     console.log(res); // Promise ๊ฐ์ฒด
     console.log(res.data); // undefined
  }, []);

 

์œ„์˜ ์ฝ”๋“œ์—์„œ console.log(res) ๋Š” Promise ๊ฐ์ฒด๊ฐ€ ์ถœ๋ ฅ๋˜๊ณ , console.log(res.data) ๋Š” undefined ์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 


๋‚˜๋Š” ์ถœ๋ ฅ๋œ Promise ๊ฐ์ฒด๋ฅผ ๋ณด๊ณ , ์–ด! ์–ด๋””์„œ ๋ดค๋Š”๋ฐ? ํ•˜๊ณ  ์ง€๋‚˜์ณค๋‹ค... ๊ทธ์ € ์™œ res.data ๊ฐ€ undefined ์œผ๋กœ ์ถœ๋ ฅ๋˜๋Š” ์ด์œ ์—๋งŒ ์ง‘์ค‘์„ ํ•˜๊ณ  ์™œ ์•ˆ๋˜์ง€? ๋งŒ ๋ฐ˜๋ณตํ–ˆ์—ˆ๋‹ค.๐Ÿคฆ‍โ™€๏ธ
์™œ ์•ˆ๋œ๊ฑธ๊นŒ? then ์„ ์จ์•ผ์ง€!!!!!!!!
์ผ๋‹จ Promise ๊ฐ€ ๋ฌด์—‡์ธ์ง€๋ถ€ํ„ฐ ๋‹ค์‹œ ์ •๋ฆฌํ•ด๋ณด์ž! (callback ์€ ์—ฌ๊ธฐ์„œ๋Š” ์ •๋ฆฌํ•˜์ง€ ์•Š๊ฒ ๋‹ค. )


โœ… Promise?

์‰ฝ๊ฒŒ ๋งํ•ด, ๋น„๋™๊ธฐ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ฒด์ด๋‹ค.

 

์˜ˆ์ „์— velog ์— ๋“œ๋ฆผ์ฝ”๋”ฉ ์œ ํŠœ๋ธŒ ๊ฐ•์˜ ์ค‘ ๋น„๋™๊ธฐํŽธ์—์„œ ์ •๋ฆฌํ•ด๋†“์€ ๊ธ€์ด๋‹ค. Promise ๋Š” ๋น„๋™๊ธฐ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ฒด์ด๋‹ค!

์กฐ๊ธˆ ๋” ์ถ”๊ฐ€ํ•˜์ž๋ฉด,

 

์‹คํ–‰์€ ๋ฐ”๋กœ ํ•˜์ง€๋งŒ, ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค ๋ฐ›์•„์˜ค๊ธฐ ์ „์— ๋ฐ์ดํ„ฐ๋ฅผ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๋ ค๊ณ  ํ•˜๋ฉด, ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ๋นˆ ํ™”๋ฉด์ด ์ถœ๋ ฅ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ํ”„๋กœ๋ฏธ์Šค๋‹ค!

โœ… Promise ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” then ์„ ์ด์šฉํ•œ๋‹ค!

ํ”„๋กœ๋ฏธ์Šค ์ƒํƒœ์ •๋ณด์—๋Š”

panding(๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์•„์ง ์ˆ˜ํ–‰๋˜์ง€ ์•Š์€ ์ƒํƒœ = ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์ƒ์„ฑ๋œ ์งํ›„ ๊ธฐ๋ณธ ์ƒํƒœ),

fulfilled(๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰๋œ ์ƒํƒœ(์„ฑ๊ณต)= resolve ํ•จ์ˆ˜ ํ˜ธ์ถœ),

rejected(๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰๋œ ์ƒํƒœ(์‹คํŒจ)= reject ํ•จ์ˆ˜ ํ˜ธ์ถœ),

seletted(๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์„ฑ๊ณต,์‹คํŒจ์™€ ์ƒ๊ด€์—†์ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰๋œ ์ƒํƒœ) ๊ฐ€ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋งŒ๋“ค์–ด์ง„ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด then, catch, finally ๊ฐ€ ์žˆ๋‹ค.

then : ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์„ฑ๊ณตํ–ˆ์„ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜์™€ ์‹คํŒจํ–ˆ์„ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜ ์ด ๋‘ ๊ฐœ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค.
finally : ํ”„๋กœ๋ฏธ์Šค์˜ ์„ฑ๊ณต, ์‹คํŒจ์™€ ์ƒ๊ด€์—†์ด ๋ฌด์กฐ๊ฑด ํ•œ๋ฒˆ ํ˜ธ์ถœ๋œ๋‹ค.
catch: ํ”„๋กœ๋ฏธ์Šค ์ƒํƒœ๊ฐ€ rejected ์ธ ๊ฒฝ์šฐ์—๋งŒ ํ˜ธ์ถœ.

์•„๋ž˜์˜ ์ˆœ์„œ๋„๋ฅผ ํ†ตํ•ด ๋” ์ž์„ธํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค!

 

๊ทธ๋Ÿผ ๋‚˜์˜ ๋ฌธ์ œ์˜ ์ฝ”๋“œ๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ Promise ๋ฅผ ์ด์šฉํ•œ ์ฝ”๋“œ๋กœ ์ˆ˜์ •ํ•˜๋ฉด,

์ผ๋‹จ ์—๋Ÿฌ์ฒ˜๋ฆฌ๋ฅผ try catch ๊ตฌ๋ฌธ์ด ์•„๋‹Œ catch ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค!

const [commentList, setCommentList] = useState([]);
useEffect(() => {
  Api.get('comment')
    .then((res) => {
      setCommentList(res.data);
    })
    .catch((err) => {
      console.log('then error: ', err);
    });
}, []);

โญ๏ธ ๊ทธ๋Ÿผ async/ await ?

๊ฐ€์žฅ ์ตœ๊ทผ์— ๋‚˜์˜จ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฌธ๋ฒ•์œผ๋กœ Promise ์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด! ๋‚˜์™”๋‹ค.

Promise ์˜ ๋‹จ์ ์ด ๋ฌด์—‡์ผ๊นŒ? ๋ฐ”๋กœ then ์ง€์˜ฅ, ๊ผฌ๋ฆฌ์— ๊ผฌ๋ฆฌ๋ฅผ ๋ฌด๋Š” ์ฝ”๋“œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

async/ await ๋Š” ์ด๋Ÿฐ promise ์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜์—ฌ, ๊ฐ€๋…์„ฑ์ด ์ข‹๋‹ค!

โœ… ๊ธฐ๋ณธ ๋ฌธ๋ฒ•

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

 

โœ”๏ธ async : function ์•ž์— async ๋ฅผ ๋ถ™์ด๋ฉด, ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ Promise ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค!
๋งŒ์•ฝ Promise ๊ฐ€ ์•„๋‹Œ ๊ฐ’์ด ๋ฐ˜ํ™˜ ๋˜๋”๋ผ๋„ ์ดํ–‰ ์ƒํƒœ์˜ Promise ๋กœ ๊ฐ’์„ ๊ฐ์‹ธ Promise ๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค๊ณ  ํ•œ๋‹ค!
โœ”๏ธ await : async ํ•จ์ˆ˜ ์•ˆ์—์„œ๋งŒ ์ž‘๋™! ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” await ํ‚ค์›Œ๋“œ๋ฅผ ๋งŒ๋‚˜๋ฉด, Promise ๊ฐ€ ์ฒ˜๋ฆฌ๋  ๋•Œ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค!
โš ๏ธ ๋‹จ try ~ catch ๊ตฌ๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค!

โš ๏ธ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ ์ฝ”๋“œ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋ฐ, ์ต๋ช… async ํ•จ์ˆ˜๋กœ ์ฝ”๋“œ๋ฅผ ๊ฐ์‚ฌ๋ฉด ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ ์ฝ”๋“œ์—๋„ await ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค!

 

(async () => {
  let response = await fetch('/article/promise-chaining/user.json');
  let user = await response.json();
  ...
})();

๋งˆ๋ฌด๋ฆฌ

๋„ˆ๋ฌด ์–ด์ฒ˜๊ตฌ๋‹ˆ ์—†๊ณ , ๋ถ€๋„๋Ÿฌ์šด ์‹ค์ˆ˜์˜€๋‹ค.
์ง€๊ธˆ์ด๋ผ๋„ ์•Œ๊ฒŒ๋˜์–ด ๋งค์šฐ ๋‹คํ–‰์ด๋‹ค...๐Ÿฅฒ
์ œ๋Œ€๋กœ ๊ณต๋ถ€ํ•˜์ž!

๐Ÿ–‡ Reference

https://ko.javascript.info/async-await
๋“œ๋ฆผ์ฝ”๋”ฉ ์ •๋ฆฌ ๊ธ€ : https://velog.io/@naakite/6-Callback-Promise