[javascript] - Promise bulk๋ก ์ฒ๋ฆฌํ๊ธฐ
javascript์ ๊ฐ์ฒด ์ค Promise ๊ฐ์ฒด๋ ๋น๋๊ธฐ ์์ ์ด ๋ง์ดํ ๋ฏธ๋์ ์๋ฃ ๋๋ ์คํจ์ ๊ทธ ๊ฒฐ๊ณผ ๊ฐ์ ๋ํ๋ ๋๋ค.
MDN์ ์ค๋ช ์ผ๋ก ์๋์๊ฐ์ด ๊ฐ๋จํ๊ฒ ์์ฝํ ์ ์์ต๋๋ค.
[์ถ์ฒ] - https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise
Promise๋ ๋ค์ ์ค ํ๋์ ์ํ๋ฅผ ๊ฐ์ง๋๋ค.
- ๋๊ธฐ(pending): ์ดํํ์ง๋, ๊ฑฐ๋ถํ์ง๋ ์์ ์ด๊ธฐ ์ํ.
- ์ดํ(fulfilled): ์ฐ์ฐ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋จ.
- ๊ฑฐ๋ถ(rejected): ์ฐ์ฐ์ด ์คํจํจ.
๋๊ธฐ ์ค์ธ ํ๋ก๋ฏธ์ค๋ ๊ฐ๊ณผ ํจ๊ป ์ดํํ ์๋, ์ด๋ค ์ด์ (์ค๋ฅ)๋ก ์ธํด ๊ฑฐ๋ถ๋ ์๋ ์์ต๋๋ค. ์ดํ์ด๋ ๊ฑฐ๋ถ๋ ๋, ํ๋ก๋ฏธ์ค์ then ๋ฉ์๋์ ์ํด ๋๊ธฐ์ด(ํ)์ ์ถ๊ฐ๋ ์ฒ๋ฆฌ๊ธฐ๋ค์ด ํธ์ถ๋ฉ๋๋ค. ์ด๋ฏธ ์ดํํ๊ฑฐ๋ ๊ฑฐ๋ถ๋ ํ๋ก๋ฏธ์ค์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ฐ๊ฒฐํด๋ ํธ์ถ๋๋ฏ๋ก, ๋น๋๊ธฐ ์ฐ์ฐ๊ณผ ์ฒ๋ฆฌ๊ธฐ ์ฐ๊ฒฐ ์ฌ์ด์ ๊ฒฝํฉ ์กฐ๊ฑด์ ์์ต๋๋ค.
javascript์ ์ธ์ดํน์ง์ธ ๋น๋๊ธฐ์ฑ๋๋ฌธ์ Promise๊ฐ์ฒด๋ฅผ ๋ง์ด์ฐ๊ฒ๋๋๋ฐ ๊ฐ๊ฐ ํ๋์ Promise๋ฅผ ์คํํ๋ ๊ฒฝ์ฐ์๋ ํฌ๊ฒ ๊ณ ๋ฏผํ ๊ฒ ์๋๋ฐ, ์์ ์ ํ๋ค๋ณด๋ ์ฌ๋ฌ๊ฐ์ Promise ๊ฐ์ฒด๋ฅผ ์คํํด์ผํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ฒผ์ต๋๋ค! ์ฒจ์ ๋ณ ์๊ฐ์์ด Promise ์ฌ๋ฌ๊ฐ๋ฅผ ๋ฐฐ์ด์ ๋ฃ๊ณ Promise ๊ธฐ๋ณธํจ์์ ์๋ Promise.all ํน์ Promise.allsettled ํจ์๋ฅผ ์ฐ๋ฉด ํด๊ฒฐ๋ ๊ฑฐ๋ผ ์๊ฐํ์ต๋๋ค.
์๋ฅผ๋ค๋ฉด ์ด๋ฐ์์ผ๋ก ๋ง์ด์ฃ .
let p1 = new Promise((resolve, reject)=>{
...
})
let p2 = new Promise((resolve, reject)=>{
...
})
Promise.allSettled([p1, p2])
์ฐธ๊ณ ๋ก Promise.all๊ณผ Promise.allSettled์ ์ฐจ์ด๋ ๋ชจ๋ Promise๊ฐ์ฒด๋ฅผ ์ฑ๊ณต์์ผ์ผ ์ธ์ ํ ๊ฑด์ง ์๋๋ฉด ์ฑ๊ณตํ๋ Promise์ ์คํจํ๋ Promise๋ฅผ ์ผ๋์ ๋๊ณ ์คํ์ํฌ๊ฑด์ง์ ์ฐจ์ด์ธ๋ฐ, all์ ํ๋๋ผ๋ ์คํจํ๋ฉด ์คํจ๊ฐ ๋๊ณ , allSettled๋ 10๊ฐ์ค์ ํ๋๊ฐ ์คํจํด๋ ์ผ๋จ ์ ๋ถ ์คํ์ ํ๋ค๋ผ๋ ์ฐจ์ด์ ์ด ์์ต๋๋ค.
let promises = []
for(const requestUrl of requestUrls) {
promises.push(await this.util.httpRequest(url, 'GET'))
}
Promise.allSettled(promises)
for (const result of results) {
if(result.status === 'fulfilled') {
// ... ์ฑ๊ณต
} else {
// ... ์คํจ
}
}
์๋ฌดํผ๊ฐ ์ ๋ ๊ฒ Promise๊ฐ ์ ์๋๋ ์๊ด์ด ์์์ต๋๋ค. ๊ทผ๋ฐ ์ ๋ ์ฝ 1500๊ฐ ์ ๋์ Promise๋ฅผ ์คํ์ํค๋ ค ํ๋๋ฐ ์๋ฌ๊ฐ ๋จ๋๊ตฐ์.
http request๋ฅผ ํ๋ ๊ณต์ฉํจ์๋ฅผ ๋ง๋ค์ด์ ์ฌ๋ฌ๊ฐ์ url์ 'GET' ์ผ๋ก ํธ์ถํ๊ณ ์๋ต๊ฐ์ ๋ฐ์์ค๋ ์ํฉ์ด์๋๋ฐ ํ๋ฒ์ ๋๋ฌด ๋ง์ ์์ ํธ์ถํ๊ณ ์ฒ๋ฆฌํ๋ ค๊ณ ํ๋ Promise๊ด๋ จ๋ ์๋ฌ์ request๋ฅผ ๋ฐ๋ OPEN API ์ชฝ์์๋ ์๋ฌ๋ฅผ ๋ด๋๊ตฐ์.. ์ฐธ๊ณ ๋ก ์ ๋ ๊ธฐ์์ฒญ์ OPEN API๋ฅผ ํธ์ถํ๊ณ ์์์ต๋๋ค.
๊ทธ๋์ ์ฝ์ง์ ํ๋์ค, Promise ์ ์คํ์ ์ ์ดํ๋ค๋ limit๊ด๋ จ ๋ชจ๋๋ค์ด ์๋๊ฑธ๋ก ๋ณด์ ์ผ๋จ Promise์ ์คํ๊ฐ์๋ฅผ ์ค์ฌ์ผํ๋ค๊ณ ์๊ฐํ๊ณ , npm์์ ์ ๊ณตํ๋ ๋ชจ๋๋ค์ ์ฌ์ฉํ ๊น ํด๋ดค์ง๋ง javascript ๋ด๋ถํจ์๋ก๋ ๊ตฌํ์ด ๊ฐ๋ฅํ ๊ฒ ๊ฐ์์ ์๋์ ๊ฐ์ด ๋ฐ๊ฟ๋ดค์ต๋๋ค.
while(this.requestUrls.length) {
const results = await Promise.allSettled(this.requestUrls.splice(0, 100).map((url)=>this.util.httpRequest(url, 'GET')))
for await(const result of results) {
if(result.status === 'fulfilled') {
// ... ์ฑ๊ณต
} else {
// ... ์คํจ
}
}
}
๊ฐ์๋ฅผ ์ค์ธ๋ค๊ณ ํด์ ๋ชจ๋ Promise๊ฐ fulfiled์ ์ํ, ์ฆ ์ฑ๊ณตํ๋ค๋ ๋ณด์ฅ์ ์์์ต๋๋ค. ์์๊ฐ์ ๊ฒฝ์ฐ๋ requestUrls์ ๋ฐฐ์ด์์ 100๊ฐ์ฉ ์ถ์ถํ์ฌ promise๋ฅผ ๋ง๋ค์ด๋ด๊ณ ๊ทธ๋ค์์ promise.allSettled ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์คํํ๋ ๊ตฌ์กฐ๋ก ๋ฐ๊พธ๋ ์ผ๋จ Promise์ ๊ด๋ จํ ์๋ฌ๋ ๋ฐ์ํ์ง ์์์ต๋๋ค. ๋ฌผ๋ก http ํต์ ์ ๋ํ ์๋ฌ๋ ์ข ์ข ๋๊ธฐ์ ์์ธ์ฒ๋ฆฌ๊ฐ ํ์ํ๊ธด ํ์ต๋๋ค.
Node.js์ Worker๋ฅผ ์ฌ์ฉํ์ฌ ํผํฌ๋จผ์ค๋ฅผ ๋ ๋์ผ ์๋ ์๋ค๊ณ ์๊ฐ์ด ๋ญ๋๋ค๋ง ์๊ฐ๋ณด๋ค OPEN API ์ชฝ์์๋ ์๋ต์๋ฌ๊ฐ ๋ง์ด ๋ฐ์ํ์ฌ ์ผ๋จ ์ด์ ๋๋ก ๊ตฌํํด๋ณด์์ต๋๋ค.