-
[JavaScript] ๋ ๋์ ๋น๋๊ธฐ ํต์TECH 2022. 3. 27. 15:02
ํ๋ฆฌ์จ๋ณด๋ฉ ํ์๋ค๊ณผ ํจ๊ป ๋ฉด์ ์คํฐ๋๋ฅผ ์์ํ๋ค! ์ด๋ฒ ์ฃผ ์ฃผ์ ์ค ํ๋์ธ Promise, callback hell, async/await, fetch ๋ฑ์ ๋ํด ์์ธํ ์์๋ณด๋ ์๊ฐ์ ๊ฐ์ก๋ค. API๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋ async/await๋ fetch๋ฅผ ์ฌ์ฉํ๋ฉด์๋ ๋ด๋ถ์ ์ผ๋ก ์ด๋ป๊ฒ ๋์ํ๋์ง๋ ์ ๋ชจ๋ฅด๊ณ ์์๋๋ฐ ์ด๋ฒ ๊ธฐํ์ ๋ด๋ถ ๋์์ด ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋์ง ๊ณต๋ถํด ๋ณผ ์ ์์๋ค.
๊ทธ๋ผ ๋ฐ๋ก ์์~
โ๏ธ ์ฝ๋ฐฑ ํจ์
ํจ์์ ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ๋ค๋ฅธ ํจ์์ ๋ด๋ถ๋ก ์ ๋ฌ๋๋ ํจ์๋ฅผ ์ฝ๋ฐฑ ํจ์(callback function)๋ผ๊ณ ํ๋ค. ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ํจ์์ ์ธ๋ถ์์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ๋ฌ๋ฐ์ ํจ์๋ ๊ณ ์ฐจ ํจ์(Higher-Order Function, HOF)๋ผ๊ณ ํ๋ค.
ํน์ ์์ ์ n ๋ฒ ๋ฐ๋ณต์ํค๋ ํจ์๊ฐ ์๋ค๊ณ ํ์.
function repeat(n) { for (let i = 0; i < n; i++) { console.log(i); } } repeat(5); // 0 1 2 3 4
console.log(i) ๋์ ๋ค๋ฅธ ์์ ์ n๋ฒ ๋ฐ๋ณต์ํค๊ณ ์ถ์ ์๋ ์์ ๊ฒ์ด๋ค. ๊ทธ๋ด ๋ ํจ์๋ก n๊ณผ ๊ฐ์ด ์ฝ๋ฐฑ ํจ์๋ฅผ ๋๊ฒจ ์ค๋ค๋ฉด ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋๋ก ํน์ ์์ ์ ๋ฐ๋ณต์ํฌ ์ ์๋ค.
function repeat(n, callback) { for (let i = 0; i < n; i++) { callback(i); } } const logAll = (i) => { console.log(i); }; repeat(5, logAll); // 0 1 2 3 4 const logOdds = (i) => { if (i % 2) console.log(i); }; repeat(5, logOdds); // 1 3
โ๏ธ callback hell
๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฐ์ํด์ ์ฌ์ฉํ ๋ ์ค์ฒฉ๋๋ฉด์ ์๊ธฐ๋ ๋ฌธ์ ๋ฅผ ๋ณดํต ์ฝ๋ฐฑ ์ง์ฅ(callback hell)์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
$.get("<https://api.test.com/proudcts>", function (response) { var firstProductId = response.products[0].id; $.get( "<https://api.test.com/proudct/comments?id=>" + firstProductId, function (response) { var firstCommentId = response.comments[0].id; $.get( "<https://api.test.com/proudct/comment/likes?id=>" + firstCommentId, function (response) { var likes = response.likes; var likesCount = likes.length; } ); } ); });
์ด๋ ๊ฒ ์ฝ๋ฐฑ์ด ์ค์ฒฉ๋์ด ์๋ ์ฝ๋๋ ๊ฐ๋ ์ฑ๋ ์ข์ง ์์๋ฟ๋๋ฌ ์ ์ง ๋ณด์ ํ๊ธฐ๋ ์ด๋ ต๋ค๋ ๋จ์ ์ด ์๋ค.
โ ์ฝ๋ฐฑ ์ง์ฅ ๊ฐ์
์ฝ๋ฐฑ ์ง์ฅ์ Promise ์ฌ์ฉ, Async/Await ์ฌ์ฉ, ์ฝ๋ฉ ํจํด ๊ฐ์ ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
์ฝ๋ฉ ํจํด์ผ๋ก ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ด ์ค์ฒฉ๋์ด ์๋ ์ฝ๋ฐฑ์ ๋ฐ๋ก ๋ถ๋ฆฌํ์ฌ ์์ฑํ๋ ๋ฐฉ๋ฒ์ด๋ค.
function fetchCommentLikes(commentId) { $.get( "<https://api.test.com/proudct/comment/likes?id=>" + commentId, function (response) { var likes = response.likes; var likesCount = likes.length; } ); } function fetchComments(productId) { $.get( "<https://api.test.com/proudct/comments?id=>" + productId, function (response) { var firstCommentId = response.comments[0].id; fetchCommentLikes(firstCommentId); } ); } $.get("<https://api.test.com/proudcts>", function (response) { var firstProductId = response.products[0].id; fetchComments(firstProductId); });
๊ทธ๋ฌ๋ ์ด๋ง์ ๋ ํ๋ฆ์ ์ซ์๊ฐ๋ฉฐ ์ฝ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋์ ์ฉ ์ ๋ค์ด์ค์ง๋ ์๋๋ค.
โ๏ธ Promise๋?
ํ๋ก๋ฏธ์ค๋ ์ค์ฒฉ๋๋ ๋น๋๊ธฐ ํต์ ๋ก์ง๊ณผ ์ฝ๋ฐฑ ์ง์ฅ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๊ธฐ๋ฒ์ด๋ค.
๐ก ์ธํฐ๋ท ์ต์คํ๋ก๋ฌ๋ ํ๋ก๋ฏธ์ค๋ฅผ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ธํฐ๋ท ์ต์คํ๋ก๋ฌ ํธํ์ฑ์ด ํ์ํ๋ค๋ฉด ํ๋ก๋ฏธ์ค ๋์ AJAX๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
โ๏ธ ํ๋ก๋ฏธ์ค ๊ฐ์ฒด์ ์ํ
ํ๋ก๋ฏธ์ค ์ธ์คํด์ค๋ ์งํ ์ค์ธ ๋น๋๊ธฐ ์์ , ๊ทธ์ ๋ฐ๋ฅธ ๊ฒฐ๊ณผ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ, ์ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
ํ๋ก๋ฏธ์ค ์ธ์คํด์ค๋ Pending, Fulfilled, Rejected 3๊ฐ์ ์ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๋ค. ๊ทธ๋ฆฌ๊ณ ์ํ์ ๋ฐ๋ฅธ 2๊ฐ์ ๋ฉ์๋ resolve์ reject๋ฅผ ๊ฐ์ง๋ค.
๋๊ธฐ ์ค(Pending) ํ๋ก๋ฏธ์ค ๊ฐ์ฒด์ ๊ธฐ๋ณธ ์ํ, ๋น๋๊ธฐ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ๋์ค์ง ์์ ์ํ ์ดํ ์๋ฃ(Fulfilled) ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋์ด ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ํ. resolve() ํจ์๋ฅผ ํธ์ถํจ ๊ฑฐ๋ถ๋จ(Rejected) ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ ์๋ฃ๋์์ง๋ง ์คํจํ ์ํ. reject() ํจ์๋ฅผ ํธ์ถํจ โ๏ธ ํ๋ก๋ฏธ์ค ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
let myPromise = new Promise((resolve, reject) => { setTimeout(() => { let result = "promise fulfilled"; resolve(result); }, 1000); }); myPromise .then((successMessage) => { console.log(successMessage); }) .catch((failMessage) => { console.log(failMessage); });
์๋ก์ด ํ๋ก๋ฏธ์ค ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋๋ ํ๋ผ๋ฉํฐ 2๊ฐ๋ฅผ ๊ฐ์ง๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ ํจ์๋ฅผ ์์ฑํ๋ค.
์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ ์ฑ๊ณตํ์ ๋ ํธ์ถํ๋ ์ดํ ์๋ฃ ํจ์๋ช ์ด๊ณ , ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ ์คํจํ์ ๋ ํธ์ถํ๋ ๊ฑฐ๋ถ ํจ์๋ช ์ด๋ค.
๊ด์ต์ ์ผ๋ก ์ดํ ์๋ฃ ํจ์๋ช ์ resolve, ๊ฑฐ๋ถ ํจ์๋ช ์ reject๋ก ์์ฑํ์ง๋ง success, fail ๋ฑ์ผ๋ก ์์ฑํด๋ ๊ด์ฐฎ๋ค.
ํ๋ผ๋ฉํฐ์์ ์ ํ ํจ์๋ช ์ ํธ์ถํ๋ฉด then()๊ณผ catch() ์ค ํ๋๋ฅผ ํธ์ถํ๋ค. resolve()๊ฐ ํธ์ถ๋๋ฉด then() ๋ฉ์๋์ ํ๋ผ๋ฉํฐ์ ์ ์ํ ์ฝ๋ฐฑ ํจ์๊ฐ ์คํ๋๊ณ , reject()๊ฐ ํธ์ถ๋๋ฉด catch() ๋ฉ์๋์ ํ๋ผ๋ฉํฐ์ ์ ์ํ ์ฝ๋ฐฑ ํจ์๊ฐ ์คํ๋๋ค.
โ๏ธ ๋ค์ค ํ๋ก๋ฏธ์ค ์ฒ๋ฆฌ
function asyncWork(value) { return new Promise((resolve, reject) => { setTimeout(() => { value -= 20; if (value > 50) { resolve(value); } else { reject(value); } }); }); } asyncWork(100) .then((value) => { console.log(value); return asyncWork(value); }) .then((value) => { console.log(value); return asyncWork(value); }) .then((value) => { console.log(value); return asyncWork(value); }) .catch((error) => { console.log("catch: " + error); });
asyncWork ํจ์๋ ํ๋ก๋ฏธ์ค ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค. ๋ฐ๋ผ์ ํจ์๋ฅผ ํธ์ถํ๋ฉฐ ๋ฉ์๋ ์ฒด์ธ์ผ๋ก then()์ ์คํํ ์ ์๋ค. ์์ ์์๋ then()์ ์ฐ๋ฌ์ ์ฒด์ธ ๋ฐฉ์์ผ๋ก ์ฌ๋ฌ ๊ฐ ํธ์ถํ๋ค.
๋ค์ค ํ๋ก๋ฏธ์ค๋ ์ฒด์ธ์ผ๋ก ํธ์ถํ๋ then() ๋ฉ์๋์ ์ฝ๋ฐฑ ํจ์์ ๋ฆฌํด ๊ฐ์ผ๋ก ํ๋ก๋ฏธ์ค ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ํจ์๋ฅผ ๋ค์ ํธ์ถํ๋ค๋ ๊ฒ์ด๋ค. ๋ฐํ๋ ํ๋ก๋ฏธ์ค ์ธ์คํด์ค๋ ๋ค์ then()์ ํ๋ก๋ฏธ์ค ์ธ์คํด์ค๊ฐ ๋๋ค. then() ๋ฉ์๋๋ ์ฝ๋ฐฑ ํจ์์์ ๋ฐํํ๋ asyncWork() ํ๋ก๋ฏธ์ค ์ธ์คํด์ค์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๊ธฐ ์ ๊น์ง ๋ค์ then()์ ํธ์ถํ์ง ์๊ณ ๋๊ธฐํ๋ค.
∴ ๋ฐ๋ผ์ ๋ชจ๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ ์์ ์ then์ ์ฝ๋ฐฑ ํจ์ ์์๋๋ก ํ๋์ฉ ์คํ๋๊ณ , ์ฝ๋ฐฑ ํจ์์ ํ๋ผ๋ฉํฐ๋ฅผ ํตํด ๊ฒฐ๊ณผ ๊ฐ์ ์์ฐจ์ ์ผ๋ก ์ ๋ฌํ๋ค.
๋ง์ง๋ง์ผ๋ก ํ๋ก๋ฏธ์ค ์ธ์คํด์ค ์ํ๊ฐ ๊ฑฐ์ ์ํ๊ฐ ๋๋ฉด ๋ค์ then()์ด ์๋ catch()๋ฅผ ์คํํ๋ฉฐ ์๋ฌ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๊ณ ์ข ๋ฃํ๋ค. ์๋จ์ ์ฝ๋๋ value๋ฅผ 20์ฉ ์ฐจ๊ฐํ๋ฉฐ ๋ค์ then()์ ํธ์ถํ๊ณ , ๊ฐ์ด 50๋ณด๋ค ์์ผ๋ฉด ๊ฑฐ์ ์ํ๋ก ๋ณ๊ฒฝํ ํ catch()๋ฅผ ํธ์ถํ๋ฉด์ ๋น๋๊ธฐ ์ฒ๋ฆฌ ์ฒด์ธ์ ์ข ๋ฃํ๋ค.
ํ๋ก๋ฏธ์ค๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์์๋๋ก then() ๋ฉ์๋๋ฅผ ๋ถ์ฌ ๋์ดํ๊ธฐ ๋๋ฌธ์ ์ฝ๋ฐฑ ์ง์ฅ์์์ฒ๋ผ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ฝ๋๋ฅผ ์ค์ฒฉํ ํ์๊ฐ ์๋ค. ๋น๋๊ธฐ ์ฒ๋ฆฌ ์์ ์ ์ค๋ณต ์์ฑํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฒ๋ฆฌ ๊ตฌ์กฐ์ ํจ์จ์ด ์ข์์ง๊ณ ์ฝ๋ ๋๋ ์ค์ผ ์ ์๋ค. ๋ํ ๋น๋๊ธฐ ์ฒ๋ฆฌ ํ๋ฆ์ด ํ๋์ ๋ค์ด์ค๊ณ ์คํ ๊ตฌ์กฐ์ ์์๋ฅผ ๋ช ํํ๊ฒ ํ์ ํ ์ ์๋ค.
๐ callback๊ณผ promise์ ์ฐจ์ด
callback ํจ์๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ง์ ์ํ ๊ฒ์ ์๋๋ค. ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํ ๋๋ ์ฝ๋ฐฑ ํจํด์ด ์ฐ์ธ๋ค. ์ฝ๋ฐฑ ํจํด์ ์ฌ์ฉํ์ ๊ฒฝ์ฐ์๋ ์์ ๋๊ฐ ๋๋ค๋ ์ฅ์ ์ด ์์ง๋ง, ์ค์ฒฉ๋ ๊ฒฝ์ฐ ์ฝ๋๊ฐ ๋ณต์กํด์ ธ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง ์ ์์ผ๋ฉฐ, ์๋ฌ ์ฒ๋ฆฌ๊ฐ ๊น๋ค๋กญ๋ค.
ํ๋ก๋ฏธ์ค๋ ์ฝ๋ฐฑ ์ง์ฅ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ง์ ์ํ ๊ธฐ๋ฒ์ด๊ธฐ ๋๋ฌธ์ ์ฝ๋ฐฑ ํจํด๋ณด๋ค ์ฌ์ฉ๋ฒ์ด ๋ ํธ๋ฆฌํ๊ณ ๊ฐํธํ๋ค๊ณ ํ ์ ์๋ค. ํ๋ก๋ฏธ์ค ๋ด์ ์ดํ ์๋ฃ ์ํ์ผ ๋ ์คํํ๋ ํจ์, ๊ฑฐ๋ถ๋์์ ๋ ์คํํ๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์๋ฌ ์ฒ๋ฆฌ๋ ์ฝ๋ฐฑ ํจํด์ ์ฌ์ฉํ์ ๋๋ณด๋ค ๊ฐํธํ๋ค.
โ๏ธ ๊ฐํธํ Promise ๊ตฌํ์ ์ํ Fetch
fetch๋ ํ๋ก๋ฏธ์ค๋ฅผ ์ฌํฌ์ฅํด ๊ตฌ๋ฌธ์ ์กฐ๊ธ ๋ ๊ฐ๊ฒฐํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ ๋ํผ์ด๋ค. ๊ธฐ์ ์ ์ผ๋ก ํ๋ก๋ฏธ์ค์ ๋์ผํ๋ค.
ํ๋ก๋ฏธ์ค ์ธ์คํด์ค๋ฅผ ๋ง๋ค ํ์ ์์ด fetch ๋ฉ์๋์ ๋น๋๊ธฐ ์์ฒญ์ ํ URL๋ง ๋๊ธฐ๋ฉด ๋ฆฌํด ๊ฐ์ผ๋ก ํ๋ก๋ฏธ์ค ์ธ์คํด์ค๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ then~catch๋ก ์์ฐจ ์ฒ๋ฆฌ ํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.fetch("https://www.request.com/api/data.json") .then((response) => { console.log(response); }) .catch((error) => { console.log(error); });
fetch๋ ๋น๋๊ธฐ ์์ฒญ์ด ์คํจํ์ ๊ฒฝ์ฐ๋ง catch() ๋ด ๊ตฌ๋ฌธ์ ์คํํ๋ค. 404 ์๋ฌ(ํ์ด์ง ์์)๋ 500 ์๋ฌ(HTTP ์ํ)๋ ์คํ์ด ์๋ฃ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์๋ฌ๋ฅผ ํ์ธํ๊ธฐ ์ํด์๋ then() ์์์ ์ํ๋ฅผ ํ์ธํด ๋ณ๋๋ก ๊ทธ์ ๋ง๋ ์ฒ๋ฆฌ๋ฅผ ํด์ผ ํ๋ค.
if (response.status >= 200 && response.state <= 299) { // ์ ์์ ์ผ๋ก ์๋ฃ } else { // ์๋ฌ ๋ฐ์ }
โ๏ธ Async/Await๋?
Async/Await๋ ํ๋ก๋ฏธ์ค์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๊ฐ์ ํ๊ธฐ ์ํด ES8์์ ์๋กญ๊ฒ ์๊ฐ๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฌธ๋ฒ์ด๋ค.
โ ๏ธ ๋ฐ๋ผ์ ๊ตฌ ๋ฒ์ ์น ๋ธ๋ผ์ฐ์ ์์๋ ์ง์๋์ง ์์ผ๋ฏ๋ก ์ฌ์ฉ ์ ํธํ์ฑ ํ์ธ์ด ํ์ํ๋ค.
Async ํจ์ ๋ด๋ถ์์ ํ๋ก๋ฏธ์ค๋ฅผ ์ฌ์ฉํด ๋น๋๊ธฐ ์์ฒญ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
Promise์ ๋ค์ค ํ๋ก๋ฏธ์ค ์ฒ๋ฆฌ๋ฅผ Async/Await๋ฅผ ์ฌ์ฉํด ๋ฐ๊ฟ ๋ณด์.
function asyncWork(value) { return new Promise((resolve, reject) => { setTimeout(() => { value -= 20; if (value > 50) { resolve(value); } else { reject(value); } }); }); } let asyncFunc = async () => { try { let res = await asyncWork(100); console.log("resolve1: " + res); res = await asyncWork(res); console.log("resolve2: " + res); res = await asyncWork(res); console.log("resolve3: " + res); } catch (error) { console.log("catch: " + error); } }; asyncFunc();
resolve1: 80 resolve2: 60 catch: 40
Async์ Await๋ ํญ์ ์์ผ๋ก ์ฌ์ฉํด์ผ ํ๋ค. ํจ์ ๋ด๋ถ์ await๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ํจ์๋ฅผ ์ ์ธํ ๋ async ํจ์๋ก ์ ์ธํด์ผ ํ๋ค.
async ํจ์๋ฅผ ์คํํ๋ฉด async ํจ์ ์์ ์ ์ธ๋ ํ๋ก๋ฏธ์ค๊ฐ ์คํ๋๋๋ฐ, await ํค์๋๊ฐ ์๋ ํ๋ก๋ฏธ์ค๋ ์ดํ ์๋ฃ ์ํ๊ฐ ๋ ๋๊น์ง ๋ค์ ํ์ ์ฝ๋๋ฅผ ์คํํ์ง ์๊ณ ๋๊ธฐํ๋ค. ์ดํ ์๋ฃ๊ฐ ๋๋ฉด ์ฝ์์ ์๋ต ๋ด์ฉ์ ์ถ๋ ฅํ๊ณ ๋ค์ ์ฝ๋๋ฅผ ์คํํ๋ค.
ํ๋ก๋ฏธ์ค ๋น๋๊ธฐ ์ฝ๋์์ ๊ฑฐ๋ถ(reject)๊ฐ ๋ฐ์ํ๋ฉด try ~ catch ์ฒ๋ฆฌ์ ๋ฐ๋ผ catch() ์์ธ ์ฒ๋ฆฌ๋ฅผ ์คํํ๊ณ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ข ๋ฃํ๋ค.
Async/Await์ ์ฅ์
โ๏ธ- ์ผ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ ๊ฒ๊ณผ ๊ฐ์ ํํ๋ก ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์์ฐจ์ ์ผ๋ก ์คํ
- ์๋ฐ์คํฌ๋ฆฝํธ์ ๋๊ธฐ์ ํจ์/์ฝ๋์ ์ด์ง๊ฐ์ด ์๋ ํ๋ก๋ฏธ์ค์ ์ฒด์ธ ๋ฐฉ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ผ์ผ์ด ์์ฑํด์ผ ํ๋ ๋ถํธํจ์ด ์ฌ๋ผ์ง
- Fetch๋ณด๋ค ๊ฐ๋ ์ฑ์ด ์ข์
โ๏ธ Promise.all()
Promise.all ๋ฉ์๋๋ Array์ ๊ฐ์ด ์ํ ๊ฐ๋ฅํ ๊ฐ์ฒด์ ๋ชจ๋ ํ๋ก๋ฏธ์ค๊ฐ ์ดํ ์๋ฃํ ํ ์ดํํ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๋ค. ๋ง์ผ ํ๋ก๋ฏธ์ค ์ค ํ๋๊ฐ ๊ฑฐ๋ถ๋๋ค๋ฉด, ์ฒซ ๋ฒ์งธ๋ก ๊ฑฐ๋ถ๋ ํ๋ก๋ฏธ์ค๋ฅผ ์ฆ์ ๋ฐํํ๋ค.
Promise.all()์ ์ฌ๋ฌ ๊ฐ์ ๋น๋๊ธฐ ์์ ์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค. ์์ฐจ์ ์ผ๋ก ์งํํด์ผ ํ๋ ๋น๋๊ธฐ ์์ ์ด ์๋๋ผ๋ฉด Promise.all()์ ์ฌ์ฉํ์ฌ ํ๊บผ๋ฒ์ ์ฒ๋ฆฌํ๊ณ , ์๊ฐ์ ๋จ์ถํ ์ ์๋ค.
async function display(text, time) { return new Promise((resolve, reject) => { setTimeout( () => typeof text === "string" ? resolve("string์ ๋๋ค") : reject("string์ด ์๋๋๋ค"), time ); }); } /* await๋ฅผ ์ฌ์ฉํ์ ๋ */ console.time("์์ ์๊ฐ"); await display("ํ๋ฆผ", 3000); await display("ttaerrim", 2000); await display("LTR", 1000); console.timeEnd("์์ ์๊ฐ"); // ์์ ์๊ฐ: 6011.14306640625 ms /* Promise.all ์ฌ์ฉํ์ ๋ */ console.time("์์ ์๊ฐ"); await Promise.all([ display("ํ๋ฆผ", 3000), display("ttaerrim", 2000), display("LTR", 1000), ]); console.timeEnd("์์ ์๊ฐ"); // ์์ ์๊ฐ: 3001.381103515625 ms
์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ์๋ Promise.all()์ ๊ฒฝ์ฐ๊ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด ๋ ์งง๋ค.
/* await๋ฅผ ์ฌ์ฉํ์ ๋ */ console.time("์์ ์๊ฐ"); try { await display(1, 3000); await display(2, 2000); await display(3, 1000); } catch (error) { console.log(error); } console.timeEnd("์์ ์๊ฐ"); // ์์ ์๊ฐ: 3002.85791015625 ms /* Promise.all ์ฌ์ฉํ์ ๋ */ console.time("์์ ์๊ฐ"); try { await Promise.all([display(1, 3000), display(2, 2000), display(3, 1000)]); } catch (error) { console.log(error); } console.timeEnd("์์ ์๊ฐ"); // ์์ ์๊ฐ: 1002.778076171875 ms
๊ฐ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํ๋ ๊ฒฝ์ฐ์ด์ง๋ง, await๋ก ๊ฐ๊ฐ ์คํ์์ผฐ์ ๊ฒฝ์ฐ ์ฒซ ๋ฒ์งธ ํจ์๊ฐ ์คํ๋๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ธ 3์ด๋ฅผ ๋ชจ๋ ๋ค ์ฑ์ฐ๊ณ ๋ฐํ๋๋ค. Promise.all()์ ์ฌ์ฉํ์ ๊ฒฝ์ฐ์๋ ๊ฐ์ฅ ๋นจ๋ฆฌ ์๋ฌ๋ฅผ ๋ฐํํ๋ ํจ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋์ํด ๊ฐ์ฅ ์งง์ ์๊ฐ์ธ 1์ด๋ง์ ์๋ฌ๋ฅผ ๋ฐํํ๋ค.
๐ฉ ์ฐธ๊ณ
ES6๋ก ๊ธฐ์ด๋ถํฐ ๋ค์ ๋ฐฐ์ฐ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์๋ถ
์ธ์ Promise.all์ ์ฌ์ฉํด์ผ ๋ ๊น?
'TECH' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฆฌ์กํธ ์ฟผ๋ฆฌ์ StaleTime๊ณผ CacheTime (0) 2023.01.24 [React] useMemo์ useCallback๋ก ๋ฆฌ์กํธ ๋ ๋๋ง ์ฑ๋ฅ ์ต์ ํํ๊ธฐ(Feat. React.memo) (0) 2022.04.09 [React] Redux ๊ฐ๋ ์ ๋ฆฌ (0) 2022.03.13 [React] Checkbox (2) โ ๋ฒํผ์ผ๋ก ์ ํ ํด์ ํ๊ธฐ (0) 2022.02.21 [React] Checkbox (1) โ Context API๋ก Checkbox ์ํ ๊ด๋ฆฌํ๊ธฐ (0) 2022.02.19