Async/Await ๋ถํด ๐ฅ
3937 ๋จ์ด codequalitybeginnersjavascript
Async/Await
๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํฌํจ๋ ๋๋ผ์ด ๊ธฐ๋ฅ ์ค ํ๋์
๋๋ค. ๋๊ธฐ์ ์คํ์ผ๋ก ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์์ฑํ๋ ์ต๊ณ ์ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์, ์ ๋ค์์ต๋๋ค. ์ด ํจํด์ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ์๊ฐ ๊ธฐ๊ณ๋ฟ๋ง ์๋๋ผ ์ฌ๋์ด ์ฝ์ ์ ์๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ฝ๋๋ ๊ธฐ๊ณ๊ฐ ์คํํ๊ธฐ ์ํ ๊ฒ์ผ ๋ฟ๋ง ์๋๋ผ ์ธ๊ฐ์ด ํด์ํ๊ณ ๊ฐ๋ฐํ๊ธฐ ์ํ ๊ฒ์ด๊ธฐ๋ ํฉ๋๋ค.๊ตฌ๋ฌธ ์คํ์ ํํค์น๊ธฐ ์ ์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ์ผ๋ถ ์ ์์๋ฅผ ์ดํด๋ณด๊ณ ์ด ํจํด์ด ๋น๋๊ธฐ ์ธ๊ณ์์ ์ง์ ์ผ๋ก ๋ฌ์ฑ ์ด ๋ ์ ์๋ ์ด์ ๋ฅผ ์์๋ณด๊ฒ ์ต๋๋ค.
์ฝ๋ฐฑ
์ฝ๋ฐฑ์ ์ฝ์์ด ๋์ฐฉํ๊ธฐ ์ ์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ์๋ฃจ์ ์ด์์ต๋๋ค. ์ฝ๋ ํ๋ฆ๊ณผ ๋ณต์ก์ฑ์ ๊ณ ๋ คํ ๋ ๋น์ javascript์ ๊ณ ํต์ค๋ฌ์ด ๋ถ๋ถ ์ค ํ๋์์ต๋๋ค. ์, ๊ฐ๋ฐ์๋ฅผ ๋ง์ด ๊ดด๋กญํ์ต๋๋ค.
Inversion of control
๋ ์ด๋ฌํ ํ๋ก๊ทธ๋๋ฐ ํจํด์ ํผํ๊ธฐ ์ํ ์ฃผ์ ๊ด์ฌ์ฌ ์ค ํ๋์์ต๋๋ค.์๋ฅผ ๋ค์ด ๋ค์ ์ฝ๋
chunk
๋ฅผ ๊ณ ๋ คํ์ญ์์ค.somethirdPartyLibrary.checkout(function doPayment() {
initiatePayment();
})
ํ์ฌ ์๋น์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ฒดํฌ์์ ํ๋ก์ธ์ค๋ฅผ ์ฒ๋ฆฌํ๋ ์จ๋ผ์ธ ๋ถํธ ์บ ํ๋ฅผ ์ด์ํ๋ค๊ณ ์๊ฐํด ๋ณด์ญ์์ค. ๋์๊ด์ด ๊ณ ๊ฐ์๊ฒ ์ฒญ๊ตฌํ ์๊ฐ์ ๊ฒฐ์ ํ๋ฉด ์ฝ๋ฐฑ(doPayment)์ ํธ์ถํ์ฌ ์ง๋ถ์ ๊ธฐ๋กํฉ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ฝ๋ฐฑ์ ํ ๋ฒ ํธ์ถํ๋ฉด ๋ชจ๋ ๊ฒ์ด ์ ์์ ๋๋ค. ์ผ๋ถ ๋ฌธ์ ๋ก ์ธํด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ฝ๋ฐฑ์ ์ฌ๋ฌ ๋ฒ ํธ์ถํ๊ฑฐ๋ ์ ํ ํธ์ถํ์ง ์๋ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ๋ฉ๋๊น? ์ด๋ก ์ธํด ์ฌ๊ฐํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณ ๊ณ ๊ฐ์ ์ ๋ขฐ๊ฐ ๊นจ์ง ์ ์์ต๋๋ค.
์ด๊ฒ์ด ์์์ ๋ ผ์ํ ์ ์ด ์ญ์ ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๊ณ ๊ฐ์๊ฒ ์ฒญ๊ตฌํ๋ ๊ถํ์ ๋์๊ด์ ๋๊ธฐ๊ณ ์์ต๋๋ค. ์ด๊ฒ์ ํผํด์ผ ํ ์ด์ํ ํจํด ์ค ํ๋์ด๋ฉฐ ์ฌ์ ํ ์ฌ์ฉ ์ค์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ตฌ๋ ์ํ์ ๋ํด ๊ณ ๊ฐ์๊ฒ ์๋ ค์ผ ํ๋ค๋ ๊ธฐ๋ฅ ์์ฒญ์ด ์๋ฌด๋ฐ๋ ์ค์ง ์์์ต๋๋ค. ์ฝ๋ฐฑ์ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ๊ธฐ๋ฅ์ ๊ตฌํํ ๊ฒ์ ๋๋ค.
somethirdPartyLibrary.checkout(function doPayment() {
initiatePayment(function notifyAboutSuccess() {
showSuccess();
}, function notifyAboutFailure() {
showFailure();
}
);
})
์ด๋ก ์ธํด ์ฝ๋ฐฑ์ด ์ฌ๋ฌ ๊ฐ ์ค์ฒฉ๋๊ณ ๋ค์ ํผ๋์ค๋ฝ์ต๋๋ค ๐ ๊ทธ๋ ์ฃ ? ์ด์ ์ฑ๊ณต ์๋ฆผ์ ์ฑ๊ณตํด์ผ ํ๋ ์์ ์ ์ํํ๋ ค๋ ๊ฒฝ์ฐ ์ด๋ฅผ notifyAboutFailure()์ ๋ํ ์ฝ๋ฐฑ์ผ๋ก ์ค์ฒฉํ๊ณ ๊ณง
callback hell
์ํ๊ฐ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ์ฐ๋ฆฌ์ ์ฝ๋ ํ๋ฆ์ ์ด์ ๊ฐ์ ๊ฒ์
๋๋ค.๊ตฌ์ฃผ๊ป์ ์ฝ์ํ์๋ค
๋ ๋ง์ ๊ฒ์ ์ํ ๊ธธ์ ๋ฆ์ ์ฝ์
human-readable code
. ์ฝ์์ ์ฌ์ฉํ์ฌ ์๋๋ฆฌ์ค๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํ ์ ์์ต๋๋ค.somethirdPartyLibrary.checkout()
.then(initiatePayment)
.then(showSuccess)
.catch(showFailure)
์ฌ๊ธฐ์์๋ ํ๋ฆ์ด ๊น๋ํ๋ฉฐ ๊ณ ๊ฐ์๊ฒ ์๊ธ์ ์ฒญ๊ตฌํ๋ ์ ์ด๋ ์ฐ๋ฆฌ์ ํจ๊ป ํฉ๋๋ค. ์ผ๋ถ ์ฌ์ฉ์๋ somethirdPartyLibrary.checkout์ด ์ฌ๋ฌ ๋ฒ ํ์ธ๋๋ฉด
then
์ฌ๋ฌ ๋ฒ ์คํ๋ ์ง ์์ฌํ ์ ์์ต๋๋ค. ์๋์, ๊ทธ๋ ์ง ์์ต๋๋ค. Promise๋ ํ ๋ฒ๋ง ํด๊ฒฐ๋๊ฑฐ๋ ๊ฑฐ๋ถ๋ ์ ์์ต๋๋ค. Promise๋ ์ง๊ธ๊น์ง ๋งค์ฐ ํ๋ฅญํ์ต๋๋ค. ์ฌ๊ธฐ์ ์ ์ผํ ๊ด์ฌ์ฌ๋ ์ผ๋ถ ์์
์ด ํด๊ฒฐํ Promise์ ์์กดํ๋ ๊ฒฝ์ฐ ์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋ ์์
์ then
์ด๋ฒคํธ ํธ๋ค๋ฌ์ ๋ํํด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค. asynchronous code
๋ฐฉ์์ผ๋ก synchronous
๋ฅผ ์ธ ์ ์๊ฒ ํด์ฃผ๋ ๋ง๋ฒ ๊ฐ์ ํด๊ฒฐ์ฑ
์ ๋ฌด์์ผ๊น์?์์ด์์ด ์จ๋ค ๐ฏ
Async/Await๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ์ ๋ค์ ์์ฑํ ์ ์์ต๋๋ค.
(async function() {
try {
await somethirdPartyLibrary.checkout()
await initiatePayment();
showSuccess();
} catch(err) {
showFailure(err);
}
})();
์ด๊ฑด ์ ๋ง ๋ง๋ฒ์ด ๋ง์ฃ ?
๋ฌด๋๋จ๋ฆฌ๋ค
์ด๋ฌํ ์ข ๋ฅ์ ํ๋ฆ์ javascript์์
Generators
๋ก ๋ฌ์ฑ๋ฉ๋๋ค. ์, Async/Await๋ ์์ฑ๊ธฐ ๋ฐ Promise Underhood์ ๋์์ผ๋ก ๊ตฌํ๋ฉ๋๋ค.function resumeHandleCheckout() {
iterator.next();
}
function* handleCheckout() {
yield someThirdPartyLibrary.checkout();
yield initiatePayment();
showSuccess();
}
let iterator = handleCheckout();
let promiseFromLibrary = iterator.next();
promiseFromLibrary
.then(resumeHandleCheckout)
.then(resumeHandleCheckout)
.catch(showFailure);
Async/Await์ ์ธ๋ํ๋ ๋ฉ์ปค๋์ฆ์ ์ป์ ์ ์์ต๋๊น? ๋ชจ๋ ๋ณต์ก์ฑ์ ์ฒ๋ฆฌํ๊ณ ๊ตฌ๋ฌธ ์คํ์ ์ ๊ณตํฉ๋๋ค.
์ด๋ ๊ฐ๋ฐ์๊ฐ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ๋๊ธฐ์ ์คํ์ผ๋ก ์์ฑํ ์ ์๊ณ ์ด์ ์ฌ๋์ด ๋ ์ฝ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ฒ ํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ง์ ํ ๊ฑฐ๋ ์ฐจ๋จ๊ธฐ์ ๋๋ค. ์ด ๊ฒ์๋ฌผ์ ๋๋ฃ๋ค๊ณผ๋ ์์ ๋กญ๊ฒ ๊ณต์ ํ์ญ์์ค.
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(Async/Await ๋ถํด ๐ฅ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/theaswathprabhu/breaking-down-async-await-akeํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค