2021/08/23
์ธ๋ค์ผ ๋ฉ์ด์ปค(๋งํฌ) ์ ๋ง๋ค์์ผ๋ ๋ค๋ค ๊ฐ์ ํ์ธํด๋ณด์ธ์!
์ต๊ทผ์ ๊ทธ๋ฐ ์ง๋ฌธ์ ๋ดค์๋ค.
setTimeout
์ ์ด์ฉํด ๋น๋๊ธฐ์ฒ๋ผ ํ๊ฒฝ์ ๊ตฌ์ฑํด์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌํ๋ ์ฝ๋์ธ๋ฐ ์ด๊ฒ ์ ์ ๋์๊ฐ๋๊ณ .
์ฝ๋๋ ๊ฐ์ ธ์ฌ ์ ์๊ณ , ๋์ถฉ ์ํ๋ ๊ฒฐ๊ณผ๋ ์ด๋ฌํ๋ค.
1
2
3
Done!
์์ฒ๋ผ ๋์ค๊ฒ ํ๊ณ ์ถ์๋ฐ
Done!
1
2
3
๊ฒฐ๊ณผ๋ ์ด๋ฌ๋ค๋ ๊ฒ์ด๋ค.
๋น๋๊ธฐ๋ฅผ ๋ชจ๋ฅด๋ ๊ฐ๋ฐ์๋, Promise์ ๋ํด ๊น์ด ์๊ฐํด๋ณด์ง ์์ ๊ฐ๋ฐ์์๋ค๋ฉด ์ด๋ผ ์ด๊ฑฐ ์ ์ด๋ฌ์ง?? ๋ผ๊ณ ์๊ฐํ์ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ ๋๋ ์ฝ๋๋ฅผ ๋ณด์๋ง์ ๋ฌธ์ ์ ์ ๋ ์ฌ๋ ธ๋ค.
์ด๊ฑฐ
Promise
๊ฐ ์๋ค
๊ทธ๋ฌ๋ค. Promise
์์ด ๊ทธ์ setTimeout
๊ณผ async/await
๋ฅผ ํผํฉํด ๋๊ณ ์ setTimeout
์ await
๋ฅผ ํตํด ๊ธฐ๋ค๋ฆฌ๋ผ๊ณ ํ๋ ๊ฒ์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์ต์ ๋ฌธ๋ฒ๋ง์ ๋ฐฐ์ฐ๋ ๋ด๋น๋ค์๊ฒ์ ์์ฃผ ๋ํ๋๋ ๋ฌธ์ ์ด๋ค. async/await
๋ฅผ ๋งน์ ํ ๋๋จธ์ง Promise
๋ฅผ ๊ตฌ์๋์ ์ ๋ฌผ๋ก ์ทจ๊ธํ์ฌ ์ฐ์ง ์์ผ๋ ค๋ ๋ฌธ์ .
๋ฌผ๋ก ์ต์ ๋ฌธ๋ฒ์ด ํธํ ๊ฑด ๋ง์ง๋ง, async/await
๋ ๊ธธ์ด์ง๋ ์ฝ๋ฐฑ ์ง์ฅ, ๋ฉ์๋ ์ฒด์ด๋์ ํผํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ด์ง, Promise
๋ฅผ ์ ๋ฐ๋ฐ๋ฅ์ผ๋ก ๋ณด๋ด๋ฒ๋ฆฌ๋ ๋ฐฉ๋ฒ์ด ์ ๋ ์๋๋ค!
์ด์ ๋ถํฐ
Promise
์async/await
๋ฅผ ์ฌ์ฉํด ๋น๋๊ธฐ ์ต์ ํ๋ฅผ ํด๋ณด์!
Promise
์๋ ์ฌ๋ฌ ๋ฉ์๋๋ค์ด ์๋ค. ์ฌ๋ฌ ๋น๋๊ธฐ ์ค ๊ฐ์ฅ ๋นจ๋ฆฌ ๊ฐ์ ธ์ค๋ ๊ฒ๋ง ๋ฐํํ๋ค๋ ์ง, ์ฌ๋ฌ ๊ฐ์ ๋น๋๊ธฐ๋ฅผ ๋ณ๋ ฌ๋ก ํ ๋ฒ์ ๊ฐ์ ธ์จ๋ค๋ ์ง ํ๋ ๋ฑ๋ฑโฆ
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ํ์๋ฅผ ์ดํด๋ณผ ๊ฒ์ด๋ค.
์ฌ์ค ๋ฌธ์๋ฅผ ์ฝ๋ ๊ฒ ์ ๋ง ์ ๋ง ์ข์ ์ ํ์ด์ง๋ง, TL;DR๋ฅผ ์ํด ๊ฐ๋จํ ์์ฝํ์๋ฉด,
return new Promise((resolve, reject) => {
//์ฑ๊ณตํ๋ฉด
resolve('๋ฐํ ๊ฐ')
//์คํจํ๋ฉด
reject('๋ฐํ ๊ฐ')
})
์ด๋ ๊ฒ Promise ๊ตฌ์กฐ๋ฅผ ์ตํ๋๋ฉด ๋๋ค.
์ฃผ๋ก setTimeout
์ ์์์ ์ฌ์ฉํด ์๊ฐ์ด ์ง๋๋ฉด resolve
ํ๊ฒ ํ๋ ์์ผ๋ก ํ
์คํธ๋ฅผ ํ๊ณค ํ๋ค.
์ญ์๋ TL;DR๋ฅผ ์ํด์ ๊ฐ๋จํ ํ๊ณ ์ถ์ ๋ง๋ง ํ์๋ฉด,
await
๋ ๋ญ๋ ์ฐ์ฐ์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ฃผ๋ ๋ง๋ฅ ์ฝ๋๊ฐ ์๋๋ค!
await
๋ Promise์ pending
์ํ๊ฐ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ฃผ๋ ๊ฒ์ด์ง, setTimeout
์ ์ผ์ ์๊ฐ ์ดํ์ ์คํ ์ปจํ
์คํธ
์ ์ถ๊ฐ๋๊ณ ์คํ๋๋ ๊ฒ์ ๊ธฐ๋ค๋ ค์ฃผ๋ ๊ฒ์ด ์๋๋ค.
์ด ๋ถ๋ถ์ ๋ฐ๋ก
์คํ ์ปจํ ์คํธ
๋ฅผ ๊ณต๋ถํ๋ฉด ์ดํดํ๊ฒ ๋ ๊ฒ์ด๋ค.
์๋ ์ดํดํ๊ธฐ ์ํด์๋ ๋จ๊ณ๊ฐ ํ์ํ๋ค.
setTimeout
์ผ๋ก ๋น๋๊ธฐ์ฒ๋ผ ๊พธ๋ฏธ๊ธฐawait
๋ฅผ ์ฌ์ฉํด์ ๋ค์ ๊ฐ๊ฐ ์์๋๋ก ๋น๋๊ธฐ๋ก ๊ฐ์ ธ์๋ณด๊ธฐfor
๋ฌธ์ ์ฌ์ฉํ๋ฉด ๋๋๊ตฌ๋!์ด๋ฌํ ์ค๊ฐ ๊ณผ์ ๋ค ์๋ตํ๊ณ , ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋น ๋ฅด๊ฒ ๋ณด์.
Promise.all()
์ ์ฌ์ฉํด ๋ณ๋ ฌ๋ก ํ ๋ฒ์ ๊ฐ์ ธ์ค๊ธฐ๋ฐฑ๋ฌธ์ด ๋ถ์ฌ์ผ๊ฒฌ์ด๋ผ๊ณ , ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ดํด๊ฐ ์ฝ๋ค.
const getPromiseCrewList = () => {
// ํฌ๋ฃจ ๋ฆฌ์คํธ๋ฅผ ๋น๋๊ธฐ๋ก ๋ฐํํ๋ ํจ์
return new Promise(resolve => {
// Promise๋ฅผ ๋ฐํํด์ค์ผ await ์ฌ์ฉ๊ฐ๋ฅ
setTimeout(() => {
const crewList = ['Spike', 'Ain', 'Jet', 'Faye', 'Edward']
resolve(crewList) // crewList๋ฅผ ๋ฐํํด์ค๋ค.
}, 2000)
})
}
const processParallelPromise = name => {
// ๊ฐ๊ฐ์ ์ด๋ฆ๋ค์ ๋ํด ๋น๋๊ธฐ๋ก ๋์ํ๋ ํจ์
return new Promise(resolve => {
setTimeout(() => {
name.length > 3 ? resolve(true) : resolve(false)
}, 1000)
})
}
const startParallelPromise = async () => {
// ๋น๋๊ธฐ๋ก ๊ฐ์ ธ์จ ๋ฐฐ์ด์ ์์ดํ
์ ๊ฐ๊ฐ ๋น๋๊ธฐ ํจ์์ ๋๊ฒจ์ฃผ๋ ํจ์
console.time('Parallel')
const crew = await getPromiseCrewList()
// ["Spike", "Ain", "Jet", "Faye", "Edward"], 3์ด ๋ค์ ๋ฐฐ์ด์ ๋ฐํํ๋ค.
const mappingPromiseArray = crew.map(c => processParallelPromise(c))
// [Promise, Promise, Promise, Promise, Promise], ์ด์ฒ๋ผ Promise์ ๋ฐฐ์ด๋ก ๋ง๋ค์ด์ค๋ค.
const makeParallelPromiseArray = Promise.all(mappingPromiseArray)
// Promise {<pending>}, Promise์ ๋ฐฐ์ด์ด๊ธฐ์ Promise.all์๊ฒ ๋๊ฒจ์ฃผ๋ ๊ฒ ๊ฐ๋ฅํด์ง๋ค.
const isOverThree = await makeParallelPromiseArray
// Promise.all() ๋๋ถ์ ๋ณ๋ ฌ๋ก ๋ถ๋ฌ์ค๊ฒ ๋๋ค.
console.log(isOverThree) // [true, false, false, true, true]
console.timeEnd('Parallel') // about 3002ms
}
startParallelPromise()
๋ง์ฝ ๋ณ๋ ฌ๋ก ์ ๋ถ๋ฌ์๋ค๋ฉด, ์ด๊ธฐ 2000ms + ๊ฐ๊ฐ 1000ms * 5๊ฐ ๋์ด 7์ด๊ฐ ๊ฑธ๋ ธ์ ๊ฒ์ด๋ค. ํ์ง๋ง ๋ณ๋ ฌ๋ก ๋ถ๋ฌ์จ ๋๋ถ์ ์ด๊ธฐ 2000ms + 1000ms๊ฐ ๋์ด ๊ฒจ์ฐ 3์ด๋ง์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ ๊ฐ๋ฅ!
์ฝ์์ฐฝ์ ๋ณด๋ฉด 3์ด๋ง์ ๋ชจ๋ ๊ฐ์ ๊ฐ์ ธ์จ ๊ฒ์ ์ ์ ์๋ค.
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด์ ์ดํดํ๋ฉด ๋คํ์ด์ง๋ง, ๊ทธ๊ฒ ์๋๋ผ๋ฉด ์๋์ ์ฐธ๊ณ ๋ฌธ์ ์ฝ์ด๋ณด๊ธธ ๊ถํ๋ค.
๋น๋๊ธฐ๋ ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์์๊ฒ๋ ์ด๋ ค์ด ๊ณผ์ ์ด๋ค. ๋๋ดํ์ง ๋ง๊ณ ์ด๋ก ์ ์ ์ดํด๋ณด๋ฉด ๊ธธ์ด ๋ณด์ผ ๊ฒ์ด๋ค!