๋ ธ๋ v6์ผ๋ก ์คํํ ๋ ํ์ค ES6 Promise๋ง ์ฌ์ฉํ๋๋ก ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น(๋ธ๋ฃจ๋ฒ๋ ์ข ์์ฑ ์ ๊ฑฐ)?
์๋ฅผ ๋ค์ด promise-queue ํจํค์ง์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ญ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ Promise๋ฅผ ์ฌ์ฉํฉ๋๋ค.
https://www.npmjs.com/package/promise-queue
๋๋ ์ฌ์ฉ์๊ฐ Queue.configure(require('vow').Promise);
๋ก ๋ช
์์ ์ผ๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด ํจํค์ง๊ฐ ์ ์ฌํ ์ ๋ต์ ๊ตฌํํ ์ ์์ต๋๊น?
ํธ๊ธฐ์ฌ: ๋ ๋น ๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ ๋๋ฆฐ ๋ด์ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ต์ฒดํ๊ณ ์ถ์ต๋๊น? ํด๋ผ์ด์ธํธ์์๋ ์ค์ํ์ง ์์ง๋ง ๋ ธ๋ ์๋์์๋ ์์์ ๋๋ค. ์ด์ ๋ํ ์ด์ ๋ ๋ฌด์์ ๋๊น?
@johanneslumpe knex
์ ํจ๊ป ์ผ๋ถ ์์ฉ ํ๋ก๊ทธ๋จ์ ์์ธ์
๋๋ค. Promise
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์น๋์ง ์์ฌ์ค๋ฝ์ต๋๋ค. bluebird
๊ฐ ํ์ํ์ง ์๋๋ก A+ API๋ง ์ฌ์ฉํ๋๋ก ๋ชจ๋ Promise
์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ค๊ณ ๋
ผ์๋์์ต๋๋ค.
๊ทธ ํ์๋ ์ด๋ค Promise ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ฌ์ฉ๋๋์ง ์ฌ์ ์ํ๊ธฐ ์ฌ์์ผ ํฉ๋๋ค.
knex์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ฌด์๋ฏธํ๊ฒ ๋๊ปด์ง๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. knex์ ์ฝ๋๋ฒ ์ด์ค๋ ์ด๋ฏธ ์์ฒด promise.js ํ์ผ์ ๋ด๋ถ์ ์ผ๋ก ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ API๊ฐ ๋์ผํ๋ค๋ฉด ๊ธฐ์ ์ ์ผ๋ก ์ฌ์ ํ ๊ตฌํํ๊ธฐ๊ฐ ๋งค์ฐ ์ฝ์ต๋๋ค. ์ด ํ์ผ์์ ์ ์ญ ์ฝ์์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ํ ์ ์๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ตฌ์ฑ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ ์๊ตฌํ ์ ์์ต๋๋ค.
์ฌ์ฉ์์๊ฒ ์ ํ๊ถ์ ์ฃผ๋ ๊ฒ์ด ์ ๋ถ์ ๋๋ค. Node V6+ ์ฌ์ฉ์์ ๊ฒฝ์ฐ ๊ฐ๋ฅํ ํ ์ต์ํ์ผ๋ก ํ์ฌ ์ข ์์ฑ์ ๊ด๋ฆฌํ ์ ์๋ ์ ํ๊ถ์ ์ ๊ณตํฉ๋๋ค.
ํธ๊ธฐ์ฌ: ๋ ๋น ๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ ๋๋ฆฐ ๋ด์ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ต์ฒดํ๊ณ ์ถ์ต๋๊น?
๋น์ ์ด ๋งํ๋ ๊ฒ์ด ๊ณผ๊ฑฐ์๋ ์ฌ์ค์ผ ์๋ ์์ง๋ง ์ง๊ธ์ด๋ 6๊ฐ์ ํ์๋ ์ด๋ป์ต๋๊น? (๋๋ ์ฝ๊ฐ์ ๊ฒ์์ํ๊ณ ์ผ๋ถ 2015 ๋ฒค์น ๋งํฌ ๋ง ์ฐพ์ ์ ์์ต๋๋ค. ๋ ์ต๊ทผ ๋น๊ต๊ฐ ์์ผ๋ฉด ๋งํฌ๋ฅผ ๊ฒ์ํ์ญ์์ค)
Promise ES6 ํ์ค์ ๋ง๋๋ ์์ ์ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์กดํ์ง ์๊ณ ์ฌ๋๋ค์ด ์ฝ๊ฒ Promise๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๊ฒ์ด๋ฉฐ Node ๋๋ V8์ ํต์ฌ ํ์ ์ฑ๋ฅ ์ฐจ์ด๋ฅผ ์์ํ ๋ฌด์ํ ์ ์์ต๋๋ค. ๋ ํ๋ก์ ํธ์ ์คํ ์์ค ๋ผ์ด์ ์ค๋ ํธํ๋๋ฉฐ ์ผ๋ถ ์ฝ๋๋ฅผ ๋น๋ฆด ์๋ ์์ต๋๋ค. ๋๋ ๋ด์ฅ๋ Promise๊ฐ ๋ ๋น ๋ฅด๊ณ ๋ ์ข์ ์ ์๋ค๊ณ ์๊ฐํ๋ ์๊ฐ์ ์ฃผ์ญ์์ค.
Amazon์ AWS-SDK๋ฅผ ์ฐธ์กฐํ์ญ์์ค. ๋ํ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ธ๊ณ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ Promise๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฌ์ฉ์์๊ฒ ์ฆ๊ฒจ์ฐพ๋ Promise ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ตฌ์ฑํ ์ ์๋ ์ ํ๊ถ์ ์ ๊ณตํฉ๋๋ค.
http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/node-making-requests.html#Support_for_Promises
๊ทธ๊ฒ์ ๋ชจ๋ ์ ํ ์ ๊ดํ ๊ฒ์ ๋๋ค
๋ค์ ์๊ฐํด๋ณด๋ฉด ํ์ผ ํ๋๋ฅผ ๋ฐ๊พธ๋ ๊ฒ๋งํผ ์ฝ์ง๋ ์์ ๊ฒ์
๋๋ค. Knex๋ ํ์ฌ .timeout
, .tap
, .reduce
, .map
๋ฑ๊ณผ ๊ฐ์ Bluebird ์ ํธ๋ฆฌํฐ ๊ธฐ๋ฅ์ ๋ง์ด ์์กดํฉ๋๋ค. ES6 ์ฝ์์์.
ES6 ์ฝ์์ ์ง์ํ๋ ๋ฐ ๊ด์ฌ์ด ์์ต๋๋ค. ์ด์์ ์ผ๋ก๋ $ Promise
$ ์์ฑ์๋ฅผ ์ฌ์ฉํ๋ Knex
์์ฑ์์ ๋ํ ๋ ๋ฒ์งธ ์ธ์๊ฐ ํ์ํฉ๋๋ค. ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ๋ค์๊ณผ ๊ฐ์ด ๋ฌ์ฑ๋ฉ๋๋ค.
const Promise = require('bluebird');
const knex = Knex(myKnexConfig, Promise);
์ ๊ณต๋ Promise.prototype
์ ์กด์ฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก map
, filter
๋ฑ์ ์กฐ๊ฑด๋ถ ๋ณ์นญ์ ์ง์ ํ ์ ์์ต๋๊น?
๋๋ ์ด๊ฒ์ด ์ฐ์ ์์ ๋ชฉ๋ก์์ ์๋นํ ๋ฎ์์ผ ํ๋ค๊ณ ์๊ฐํ๋ฉฐ, ์ฑ๋ฅ ์ ํ(๋ฌผ๋ก ํ๋์ ๋ฒค์น๋งํฌ๋ฅผ ๋ณด์ง๋ ๋ชปํ์ง๋ง)์ ์ฌ๋๋ค์ด ๋ฐํ๋ ์ฝ์์ด ๋ธ๋ฃจ๋ฒ๋๋ผ๋ ์ฌ์ค์ ๊ธฐ๋ฐํฉ๋๋ค(์กฐ๊ฑด๋ถ catch
๋ฑ).
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด async/await๊ฐ ์์ ์ ์ธ ๋ ธ๋์ ๋๋ฌํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
์ฌ๋๋ค์ด ์ต์ํ์ ํ์ฌ ์ข ์์ฑ์ ์ํ๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ Promise๊ฐ ๋ ์ข์ ์ ์์ต๋๋ค.
@google-cloud
๋ฐ ๊ธฐํ ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ์ด ๊ธฐ๋ณธ Promise๋ฅผ ์ฌ์ฉํ๋๋ก ๊ธฐ๋ณธ ์ค์ ํ๊ณ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ค๋ ์ฌ๋์ ์ํ Promise ๋งค๊ฐ๋ณ์๋ฅผ ์๋ฝํ ์ ์์ต๋๋ค.
https://googlecloudplatform.github.io/google-cloud-node/#/docs/google -cloud/
var gcloud = require('google-cloud')({
promise: require('bluebird')
});
@tgriesser ๋๋ ์ด๊ฒ์ด ์ค๋๋ ๋ฌธ์ ๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง, ์ฐ๋ฆฌ๋ ์ด์ stable๊ณผ Carbon ๋ชจ๋์์ async
/ await
๋ฅผ ์ป์์ต๋๋ค.
async/await๊ฐ ๊ธฐ๋ณธ ํ๋ผ๋ฏธ์ค( ์ฌ์์ ๋ฐ๋ผ async
ํจ์๋ ๊ธฐ๋ณธ ํ๋ผ๋ฏธ์ค๋ฅผ ๋ฐํํด์ผ ํจ)์ ํจ๊ป ์๋ํ๋ ๊ฒ์ด ์ ํธ๋๋ค๋ ์ ์ ๊ฐ์ํ ๋ ์ด๊ฒ์ด ๋ ๋์ ์ฐ์ ์์์
๋๊น?
๋ค์ดํฐ๋ธ ํ๋ผ๋ฏธ์ค ์ง์์ด Knex๊ฐ ์ํ์ง๋ง ํ์ฌ ๋ ์ด๋์ ์๋ ๊ฒฝ์ฐ PR์ ํ์ํ ๊น์?
์๊ฐ ๋ด ์ค์ ๊ณ ๋ง์.
@malexdev async
ํจ์๋ ํ์ฌ knex์ ๋ณ๋ก ๊ด๋ จ์ด ์๋ ๊ธฐ๋ณธ ํ๋ผ๋ฏธ์ค๋ฅผ ๋ฐํํฉ๋๋ค. await
๊ฐ ์ ๋๋ก ์๋ํ๊ธฐ ์ํด ๊ธฐ๋ณธ ํ๋ผ๋ฏธ์ค๊ฐ ํ์ํ๋ค๋ ์๋ฏธ๋ ์๋๋๋ค. ์ด๋ค ๊ฒฝ์ฐ์ ์ด๊ฒ์ด ๋ฌธ์ /ํํ์ธ์ง ๋ช
ํํ ํด์ฃผ์ค ์ ์์ต๋๊น(ํ๋์ ์ข
์์ฑ ์ญ์ ์ ์ธ)?
์ฆ, ๋๋ bluebird๋ฅผ ์ญ์ ํ๋ ๊ฒ์ ๋ฐ๋ํ์ง ์์ง๋ง ์ค์ ๋ก ๋ด๋ถ ๋ณ๊ฒฝ์ด ๊ฝค ํ์ํฉ๋๋ค. ์ผ๋ถ ๊ตฌ์ฑ ์ค์์น ์๋์ ์ด์ ๊ธฐ๋ฅ์ด ์จ๊ฒจ์ ธ ์๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ธฐ๋ณธ ์ฝ์์ด ์ฌ์ฉ๋์ง ์๋ ํ ํ์ฌ bluebird
์์ knex API๋ก ๋
ธ์ถ๋๋ ์ผ๋ถ ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํ ์๋ ์์ต๋๋ค. knex๊ฐ bluebird
์ฝ์์ ๋ฐํํ๋ค๋ ์ฌ์ค์ ์ค๊ณํด ์จ ์ฌ๋๋ค์๊ฒ ์ด ๋ฐฉ๋ฒ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
์ด ๋ถ๊ฐ๋ฅํ์ง ์์ ๊ฒ์
๋๋ค.
@elhigu ๊ฐ์ธ์ ์ผ๋ก ๊ฐ์ฅ ํฐ ์ด์ ์ await
์ ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ ์ฝ์์ ์ํํ๋ TSLint ๊ท์น๊ณผ ํจ๊ป TypeScript๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก ๋ชจ๋ Knex ํธ์ถ์ Promise.resolve()
์์ ๋ํํด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค. ๋๋ ์ด๊ฒ์ด ํน๋ณํ Knex์ ๊ด๋ จ์ด ์๋ค๋ ๊ฒ์ ์๊ณ ์์ผ๋ฉฐ ์ ์๊ฒ๋ง ๋ฐ์ํ๋ ๋ฌธ์ ์ผ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
๊ทธ ์ธ์๋ ์ 3์ ์ข ์์ฑ์ด ์ ์ ๊ฒ์ด ๋ ์ข์ผ๋ฉฐ @c0b ๊ฐ ์ธ๊ธํ๋ฏ์ด ๋ ๋ง์ ์ต์ ์ด ๊ฒฐ์ฝ ๋์ ๊ฒ์ ์๋๋๋ค.
๋๋ ๊ทธ๊ฒ์ด Knex๊ฐ ๋์๊ฐ๋ ๋ฐ ๊ด์ฌ์ด ์๋ ๊ฒ์ด๋ผ๋ฉด ๋ง์ ์ผ์ด ๋ ๊ฒ์ด๋ผ๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. ์ด๊ฒ์ด ์ ๊ฐ ์ด ์ผ์ ์๊ฐ์ ํ ์ ํ๊ฒ ๋ ๊ฒ์ ๊ธฐ์๊ฒ ์๊ฐํ๋ ์ด์ ์ค ํ๋์ ๋๋ค.
์, ์ ๋ typescript ๋ฌธ์ ๋ก ์ธํด ์ฌ๊ธฐ์ ์ฐฉ๋ฅํ์ต๋๋ค. ์ ๋ Knex๋ฅผ ๋ค์ค ์คํ ๋ฆฌ์ง ๋ฐ์ดํฐ ์ ์ฅ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ฉ SQL ์์ง์ผ๋ก ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ๋ค์ดํฐ๋ธ ๋ ๋ธ๋ฃจ๋ฒ๋ ์ฝ์์ ๋ํด ์๋ฉด์ฑ์ ๊ฐ์ง๊ณ ์์ง๋ง ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ด์ ๋ก knex์ typescript. ๋๋ knex thenables๋ฅผ ๊ธฐ๋ณธ ์ฌ์์ ๋ฐ๋ฅด๋ ๊ฒ์ผ๋ก ์ทจ๊ธํ์ง๋ง(๋๋ bluebird ํ์ฅ์ ์ฌ์ฉํ์ง ์์ต๋๋ค), typescript๋ Bluebird ๋ฐํ์ ๋ํด ๋์๊ฒ ๋ฒ๊ทธ๋ฅผ ์ค๋๋ค.
์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ฝ์ ๊ตฌํ๊ณผ knex์ ๋ํ ์
๋ ฅ(๋ค๋ฅธ ๊ฐ๋ฐ์์ ์ํด ์ฒ๋ฆฌ๋จ)์ ๋ชจ๋ ๋ค๋ฃจ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์์ ์ผ์ข
์ ๋ ๊ฐ์ง ์์ค์
๋๋ค. ํ์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ๊ธฐ์์ ๋ฉ์ถฅ๋๋ค. Promise๋ฅผ ์ ์ธํ์ ๋ Bluebird๋ฅผ ๋ฐํํฉ๋๋ค(Promise API์ Bluebird๊ฐ ์ง์ํ์ง ์๋ ํญ๋ชฉ์ด ์๋ ๊ฒ ๊ฐ์ต๋๊น?). ๊ทธ๋ฌ๋ return Promise.resolve(bluebirdthing)
๋ฌด๋ฆฌ๋ฅผ ์ด๋์๋ ๋๋ ๊ฒ ๊ฐ์ง ์์ต๋๋ค.
๋๋ ์ง๋ 1๋ ๋์ knex ๋ฐฐ์งฑ์ ํํค์น๋ ๋ฐ ์ถฉ๋ถํ ์๊ฐ์ ํ ์ ํ์ผ๋ฉฐ ์ฌ๋๋ค์ด ์ํ๋ฉด ์ฌ๊ธฐ์์ ๋ฌด์ธ๊ฐ๋ฅผ ์ ํํ๊ณ Promise ๊ตฌํ์ ๋ชจ๋ํํ๊ธฐ ์ํด PR ์์ ์ ํ๊ฒ ๋ค๊ณ ์ผ๋ฐ์ ์ผ๋ก ์ฝ์ํ๋ ๋ฐ ์๊ฐ์ ๋ณด๋์ต๋๋ค. PR์ ์ด๋ ค ์์ต๋๊น? @elhigu ๊ฐ ์ธ๊ธํ ๊ฒ๊ณผ ๊ฐ์ ๊ฒ์ผ๋ก ๋๋ ๊ฒ์ ๋๋ค. ์ฝ๋ ์ฌ์์ฑ ํ์๋ฅผ ํผํ๊ธฐ ์ํด ์ธ์คํด์คํ ์ ์ ๋ฌ๋ Promise ์์ฑ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ผ๋ถ ์ ํธ๋ฆฌํฐ ํจ์๋ฅผ ๋ค์ ๊ตฌํํฉ๋๋ค. ๋ฌผ๋ก ์ฑ๋ฅ์ ๋ํด์๋ ํ์คํ์ง ์์ง๋ง ๋ฒค์น๋งํนํ ์ ์๋ ๊ฒ์ ๋๋ค.
async / await๋ก ๋ชจ๋ ๊ฒ์ ๋ฉ์ง๊ฒ ๋๋ด๋ ๊ฒ๋ ๋ฉ์ง ์ผ์ด๋ฉฐ, ๋๋ ์ด๊ฒ์ ๊ณ ์น๊ธฐ ์ํด ์๋๋ฅด์ง ์์ต๋๋ค any
typescript ๋์ javascript์ธ ๊ฒ์ฒ๋ผ ์ฝ๋ ๋ถ๊ธฐ).
@ericeslinger ์ฌ์ฉ ์ค์ธ ์ค์ Promise ๊ตฌํ์ด TypeScript์ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ ๋ ๋ฌธ์ ์์ด 1๋ ๋ฐ ๋์ ๋ธ๋ฃจ๋ฒ๋์ ๊ธฐ๋ณธ ์ฝ์์ ํผํฉํด ์์ต๋๋ค...
๋๋ ๋จ์ง bluebird์ ๋ํ ์ ํ์ ์๊ฐํ๋ ์ด๋ค ํ์ดํ๋ ์ฌ์ฉํ์ง ์์์ผ๋ฉฐ, ๊ทธ๋ฅ typescript ํ์ดํ์ด ์ ์์ ์ธ Promise์ด๊ณ ์๋ฌด๋ฐ ์ฐจ์ด๋ ๋ณด์ด์ง ์๋๋ค๊ณ ๋งํ์ต๋๋ค.
์ด๋ค typescript ๋ฒ์ ์ด ์์ผ๋ฉฐ ์ฌํํ ์์ ํ๋ก์ ํธ๊ฐ ์์ต๋๊น? ์๋ฅผ ๋ค์ด npm ์์ ์คํฌ๋ฆฝํธ๊ฐ ์๋ github repo.
์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ฝ์ ๊ตฌํ๊ณผ knex์ ๋ํ ์ ๋ ฅ(๋ค๋ฅธ ๊ฐ๋ฐ์์ ์ํด ์ฒ๋ฆฌ๋จ)์ ๋ชจ๋ ๋ค๋ฃจ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์์ ์ผ์ข ์ ๋ ๊ฐ์ง ์์ค์ ๋๋ค. ํ์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ๊ธฐ์์ ๋ฉ์ถฅ๋๋ค. Promise๋ฅผ ์ ์ธํ์ ๋ Bluebird๋ฅผ ๋ฐํํฉ๋๋ค. (Promise API์ Bluebird๊ฐ ์ง์ํ์ง ์๋ ํญ๋ชฉ์ด ์๋ ๊ฒ ๊ฐ์๋ฐ์?) ํ์ง๋ง ์ด๋ ๊ณณ์๋ ๋ฐํ Promise.resolve(bluebirdthing)๋ฅผ ์๋ฉ ๋ฃ๊ณ ์ถ์ง๋ ์์ต๋๋ค.
npm์ knex ํ์ดํ์ธ๊ฐ์? ๋ธ๋ฃจ๋ฒ๋ ํ์ดํ์ npm์์ ํฉ๋๊น? ์ด๋ค ํจํค์ง? ์ ๊ทธ๋ฐ ์ผ์ด ์ผ์ด๋๋์ง ์ดํดํ๊ธฐ ์ด๋ ต์ต๋๋ค. ๋ณ๋์ Bluebird ์ ํ์ด ์๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ Promise์์ ์์๋์ด์ผ ํ๋ฉฐ Promise๋ฅผ ๋ฐํํ๋ค๋ API์์ ๋ฐํํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ค๋ช ์์ ๋ฌธ์ ๋ ๋งค์ฐ ๊นจ์ง ํ์ดํ ๊ตฌํ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ด ๋ฌธ์ ์ ๊ด๋ จ์ด ์์ต๋๋ค(typescript๋ ์ค์ ์ ํ์ ๋ํด ์ ๊ฒฝ ์ฐ์ง ์์ผ๋ฏ๋ก knex๊ฐ ๋ฐํํ๋ ๋ด์ฉ์ ์์ง ๋ชปํฉ๋๋ค).
@types/knex
์ค์น๋ฅผ ํตํด ExistingTyped ๋ฆฌํฌ์งํ ๋ฆฌ์์ ๋ด ํ์ดํ์ ๋ฐ๊ณ ์์ต๋๋ค. ๊ทธ ์ ์๋ @types/bluebird
๊ฐ์ ธ์ค๊ณ ๋ชจ๋ knex ๋ฉ์๋๋ Bluebird ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ํ์์ผ๋ก ์ง์ ๋ฉ๋๋ค.
๊ตฌ์ฒด์ ์ผ๋ก ๋๋ ์ด๊ฒ์ ํ ์ ์์ต๋๋ค.
function mungeData(v: any): DataItem {}
function foo(): Promise<DataItem[]> {
return knex('data').select()
.then((rows) => rows.map(row => mungeData(row)))
} // error, cannot return Bluebird<DataItem[]> as Promise<DataItem[]>
์ด๋ฌํ ํ์ดํ์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ knex.select().then()์ด DefinedTyped ๋ฆฌํฌ์งํ ๋ฆฌ์์ Bluebird๋ฅผ ๋ฐํํ๋๋ก ์
๋ ฅ๋๊ณ ์ด๋ฌํ ์ฐ๊ฒฐ์ด ๋ ๋ง์ Bluebirds๋ฅผ ๋ง๋ค๊ธฐ ์ํด ํจ๊ป ์ฐ๊ฒฐ๋๊ณ foo๊ฐ Bluebird์ผ ๋ return foo as Promise<any>()
์ ๊ฐ์ ๊ฒ์ ๋งํ๊ธฐ ๋๋ฌธ์
๋๋ค.
๋์ ๋ด๊ฐ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค
function bar(): Promise<DataItem[]> {
return Promise.resolve<DataItem[]>(foo())
}
๋๋ ๋ค์ดํฐ๋ธ Promise.resolve() ํธ์ถ ๋ด์์ knex์ ๋ํ ๋ชจ๋ ํธ์ถ์ ๋ํํ๋ ๋ค๋ฅธ ํธ๋ฆญ์ ์ํํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด typescript๊ฐ ๋ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์์ ๋ค์ด์คํธ๋ฆผ์ ๋ํ ๋ถํ์ ์ค์งํ๋ ๋์์ ์ฌ์ ํ ๋ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์ ๋ด์์ knex ํ์ดํ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด์ ์ด์ ์๋ @types/knex
๋ฅผ ์ ํ ์ฌ์ฉํ์ง ์์์ต๋๋ค. knex๋ฅผ any
๋ก ์
๋ ฅํ์ ๋ฟ์
๋๋ค. ์ฝ๋๋ ๋ฐํ์์ ์ด๋ ์ชฝ์ด๋ ์ ์๋ํฉ๋๋ค(์ ์ด๋ ์ ์ฌ์ฉ ์ฌ๋ก์ ๊ฒฝ์ฐ).
@elhigu : ๋ฌธ์ ๋ ์๋ชป๋ ์
๋ ฅ ๊ตฌํ์ด ์๋๋๋ค.
TypeScript๋ async
Promise<[type]>
๋ก ์ค์ ํฉ๋๋ค. ์ด๋ JS ์ฌ์์ ๋ฐ๋ผ ์ ํํฉ๋๋ค.
Knex๋ ์
๋ ฅ์ด ์ ํํ๊ฒ ๋ฐ์๋ Bluebird<[type]>
๋ฅผ ๋ฐํํฉ๋๋ค.
๋๋ ๋จ์ง ๋ธ๋ฃจ๋ฒ๋์ ๋ํ ์ ํ์ ๋์ ํ ์ด๋ค ํ์ดํ๋ ์ฌ์ฉํ์ง ์์์ผ๋ฉฐ, ๊ทธ๋ฅ ํ์ดํ ์คํฌ๋ฆฝํธ์ ๊ทธ๊ฒ๋ค์ด ์ ์์ ์ธ ํ๋ผ๋ฏธ์ค์ด๊ณ ์๋ฌด๋ฐ ์ฐจ์ด๊ฐ ์๋ค๊ณ ๋งํ์ ๋ฟ์ ๋๋ค.
Knex ํจ์๊ฐ ์ค์ ๋ก Bluebird
s๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์ปดํ์ผ๋ฌ์ ๊ฑฐ์ง๋ง์
๋๋ค. ๊ด์ฌ์ด ์๋ค.
Bluebirds๊ฐ Promise์ ํธํ๋๋ค๋ ๊ฒ์ ๋ง์ต๋๋ค. ๊ทธ๋ฌ๋ TypeScript์์ ๊ฑฐ๋ ์ค ์ผ๋ถ๋ ๋ฐํํ๋ค๊ณ ๋งํ ๊ฒ์ ์ค์ ๋ก ๋ฐํํ๋ค๋ ๊ฒ์
๋๋ค.
Promise
๋ฅผ ๋ฐํํ๋๋ก ์
๋ ฅ๋ ํจ์์์ Bluebird
๋ฅผ ๋ฐํํ ๋ TypeScript๋ Bluebird
์ ํ์ด Promise
์ ํ๊ณผ ๊ฐ์ง ์๊ธฐ ๋๋ฌธ์ ๋ถํํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ๋ค์ํ ํธ๋ฆญ์ด ์์ต๋๋ค(์: @ericeslinger ๊ฐ any
์ฌ์ฉ ๋๋ Promise.resolve()
๋ก ๋ํํ๋ ๊ฒ์ ๋ํด ์ธ๊ธํ ๊ฒ). ๊ทธ๋ฌ๋ ๊ฒฐ๊ตญ ๊ทธ๋ฐ ํธ๋ฆญ์ ๋ง์ ๊ฒ์ ์๊ฒ ๋ง๋ญ๋๋ค. TypeScript๊ฐ ์ ๊ณตํ๋ ๊ฒ.
๊ฒฐ๊ตญ ํ์ค์ "๋ค์ดํฐ๋ธ ํ๋ผ๋ฏธ์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ฐ๋ฆฌ์๊ฒ ์ค์ํ๋ฉฐ ์ฐ๋ฆฌ๋ ํ๋ผ๋ฏธ์ค ๊ธฐ๋ฅ์ ๋ณด๋ค ์ผ๋ฐ์ ์ผ๋ก ๋ง๋ค๊ธฐ ์ํด ๊ธฐ๊บผ์ด ๋ ธ๋ ฅํ ๊ฒ"์ด๋ผ๊ณ ๋งํ๋ ์ฌ์ฉ์๊ฐ ๋ ๋ช ์ด์ ์๋ค๋ ๊ฒ์ ๋๋ค.
๋๋ ๋น์ ์ด ๋จ์ง ๋์ฐ๋ ค๊ณ ํ๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์์งํ "๋น์ ์ ์ด๋ ๊ฒ ํ ์ ์์ต๋๋ค"๋ผ๋ ๋ง์ ๋ฃ๋ ๋์ ๋ ์์ ์ด ์ ์ํ ์ฝ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฃ๊ณ ์ถ์ต๋๋ค / @ericeslinger / @c0b ๋ด๊ฐ ์์ํ ์ ์๋๋ก ํ์ฉํ ์ ์์ต๋๋ค PR์ด๋ ๋ฌด์์.
@malexdev @ericeslinger ์์ธํ ์ ๋ณด ๊ฐ์ฌํฉ๋๋ค! ์ค์ ๋ก Promise
์์ ์์ ์ ํด๋์ค๋ฅผ ์์ํ ์ ์๋ ๊ฒ ๊ฐ์ผ๋ฏ๋ก ์ด๊ฒ์ด Promise<>๋ก ์
๋ ฅ๋ ํจ์์์ Bluebirds๋ฅผ ๋ฐํํ๋ ๋ฐ ์คํจํ๋ ์ด์ ์ผ ์ ์์ต๋๋ค.
@ericeslinger ์ด์จ๋ ์ด๊ฒ์ async
ํจ์๋ฅผ ์์ฑํ ๋ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. ์๋ํ๋ฉด ๋ด๋ถ์ ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ์๋์ผ๋ก ๊ธฐ๋ณธ ํ๋ผ๋ฏธ์ค๋ก ๋ํํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ค์์ @types/bluebird์์ ์
๋ ฅํ๊ณ ES2015 ๋๋ ESNEXT๋ก ์ปดํ์ผํ์ฌ ๋ฌธ์ ์์ด ์ค์ํฉ๋๋ค.
import * as Bluebird from 'bluebird';
// declaring function async converts bluebird implicitly to native Promise
async function asyncReturningPromise(): Promise<string> {
const blueBirdPromise = new Bluebird<string>((resolve, reject) => {
resolve('yay asyncReturningPromise');
});
return blueBirdPromise;
}
// main func to run the code using async / await
Bluebird.resolve().then(async () => {
console.log("await function returning promise (bluebird)", await asyncReturningPromise());
const blueBird = new Bluebird((resolve, reject) => { resolve(); });
const returnedFromAsync = asyncReturningPromise();
console.log("Bluebird instanceof Promise:", blueBird instanceof Promise);
console.log("async retval instanceof Promise:", returnedFromAsync instanceof Promise);
});
์ฐ์ถ:
await function returning promise (bluebird) yay asyncReturningPromise
Bluebird instanceof Promise: false
async retval instanceof Promise: true
๋ฐ๋ผ์ ์ง๊ธ ๋น์ฅ์ knex API๋ฅผ ์ฌ์ฉํ ๋ ๊ธฐ๋ณธ Promises์ ์๋์ผ๋ก ๋ธ๋ฃจ๋ฒ๋๋ฅผ ๋ํํ๋ ๋น๋๊ธฐ ํจ์/๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ง ์๋ ํ Bluebird๋ฅผ ๋ฐํํ๋ค๋ ์ฌ์ค์ ์๋ ค์ผ ํฉ๋๋ค.
@malexdev
Knex ํจ์๊ฐ ์ค์ ๋ก Bluebirds๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์ปดํ์ผ๋ฌ์ ๊ฑฐ์ง๋ง์ ๋๋ค. ๊ด์ฌ์ด ์๋ค.
Bluebirds๊ฐ Promise์ ํธํ๋๋ค๋ ๊ฒ์ ๋ง์ต๋๋ค. ๊ทธ๋ฌ๋ TypeScript์์ ๊ฑฐ๋ ์ค ์ผ๋ถ๋ ๋ฐํํ๋ค๊ณ ๋งํ ๊ฒ์ ์ค์ ๋ก ๋ฐํํ๋ค๋ ๊ฒ์ ๋๋ค.
์ค์ ๋ก typescript๋ฅผ ๋ค๋ฃจ๋ ๊ฒ์ ๋ฐํ๋ ๊ฐ์ฒด๊ฐ ์ธํฐํ์ด์ค๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํ๋ค๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์์ ์๋ฒฝํฉ๋๋ค.
class FakePromise<T> implements Promise<T> {
[Symbol.toStringTag]: "Promise";
then<TResult1, TResult2>(onfulfilled?: (value: T) => TResult1 | PromiseLike<TResult1> | null | undefined, onrejected?: (reason: any) => TResult2 | PromiseLike<TResult2> | null | undefined): Promise<TResult1 | TResult2> {
return new Promise((resolve, reject) => { resolve('Im totally broken and fake!); });
}
catch<TResult>(onrejected?: (reason: any) => TResult | PromiseLike<TResult> | null | undefined): Promise<T | TResult> {
throw new Error("Method not implemented.");
}
}
// this works and fake promise instance has nothing to do with native promise
function returningPromiseInterface(): Promise<string> {
const fakePromise = new FakePromise<string>();
return fakePromise;
}
// compiling this fails, because looks like Bluebird actually doesn't implement Promise interface correctly
function asyncReturningPromise(): Promise<string> {
const blueBirdPromise = new Bluebird<string>((resolve, reject) => {
resolve('yay asyncReturningPromise');
});
return blueBirdPromise;
}
instanceof๋ฅผ ์๋ง์ผ๋ก ๋ง๋ค์ง๋ง typescript๋ ์ค์ ๋ก ์ธํฐํ์ด์ค๋ง ๊ธฐ๋ณธ Promise ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค๊ณ ์ฝ์ํ์ง๋ ์์์ต๋๋ค.
Promise๋ฅผ ๋ฐํํ๋๋ก ์ ๋ ฅ๋ ํจ์์์ Bluebird๋ฅผ ๋ฐํํ ๋ TypeScript๋ Bluebird ์ ํ์ด Promise ์ ํ๊ณผ ๋์ผํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ถํํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ๋ค์ํ ํธ๋ฆญ์ด ์์ต๋๋ค(์: @ericeslinger ๊ฐ any ์ฌ์ฉ ๋๋ Promise.resolve()๋ก ๋ํํ๋ ๊ฒ์ ๋ํด ์ธ๊ธํ ๊ฒ). ๊ทธ๋ฌ๋ ๊ฒฐ๊ตญ ๊ทธ๋ฐ ํธ๋ฆญ์ TypeScript๊ฐ ์ ๊ณตํ๋ ๋ง์ ๊ฒ์ ๋์น๊ฒ ๋ง๋ญ๋๋ค.
๋๋ ์ฌ๋๋ค์ด ๋์ ํ์ดํ์ ๋ง์กฑ์ํค๊ธฐ ์ํด ๊ทธ๋ฐ ์ข ๋ฅ์ ํธ๋ฆญ์ ์ํํ๊ฑฐ๋ JS ๊ตฌํ์ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ง ์์ต๋๋ค.
๊ฒฐ๊ตญ ํ์ค์ "๋ค์ดํฐ๋ธ ํ๋ผ๋ฏธ์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ฐ๋ฆฌ์๊ฒ ์ค์ํ๋ฉฐ ์ฐ๋ฆฌ๋ ํ๋ผ๋ฏธ์ค ๊ธฐ๋ฅ์ ๋ณด๋ค ์ผ๋ฐ์ ์ผ๋ก ๋ง๋ค๊ธฐ ์ํด ๊ธฐ๊บผ์ด ๋ ธ๋ ฅํ ๊ฒ"์ด๋ผ๊ณ ๋งํ๋ ์ฌ์ฉ์๊ฐ ๋ ๋ช ์ด์ ์๋ค๋ ๊ฒ์ ๋๋ค.
๋๋ ๋น์ ์ด ๋จ์ง ๋์ฐ๋ ค๊ณ ํ๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์์งํ "๋น์ ์ ์ด๋ ๊ฒ ํ ์ ์์ต๋๋ค"๋ผ๋ ๋ง์ ๋ฃ๋ ๋์ ๋ ์์ ์ด ์ ์ํ ์ฝ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฃ๊ณ ์ถ์ต๋๋ค / @ericeslinger / @c0b ๋ด๊ฐ ์์ํ ์ ์๋๋ก ํ์ฉํ ์ ์์ต๋๋ค PR์ด๋ ๋ฌด์์.
์ดํดํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค :) ๋ค์ดํฐ๋ธ ํ๋ผ๋ฏธ์ค๋ฅผ ์ฌ์ฉํ๋๋ก knex๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ด๋ฏธ ์์๋์ด ์๋ ์ ์ด๋ ์์ ๊น์ง ๊ตฌํ๋์์ผ๋ฉฐ @tgriesser ์ ์ํด ๋ค์ ๋ณ๊ฒฝ๋์์ผ๋ฏ๋ก ์ง๊ธ์ ์ด ๋ณ๊ฒฝ์ ์์ํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ํ ๋๋ ์ฌ์ ํ ์ด ์ค๋ ๋์์ ์ธ๊ธ๋ ์ด๋ฌํ typescript ๋ฌธ์ ๋ฅผ knex ๊ตฌํ์ ๋ฌธ์ ๋ณด๋ค ํ์ดํ ์ ์ธ์ ๋ฌธ์ (bluebird๊ฐ Promise๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํํ์ง ์๋ ์ด์ ... ๋ ๊น์ด ํ๊ณ ๋ค ํ์๊ฐ ์์ต๋๊น?)๋ก ์๊ฐํฉ๋๋ค.
์ฆ, ๋๋ ์ฌ๊ธฐ์์ ๋ ๊ฐ์ง ๋ณ๊ฐ์ ๋ฌธ์ ๋ฅผ ๋ณด๋ ๊ฒ๋ง์ผ๋ก๋ ์ผ์ ๊ธฐ๊ฐ ๋์ ๋ธ๋ฃจ๋ฒ๋๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ ๋ฐ๋ํ์ง ์์ต๋๋ค.
:+1: ๋ค์ดํฐ๋ธ Promise์ ๊ฒฝ์ฐ.
@elhigu :
์ค์ ๋ก typescript๋ฅผ ๋ค๋ฃจ๋ ๊ฒ์ ๋ฐํ๋ ๊ฐ์ฒด๊ฐ ์ธํฐํ์ด์ค๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํ๋ค๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ด ์ ์์ง. ๋๋ ์ฌ์ ํ ๋ ์ ์ ์์กด์ฑ๊ณผ ๋ ๋ง์ ์ ํ์ด ๋ ๋ซ๋ค๋ ๋ด ์๊ฒฌ์ ์ง์งํ์ง๋ง, ์ด์ ๊นจ์ง ํ์ดํ์ ๋ํด ๋น์ ์ด ์๋ฏธํ๋ ๋ฐ๋ฅผ ์์์ต๋๋ค.
๋ค์ดํฐ๋ธ Promises์ ๊ฒฝ์ฐ ์ฌ์ ํ ๐(์์ง๋ ๊ธฐ๊บผ์ด ๋์๋๋ฆด ์ํฅ์ด ์์ต๋๋ค). ๊ทธ๋ฌ๋ ์ด์ ๋ด ์ฆ๊ฐ์ ์ธ ๋ฌธ์ ๋ Bluebird ํ์ดํ์ ์์ ํ์ฌ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์ ๋ณด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๊ทธ๋์ ์ ๋ TypeScript๋ฅผ ๊ฝค ๋ง์ด ์ฌ์ฉํ๊ธฐ ์์ํ๊ณ ๋ ๋ค ๊ทธ๊ฒ์ ์ข์ํ๋ฉฐ ์ด์ ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ์ง์ ํ ๊ณจ์นซ๊ฑฐ๋ฆฌ๋ผ๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. async/await๊ฐ ์ต๊ทผ ๋
ธ๋์์ ๋ ๋ง์ ๊ธฐ๋ฐ์ ํ๋ณดํจ์ ๋ฐ๋ผ Bluebird ์ ํธ๋ฆฌํฐ fns( map
, reduce
, tap
, bind
, return
) ๋ ์ ์ฉํฉ๋๋ค. Bluebird๋ฅผ ๋ด๋ถ์ ์ผ๋ก ๊ณ์ ์ฌ์ฉํ๊ณ ์ถ์ง๋ง ๊ณต์์ ์ผ๋ก๋ ๋ชจ๋ ์ถ๊ฐ ์ ํธ๋ฆฌํฐ ๋ฉ์๋๋ฅผ ๋ฐํํ๋ knex ์ฟผ๋ฆฌ ๋น๋์ ๊ณต๊ฐ API๋ฅผ "๋น์ถ์ฒ"ํฉ๋๋ค.
์ด๋ฅผ ๋ณํฉํ๋ฉด TypeScript ์ ์๋ฅผ ์
๊ทธ๋ ์ด๋ํ์ฌ Bluebird ํ์ดํ( toBluebird
์ ์ธ)์ ์ญ์ ํ๊ณ Bluebird ํ์ดํ์ Promise ํ์ดํ์ผ๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
๋์ญํญ์ด ์๋ ์ฌ๋์ด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ๋ ๊ณํ์ ์ธ์์ผ ํฉ๋๋ค.
tap
, map
, reduce
, bind
, return
)์ ๋ํ ์ฌ์ฉ ์ค๋จ ๊ฒฝ๊ณ ๋ฅผ ์ถ๊ฐํฉ๋๋ค..toBluebird()
๋ฉ์๋ ์ถ๊ฐ(์ ๋ฉ์๋์ ๋ชจ๋ ํธ์ถ์ ๋ํ ๊ฐ๋จํ ์ฐพ๊ธฐ/๋ฐ๊พธ๊ธฐ๋ก ์ํํ ์ ์์ผ๋ฉฐ ์ด์ ์ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๊ทธ๋ค์ ํธ์ถ๋ฉ๋๋ค)์ด๊ฒ์ด ์๋ฏธ๊ฐ ์๊ณ ๋๊ตฐ๊ฐ๊ฐ ์ด๊ฒ์ ์๋ํ๋ ๋ฐ ๊ด์ฌ์ด ์๋ค๋ฉด ์๋ ค์ฃผ์ญ์์ค.
ํ์คํ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ Knex๊ฐ ์์ฒด TypeScript ์ ์๋ฅผ ์ ์งํ๊ธฐ ์์ํ ๊ฒ์์ ์๋ฏธํฉ๋๊น? ์๋ ์์ฑ ํ์ดํ์ด ์ง์ํ์ง ์๋ ์ ๋ค๋ฆญ์ผ๋ก ๋ฉ์ง ์์ ์ ์ํํ ์ ์์ต๋๋ค.
๋ค์ดํฐ๋ธ Promise์ ๋ํ ์ง์์ ์ถ๊ฐํ๊ธฐ ์ํ ์ฒซ ๋ฒ์งธ ์๋๋ก ์ด ํฌํฌ๋ฅผ ์์ํ์ต๋๋ค.
https://github.com/tgrisser/knex/pull/2523/files
2016๋ ์ด ๋๊ธ ์ข์์:
ํธ๊ธฐ์ฌ: ๋ ๋น ๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ ๋๋ฆฐ ๋ด์ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ต์ฒดํ๊ณ ์ถ์ต๋๋ค.
2๋ ๋ง์ ์ด๋ ๊ฒ ๋ณํ ์ ์๋ค๋ ๊ฒ ๋๋๋ค.
Promise๋ฅผ ๋ฐํํ๋๋ก ์ ๋ ฅ๋ ํจ์์์ Bluebird๋ฅผ ๋ฐํํ ๋ TypeScript๋ Bluebird ์ ํ์ด Promise ์ ํ๊ณผ ๋์ผํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ถํํฉ๋๋ค.
@malexdev ์ค์ ๋ก typescript๋ ๊ตฌ์กฐ์ ์ ํ์ ์ฌ์ฉํ๋ฏ๋ก(ํ๋ฆ์ ๋ช
๋ชฉ ์ ํ์ ์ฌ์ฉํ๊ณ ์ค๋ช
ํ๋ ๋ฐฉ์์ผ๋ก ์๋ํจ) ์ ํ์ด Promise
์ธํฐํ์ด์ค๋ฅผ ์ถฉ์กฑํ๋ ํ ๋ช
์์ ์ผ๋ก extends
์ธ์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด Promise
์ ํธํ๋ฉ๋๋ค. extends
/ implements
์ฌ๋ถ.
์ด๋ป๊ฒ ์งํ๋๊ณ ์์ต๋๊น? ์ข์ ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ knex ๋ด์์ Bluebird ํน์ ๋ฉ์๋ ํธ์ถ์ ์ ์ธํ๋ ๊ฒ์ ๋๋ค(์ฆ, ์์ง ์ค์ ๋ก ์ ๊ฑฐํ์ง ์์). ๋ธ๋ฃจ๋ฒ๋๋ฅผ ์ ๊ฑฐํ๊ณ ์ฌ์ฉ์ ์ ์ Promise ์์ฑ์์ ๋ํ ์ต์ ์ ์ ๊ณตํ๋ ๊ฒ์ด ๋ค๋ฐ๋ฅผ ๊ฒ์ ๋๋ค(๊ทธ๋ฆฌ๊ณ Bluebird ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค์๊ฒ ์ ๊ทธ๋ ์ด๋ ๊ฒฝ๋ก๋ฅผ ์ ๊ณตํจ).
๋๋ ์ด์๊ฐ ์์ผ๋ฉด ์ฒซ๊ฑธ์๋ถํฐ ์ผ์ ์์ํ์ง ์๋๋ค. ๊ธฐ์กด ์์ ์ด ์ค๋จ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
@qubyte ์ ๊ทน์ ์ผ๋ก ๋ณ๊ฒฝํ๋ ค๋ ๋ ธ๋ ฅ์ ์๋ ๊ฒ ๊ฐ๊ณ , ์ฌ๊ธฐ์ ๊ธฐ์ ์ ์ง์ ์ธ ๋ณ๊ฒฝ์ด ์ด๋ฃจ์ด์ง๊ธด ํ์ง๋ง ๊ทธ๊ฒ ์ ๋ถ์ ๋๋ค.
ํ์ธ. ๋ค์ ์์ ์๊ฐ์๋ ๊ฐ๋ฅํ ํ ์์ ๋ณ๊ฒฝ์ ํตํด ๊ฐ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํ๊ฒ ์ต๋๋ค.
@tgrisser ์ธ์ ์ด ๋ฌธ์ ๋ฅผ ์งํํด์ผ ํ๋์ง ์๊ฒฌ์ด ์์ผ์ญ๋๊น(๋ง์ฝ ์๋ค๋ฉด)? Node 6 LTS๊ฐ ๋ผ์ธ์ ๋์ ๋๋ฌํ๋ฉด ๋ด๋ 4์์ด ์ ๋นํ ์๊ธฐ์ฒ๋ผ ๋ค๋ฆด ๊ฒ์ ๋๋ค.
2018๋ ํฅ๋ฏธ๋ก์ด ์ ๋ณด:
promises-native-async-await
๋ ๋
ธ๋ 10์์ promises-bluebird
๋ณด๋ค ์ฑ๋ฅ์ด ์ข์ต๋๋ค.
์ฐธ์กฐ: https://github.com/petkaantonov/bluebird/tree/master/benchmark
๋ฐ๋ผ์ ์ฑ๋ฅ์ ๋ ์ด์ ๋ธ๋ฃจ๋ฒ๋๋ฅผ ์ ์งํ๋ ์ด์ ๊ฐ ์๋๋๋ค. ์ฐ๋ฆฌ๋ async/await๋ก ๊ฐ์ผ ํฉ๋๋ค.
promise-native-async-wait์ ์ฑ๋ฅ์ด ๋ ์ข์ต๋๋ค.
๊ทธ๊ฒ์ ๋ํ 2016๋ ์ ๊ธฐ๋ณธ ๋ฐฉ์์ด ํจ์ฌ ๋ ๋นจ๋ฆฌ ๊ฐ์ ๋ ๊ฒ์ด๋ผ๊ณ ๊ตณ๊ฒ ๋ฏฟ์๋ ๊ฒ์ ๋๋ค. Nodejs ์ปค๋ฎค๋ํฐ์ ํต์ฌ์ด๊ณ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ณด๋ค ๋ ๋ง์ ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ๊ด์ฌ์ ๊ฐ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ ํ์ ์๊ตฌํ๋ ํฐ์ผ์ด ์ ์ถ๋์์ง๋ง ๊ฒฝ์ํ๋ Promise
๊ตฌํ์ด ๋๋ฌด ๋ง์ง๋ง ๋ธ๋ฃจ๋ฒ๋์ ์์ํ ๋ฒ ํ
ํ๋ ๊ฒ์ ์ข์ง ์์ต๋๋ค.
์ด์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
@cfanoulis ์ฌ์ ํ ๋์ผํฉ๋๋ค. 4์์ด ๋๋ฉด ๋ ธ๋ 6์ ๋ํ ์ง์์ ์ค๋จํ๊ณ ๋ธ๋ฃจ๋ฒ๋ ์ ๊ฑฐ๋ฅผ ์์ํ ์ ์์ต๋๋ค.
2019 ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น? /cc๋ ์ผ๋ถ ํต์ฌ ๊ธฐ์ฌ์ ๋๋ ์ ์ง ๊ด๋ฆฌ์ ๋๋ @here ์ ๊ด์ฌ์ด ์๋ ๋ชจ๋ ์ฌ๋์๊ฒ: @johanneslumpe @tgriesser @wubzz @elhigu from https://github.com/tgriesser/knex/graphs/contributors?type=c&from=2018-01- 01&to=2019-12-31
๋ฐ๋ฉด์ JavaScript ์ปค๋ฎค๋ํฐ๋ ์ญ๋์ ์ด๊ณ ํ๊ธฐ์ฐจ๊ณ ๋๋ก๋ ์์ธํ ์ธ์์ ๋๋ค. 3~2๋ ๋ง๋ค(๋๋ ๊ทธ๋ณด๋ค ๋ ๋น ๋ฅด๊ฒ) ์ด์ ์ ์ต์ํ๋ ๊ฒ์ ๋์ฒดํ๋ ๋๊ตฌ๊ฐ ์์ต๋๋ค. Grunt, Gulp => Webpack, ๋๊ตฌ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ํ๋ ์์ํฌ๋ ๋ชจ๋ ์์ค์์ ์์ ํ ๊ฒฝ์ํฉ๋๋ค. ๋ฐ๋ผ์ ํ์ ๋์ ์ ์ค๋จํ๊ฑฐ๋ ์๋ก์ด ํ์ค ์ง์ ์๋๋ฅผ ๋ฆ์ถ๋ ๊ฒฝ์ฐ(ES2019 async/await iterator์ ๋ํด ์๊ฐํด ๋ณด์ธ์...) ๊ฒฐ๊ตญ ์ด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋์ฒด๋ฉ๋๋ค.
๋ฐฉ๊ธ ๋ช ๊ฐ์ง ๊ฐ๋จํ ์ฐ๊ตฌ๋ฅผ ์ํํ์ต๋๋ค. DB ORM ์์ค์์๋ ๋ง์ ๋์์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. TypeORM์ด ์ข์ ๊ฒ์ผ ์ ์์ต๋๋ค... (๋ ๋งํ์ง ์๊ธฐ ์ํด ์ฌ๊ธฐ์ ๋ฉ์ถฅ๋๋ค...)
https://bestofjs.org/tags/db
https://bestofjs.org/projects/typeorm
@c0b ์ฐธ์กฐ ํ ํ์๊ฐ ์์ต๋๋ค. ์ด์จ๋ ๋ชจ๋ ๋๊ธ์์ ๋ฉ์ผ์ ๋ฐ์ต๋๋ค. @kibertoad ๋ ๋ฐฉ๊ธ ๊ทธ์ ๋ง์ง๋ง ๋๊ธ์์ ๋งํด์ผ ํ๋ ๋ชจ๋ ๊ฒ์ ๋งํ์ต๋๋ค... ์ด ๋ฌธ์ ๋ ๋ํ async/await ES2019 ๊ธฐ๋ฅ์ ๋ ์ ์ง์ํ๋ knex์ ๊ด๋ จ์ด ์์ผ๋ฉฐ knex๋ ORM์ด ์๋๋ฏ๋ก ๊ทธ ๋๊ธ์ด ์ค์ ๋ก ๋ฌด์์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ ๋ํ.
์ข์ ORM์ด ํ์ํ๋ค๋ฉด objection.js๋ฅผ ์ถ์ฒํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ knex ์์๋ ๊ตฌํ๋์ด ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ด์ ๋ํ ๊ฝค ์ข์ ์ค๋ ๋๊ฐ ์์ต๋๋ค. https://github.com/Vincit/objection.js/issues/1069
์ด๋ ์์ ์์ ์ด knex๋ ๋์ฒด๋์ง๋ง ORM์ผ๋ก ๋์ฒด๋์ง๋ ์์ต๋๋ค. ๋ณด๋ค ๊น๋ํ ์ฝ๋ ๊ธฐ๋ฐ๊ณผ ๋ณด๋ค ์ผ๊ด๋ API๋ฅผ ์ ๊ณตํ๋ ๋ค๋ฅธ ์ฟผ๋ฆฌ ๋น๋๋ก ๋์ฒด๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด knex 1.0๊ณผ ๊ฐ์ด ์๋ง๋ ;)
๋ํ knex๊ฐ ๊ต์ฒด๋๋ค๋ฉด ๋๋ ๊ทธ๊ฒ์ผ๋ก ์์ ํ ๊ด์ฐฎ์ ๊ฒ์ด๊ณ , ๋ ์ผํ ๊ฒ์ ๋๋ค :D
๋ด๊ฐ ๋ฏฟ๋ WIP๊ฐ ์์ต๋๋ค: https://github.com/tgrisser/knex-next
๋ค์ดํฐ๋ธ ํ๋ผ๋ฏธ์ค๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด async_hooks
๋ฅผ ์ฌ์ฉํ ๋ https://github.com/nodejs/node/issues/22360 ์ด ๋ฐ์ํ์ฌ ํ์ฌ ์ปจํ
์คํธ๊ฐ ์์ค๋๋ค๋ ์ ๋ ์ธ๊ธํ๊ณ ์ถ์์ต๋๋ค.
์ ๋ฅผ ๋ฏฟ์ผ์ธ์. ์ ํฌ๋ ์ด์ฌ๋ฅผ ๊ฐ๋๋ฐ ์ถ๊ฐ ์ด์ ๊ฐ ํ์ํ์ง ์์ต๋๋ค. ์ ํฌ๋ ์ฌ๋ฌ๋ถ ๋ชจ๋๊ฐ ๊ทธ๋ฌํ๋ฏ์ด ๊ทธ๋ ๊ฒ ํ๊ณ ์ถ์ต๋๋ค. :) ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ฌ์ ํ ๋ ธ๋ 6 ๋ถ๊ธฐ์ ๋ํ ๋ช ๊ฐ์ง ์์ ์ฌํญ์ ๋ ๋ฆด๋ฆฌ์คํด์ผ ํ๋ฉฐ (๋ง์ง๋ง์ผ๋ก) ์ด๋ฅผ ์ญ์ ํ๊ณ ์ ์ฐจ์ ์ผ๋ก ๋ธ๋ฃจ๋ฒ๋๋ฅผ ๋จ๊ณ์ ์ผ๋ก ์ ๊ฑฐํ ๊ฒ์ ๋๋ค.
#3227์ด ๋ณํฉ๋๋ฉด ๋ง์นจ๋ด ์์ํ ์ ์์ต๋๋ค!
์ด์ ์ ์ด ๋ง์ด๊ทธ๋ ์ด์ ์ ๋์์ ์ฌ์ฉํ ์ ์๋ค๊ณ ์ธ๊ธํ ๊ฒ์ผ๋ก ์๊ณ ์์ต๋๋ค. ๊ทธ๋๋ ์ํ๋ ๋ฐฉํฅ์ด๋ผ๋ฉด ์ด๋ค ์์ผ๋ก๋ ๋์์ ๋๋ฆด ์ ์์ต๋๊น?
๋๋ ์๊ฐํ๊ณ ์๋ค: ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๊ณ , ๋ช ๊ฐ์ง ์์ ์ ์ถ๊ฐํ๊ณ , ๋๊ตฐ๊ฐ(์๊ฐ์ด ์์ ์ ์์) ํ ๋น๋๊ณ ๋ ์ง๋ฅผ ์ค์ ํ ์ ์๋์ง ํ์ธํ์ญ์์ค.
@chaffeqa ๊ณง ์ข ๋ ์ธ๋ถํ๋ ์์
์ ๋ง๋ค ์์ ์ด๋ฉฐ #3250์์ ์ฒซ ๋ฒ์งธ ์ฌ์ด ๋ณ๊ฒฝ ์์
์ ์ํํ ์ ์์ต๋๋ค. ์ฃผ๋ก bluebird.tap, bluebird.method ๋ฐ bluebird.try ์ฌ์ฉ๋ฒ์ ๊ธฐ๋ณธ ๊ธฐ๋ฐ์ผ๋ก ๊ต์ฒดํด์ผ ํฉ๋๋ค. ์๊ฐ์ด ์ด๋ฏธ ์๋ค๋ฉด #3250์์ ๋ถ๊ธฐํ์ฌ ๋๋จธ์ง 'bluebird' ์๊ตฌ ์ฌํญ์ ์ดํด๋ณผ ์ ์์ต๋๋ค test:sqlite
Docker ์ค์ ์์ด
@qubyte ๊ธฐ์ฌํ๊ณ ์ถ๋ค๋ฉด ์ง๊ธ์ด ์ ๊ธฐ์ ๋๋ค!
@kibertoad ์ง๊ธ async/await๋ฅผ ์ฌ์ฉํด๋ ์์ ํฉ๋๊น?
knex ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์๋ฏธํฉ๋๊น? ํ์ ํ๋. ๋น์ ๋ง์ ๊ณต๊ฐ์์ ๋น์ ์ ์ธ์ ๋ ๊ทธ๋ฌ์ต๋๋ค :-D
https://github.com/tgrisser/knex/issues/3253
https://github.com/tgrisser/knex/issues/3254
https://github.com/tgrisser/knex/issues/3255
https://github.com/tgrisser/knex/issues/3256
https://github.com/tgriesser/knex/issues/3257
https://github.com/tgrisser/knex/issues/3268
https://github.com/tgrisser/knex/issues/3286
์์ ๋ฃ์ ์ ์์ต๋๋ค.
์ง๋ ์ฃผ์ MIA๊ฐ ๋ ๊ฒ์ ๋ํด ์ฃ์กํฉ๋๋ค. ์ฐ๋ฆฌ ํ์ฌ์ ์ผ์ด ์ ์ ๋์ด๋๊ณ ์์ผ๋ฏ๋ก ๊ฑฐ๊ธฐ์ ์ง์คํด์ผ ํฉ๋๋ค.
์
๊ทธ๋ ์ด๋์ ๋ํ ๋ ํฐ ๋ธ๋ก ์ค ํ๋์ธ Disposer
์ฌ์ฉ ๊ต์ฒด์ ๋ํ ๋
ผ์ ์์ ๋ฃจํ๋ฅผ ๋ซ๊ณ ์ถ์์ต๋๋ค.
๋น์ ์ด ๊ทธ๊ฒ์ ์์ํ๋ฉด ๊ฝค ๊น์ ๊ณจ์นซ๊ฑฐ๋ฆฌ, ๊ทธ๋์ ์ข์ ์นดํผ/์ถ์ํ๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ์ฝ๊ฐ์ ์ข์ ์์ง๋์ด๋ง์ด ํ์ํ ๊ฒ์ ๋๋ค. ๋๋ ๋ญ๊ฐ์ ์ฑ๋ฅ ์ค๋ฒํค๋๊ฐ ๊ฝค ํด ์ ์๋ค๊ณ ๊ฑฑ์ ํฉ๋๋ค(ํ๋ผ๋ฏธ์ค ์ฒด์ธ์ด ์ปค์ง์ ๋ฐ๋ผ ๋ ๋ง์ ๊ฐ์ฒด๊ฐ ์์ฑ๋จ).
๋๋ ์ค์ ๋ก ๋ช ๊ฐ์ง POC์์ ์์ํ์ผ๋ฉฐ ์ด๊ฒ์ด ๊ทธ ์ค ๊ฐ์ฅ ๊ฐ๋จํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
class DisposablePromise extends Promise {
disposerFunc = null;
originalResource = null;
then(onFulfilled, onRejected) {
const $onFulfilled = this.wrap(onFulfilled);
return super.then($onFulfilled, onRejected).copyContext(this);
}
copyContext(promise) {
this.disposerFunc = promise.disposerFunc;
this.originalResource = promise.originalResource;
return this;
}
disposer(disposerFunc) {
this.disposerFunc = disposerFunc
}
isDisposable() {
return !!this.disposerFunc
}
wrap(onFulfilled: any) {
const $onFulfilled = (result: any) => {
if (this.disposerFunc && !this.originalResource) {
this.originalResource = result
}
if (result instanceof Promise) {
return onFulfilled(result);
} else {
const res = onFulfilled(result)
if (this.disposerFunc) {
this.disposerFunc(this.originalResource)
}
return res
}
};
return $onFulfilled;
}
}
๊ทธ๋ฆฌ๊ณ ๋ ๋ค๋ฅธ:
var DisposablePromise = function DisposablePromise() {
var self = DisposablePromise.convert(Promise.resolve());
return self;
};
DisposablePromise.convert = function convert(promise, props) {
promise.__proto__ = DisposablePromise.prototype;
return props ? Object.assign(promise, props) : promise;
};
DisposablePromise.prototype = Object.create(Promise.prototype);
DisposablePromise.prototype.constructor = DisposablePromise;
DisposablePromise.prototype.then = function then(resolve, reject) {
var returnVal = Promise.prototype.then.call(this, resolve, reject);
return DisposablePromise.convert(returnVal);
};
DisposablePromise.prototype.catch = function _catch(err) {
var returnVal = Promise.prototype.catch.call(this, err);
return DisposablePromise.convert(returnVal);
};
DisposablePromise.prototype.finally = function finall(obj) {
var returnVal = Promise.prototype.finally.call(this, obj);
return DisposablePromise.convert(returnVal);
};
DisposablePromise.prototype.disposer = function disposer(disposerFunc) {
var returnVal = Promise.prototype.finally.call(this, obj);
return DisposablePromise.convert(returnVal);
};
๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์ฆ๋ช ํ ์๊ฐ์ด ์์์ต๋๋ค.
์ด ๊ธฐ๋ฅ์ด ์ ์ฅ์์ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์(๋ ๋์ ์ ๊ทผ ๋ฐฉ์์ ์๊ฐํ ์ ์๋ค๋ฉด... ๋น๋๊ธฐ ๋ฐ๋ณต์? ๋ด ์ง๊ฐ์ ๋ธ๋ฃจ๋ฒ๋ ๊ตฌํ ํํฌ์ ๊ฝค ๊ด๋ จ์ด ์๋ค๊ณ ๋งํ์ง๋ง ๊ทธ ๊ธฐ๋ฅ์ ์ถ์ํํ๋ ๊ฒ์ ๋ํด์๋ ๋ธ๋ฃจ๋ฒ๋ ํ์ ์๊ฒฌ์ ๋ฃ๊ณ ์ถ์ต๋๋ค.
์ด ๋ถ๋ถ์ ์์๋ผ ์ ์๋ค๋ฉด ๋๋จธ์ง ์์ ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.
@chaffeqa Np, ์์ง ์๊ฐ์ ๋ด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค!
๋๋ ๋ธ๋ฃจ๋ฒ๋ ์ฌ๋๋ค์ด ๊ตฌํ์ ์ง์งํ๊ฒ ์ฌ์ค๊ณํ๊ธฐ ์ํ ์ ์์ ๋ฐ์๋ค์ผ์ง ๋งค์ฐ ์์ฌ์ค๋ฝ์ต๋๋ค. ๊ทธ๋ค์ ์ด ์์ ์์ ๋ชจ๋ ๊ฒ๋ณด๋ค ์์ ์ฑ์ ๊ด์ฌ์ด ์๋ค๋ ์ ์ ๋ฐ๋ณตํด์ ๋ฐ๋ณตํ์ต๋๋ค. ๊ทธ๋ค์ ์ฌ๋๋ค์๊ฒ ์ค์ ๋ก ๊ณ ๊ธ ๊ธฐ๋ฅ์ด ํ์ํ์ง ์๋ ํ ๊ธฐ๋ณธ ์ฝ์์ ์ค์ ๋ก ์ฌ์ฉํ๋๋ก ๊ถ์ฅํฉ๋๋ค. ๋ธ๋ฃจ๋ฒ๋ ์ ๊ณต.
Node 8์ด ํ์ฌ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ Node.js ๋ฒ์ ์ธ ๊ฒ์ ๊ณ ๋ คํ๋ฉด(๊ณต์ Node.js ๋ค์ด๋ก๋ ํต๊ณ ๊ธฐ์ค) ์์ง ๋น๋๊ธฐ ๋ฐ๋ณต์ ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค.
๋ด๋ถ์ ์ผ๋ก DisposablePromise๋ฅผ ๊ตฌํํ๋ Knex์ ๋จ์ ์ ๋ฌด์์
๋๊น? ๊ธฐ๋ณธ Promise๋ฅผ ํ์ฅํ๊ธฐ ๋๋ฌธ์ Bluebird์ ๋จ์ ์ด ์ ํ ์์ผ๋ฉฐ ์ฌ์ฉ์ ๊ณต๊ฐ์์ ์ด์ ๋ํด ์ ํ์๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
@ericeslinger FWIW, TS ํ์ดํ์ ๋ ์ด์ ๋ง์คํฐ์์ ๋ฌธ์ ๊ฐ ๋์ง ์์์ผ ํฉ๋๋ค. ์ด์ ์ฌ์ฉ์๊ฐ Bluebird ๊ธฐ๋ฅ์ ์์กดํ์ง ์๋๋ก ์ฝ์์ ๊ธฐ๋ณธ ์ฝ์์ผ๋ก ํ์ดํํ๊ณ ์์ต๋๋ค. ์ด๋ก ์ธํด ๊ธฐ๋ณธ Promise๊ฐ Bluebird Promise๊ฐ ์ํํ์ง ์๋ ๊ฒ์ ๊ตฌํํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ๊ฐ๋ฅํ ํ ๋ง์ด ์ฌ์ฉ๋๋ Promise๋ฅผ ๊ต์ฒดํ๋ ค๊ณ ํฉ๋๋ค. ์ด ๋ผ์ธ์ ๋ํ ๋ชจ๋ ๊ธฐ์ฌ๋ ํฌ๊ฒ ๊ฐ์ฌํ๊ฒ ์ต๋๋ค :)
๋ด๊ฐ ์๊ฐํ ๊ฒฌ๊ณผ๋ฅ ๐
๋๋ DisposablePromise
์ ๊ฐ์ ๊ฒ์ ํ๋ ๊ฒ์ด ์๋ง๋ ์ด ๊ฒฝ์ฐ์ ๊ฐ๋ ๋ฐฉ๋ฒ์ผ ๊ฒ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. ํนํ ์ ๋ง๋ก ํ์ํ ํญ๋ชฉ์ด ์ฌ์ ํ ์ ์์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
๋จ์ ์ DisposablePromise
์ ๊ฐ์ ๊ฒ์ ํ๋ช
ํ ๋ฐฉ์์ผ๋ก ์์ง๋์ด๋งํ๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํ๋ค๋ ๊ฒ์
๋๋ค... ์์งํ ์ ๊ตฌํ์ด ์๋ํ๋์ง์กฐ์ฐจ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค ๐ (์ด๋ค ์ด์ ๋ก ๋น๋๊ธฐ์์ผ๋ก ์๊ฐํ๋ ๋ฐ ๋๋ฌด ์ด๋ ค์์ ๊ฒช๊ณ ์์ต๋๋ค. ํ์).
์ด ์ค๋ ๋์ <3 u longtimes!
@chaffeqa Bluebird ๊ตฌํ์ ์ผ๋ง๋ ๋ณต์กํฉ๋๊น? ์ด์ฉ๋ฉด ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์ถ์ถํ๊ณ ๊ธฐ๋ณธ ์ฝ์ ์์ ์ถ๊ฐํ ์ ์์ต๋๊น?
@chaffeqa ์ต์
์ ์๋๋ฆฌ์ค - ๋ง์ง๊ธฐ์ ๋๋ฌด ์ํํ๋ค๊ณ ํ๋จ๋๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ๋ชจ๋ Bluebird ์ฌ์ฉ๋ฒ์ ์ ๊ฑฐํ๊ณ ๋ณต์ก์ฑ์ผ๋ก ์ธํด ์ด๊ฒ์ ์ ์งํ ์ ์์ต๋๋ค. ์ด์์ ์ด์ง๋ ์์ง๋ง ๊ฒฐ๊ตญ using
๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ถํํ๋ ๊ฝค ๋ณต์ก ํฉ๋๋ค ... ๋ธ๋ฃจ๋ฒ๋๊ฐ ์ฝ์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ์ ์ดํ๋ค๋ ์ฌ์ค์ ๊ตฌํ์ ํผ๊ธฐ๋ฐฑํฉ๋๋ค. ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋ฌด์์ ํ๋ ค๋์ง ํ์ธํ๊ณ (์์ using
๋งํฌ์ ๋งค์ฐ ๊ฐ๊น์ต๋๋ค) ๊ฐ๋ฅํ ํ ๊ฐ๋จํ๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์ฌ์ ๋ง๋๋ ๊ฒ์
๋๋ค.
๋ฌธ์ ๋ ํ์ดํ๋ผ์ธ์ด Bluebird
์คํ์ผ ํ๋ผ๋ฏธ์ค ์ฌ์ผ ํ๋ฉฐ, ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ฉด ๊ธฐ๋ณธ ํ๋ผ๋ฏธ์ค์ ์ฑ๋ฅ์ ์ค์ํ์ง ์์ต๋๋ค(๋ฐ๋ผ์ ๋ชจ๋ ์ถ์ + ๊ธฐ๋ณธ ๋น๋๊ธฐ ๊ธฐ๋ฅ์ ์๊ฒ ๋จ).
๋๋ ํ๋ ์๋์์ ๋น๋๊ธฐ ๋ถ๋ถ์ ๋ํ ๊ธฐ๋ณธ ์ฝ์์ ์ฌ์ฉํ์ง๋ง ์ปจํ
์คํธ๋ฅผ ๋ฐ์ธ๋ฉํ๊ณ disposer
์ ๊ฐ์ ํ์ํ ์ฌ์ฉ๋ฒ์ ๊ตฌํํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฒ์ ํจ์ฌ ๋ ์ ํธํฉ๋๋ค.
์ฐธ๊ณ ๋ก ์ ์๊ฐ์๋ ์ค์ ๋ก knex์์ usage
๋ฐ .disposer
๋ฅผ ์ต์ํ์ผ๋ก ์ฌ์ฉํ๋ฏ๋ก ์ ๊ทผ ๋ฐฉ์์ด ๋ ๋์ ์์ค์ผ๋ก ์ด๋ํ๋ ๊ฒ์ด ๋ ๋์๊น์?
์คํํ ๋งํ ๊ฐ์น๊ฐ ์์ต๋๋ค :)
oo ๋ํ https://github.com/petkaantonov/bluebird/issues/1593 ์ ๊ธฐ๋ฐ์ผ๋ก ์ฐพ์ ์ต์ ์ ๋๋ค.
์ด๋ ์ชฝ์ด๋ , ์ข์ ๋จ๊ณ๋ ์ด์ ๋ถ๊ธฐ์์ ์์ํ ๊ฒ์
๋๋ค. ์ฌ๊ธฐ์์ ์ค์ ๋ก BluebirdPromise
์ธ ๋ชจ๋ Promise
์ฌ์ฉ์ ๋ถ๋ฆฌํ์ฌ ์ญ์ ๋ฅผ ์์ํ ์ ์์ต๋๋ค. DisposablePromise
๋๋ BluebirdNativePromise
์ ๊ฐ์ ๋์ฒดํ์์.
@chaffeqa Bluebird.setScheduler(fn => Promise.resolve().then(fn))
๋ถ๋ถ์ ๋ง์ํ์๋ ๊ฑด๊ฐ์?
์ ์ฒด์ ์ธ ์ ํ์ด ์ ๋ง ์์กฐ๋กญ๊ฒ ์งํ๋๊ณ ์์ต๋๋ค! Disposer๋ฅผ Bluebird์ ์ ์งํ๋ฉด์ ๋ด๋ถ์ ์ผ๋ก ๊ธฐ๋ณธ ์ฝ์์ ์ฌ์ฉํ๋๋ก ํ ์ ์๋ค๋ฉด ์ค์ ๋ก ์ข์ ์๋ฃจ์
์ด ๋ ์ ์์ต๋๋ค.
์ข์ต๋๋ค. ๋ฐ๋ผ์ ๋ค์ ํญ๋ชฉ์ ์ฌ์ ํ โโ์ฃผ์๊ฐ ํ์ํฉ๋๋ค.
https://github.com/tgriesser/knex/issues/3257
https://github.com/tgrisser/knex/issues/3286
https://github.com/tgrisser/knex/issues/3256
๋์์ ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค!
๋ค์ดํฐ๋ธ ํ๋ผ๋ฏธ์ค๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด
async_hooks
๋ฅผ ์ฌ์ฉํ ๋ nodejs/node#22360 ์ด ๋ฐ์ํ์ฌ ํ์ฌ ์ปจํ ์คํธ๊ฐ ์์ค๋๋ค๋ ์ ๋ ์ธ๊ธํ๊ณ ์ถ์์ต๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ https://github.com/TimBeyer/cls-bluebird ํจ์น๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
์ฐธ๊ณ ๋ก Node v8์ฉ LTS๋ ์ฌํด ์ข ๋ฃ๋ฉ๋๋ค.
@Bessonov ์ปจํ ์คํธ? ์ต์ ๋ ธ๋๋ฅผ 10์ผ๋ก ๋ฒํํ๋ฉด ์ด ๋ฌธ์ ์ ์ด๋ค ์ํฅ์ ์ค๋๊น? ๋ ธ๋ 6 ์ง์์ ์ด๋ฏธ ์ค๋จ๋์์ต๋๋ค.
๋๋ knex ์ฝ๋ ๋ฒ ์ด์ค์ ์ต์ํ์ง ์์ง๋ง ๋ธ๋ฃจ๋ฒ๋๋ฅผ ์ ๊ฑฐํ๋ ๋ฐ ๋์์ด ๋ ์ ์๋ ๋ช ๊ฐ์ง ๊ธฐ๋ฅ์ด ์์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ ธ๋ 10์ Promise.finally ๋ฅผ ์ง์ํฉ๋๋ค.
ํ์ง๋ง ์ด์จ๋ ์ด ์ฃผ์ ์ ๋ํ ์งํ ์ํฉ์ ๋ณด๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค :+1:
disposer ํจํด์ ๋ํด - ์ผํ์ฉ ์ฝ์์ ๋ฐํํ๋ ์ ํ์ ์ฝ๋ฐฑ์ ์ถ๊ฐํ ์ ์์ต๋๊น?
(ํธ๋์ญ์
๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก)
getDisposableConnection(config, cb) {
const connection = await getConnection(config)
// user want autodisposable connection
if (cb)
Promise.resolve(cb(connection)).then(() => connection.dispose())
// user will dispose by himself
return connection
}
์ด๋ค ์์ค์ Promise ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋
๋ฆฝ์ฑ์ด ํ์ํฉ๋๊น?
1) ๋ชจ๋ ๊ธฐ๋ณธ ์ฝ์์ ์ฌ์ฉํฉ๋๋ค.
2) ๋ด๋ถ ๊ธฐ๋ณธ ์ฝ์, ์ฌ์ฉ์๋ ์ธํฐํ์ด์ค์ ๋ํ ์์ ์ ์ฝ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
3) ์ฌ์ฉ์๋ ๋ด๋ถ ๋ฐ ์ธํฐํ์ด์ค์ ๋ํ promise lib๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
์ด ๋ฌธ์ ์ ํ์ฌ ์ํ๋ ๋ฌด์์ ๋๊น? ์ผ๋ฐ์ ์ผ๋ก knex๋ async await์ ํจ๊ป ์๋ํ์ง๋ง typescript๋ ๊ธฐ๋ณธ promise๊ฐ ์๋ ๋ฉ์๋๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ค๋ ๊ฒฝ๊ณ ๋ฅผ ๋ณด๊ณ ํฉ๋๋ค.
๊ทธ๋์ ์๋ ๋ฌธ์ ์ง๋ฌธ์ ๋๋ตํฉ๋๋ค. ํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ // tslint:disable-next-line: await-promise
์ ๊ฐ์ ๊ฒ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์ถ๊ฐํ๋ ๊ฒ์
๋๋ค.
@maximelkin ๋๋ ์ต์ 1์ ํฌํํฉ๋๋ค. ์ฅ๊ธฐ์ ์ผ๋ก ๋๋ ๋ชจ๋ promise ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
id ๋ ๋ฒ์งธ, ์ด ์์ ์์ ์ฐ๋ฆฌ๋ ๋๋ถ๋ถ์ ๋ธ๋ผ์ฐ์ ์ ๋ํด์๋ ์ฝ์ํ ํด๋ฆฌํ์ ๋์ด์ฐ์ต๋๋ค.
@Bessonov๋ ํ์ฌ knex์ ์์กดํ๋ฉฐ ์ ํํ ๋ธ๋ฃจ๋ฒ๋๊ฐ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(๋ฐ ์๋ง๋ ํ๋ก์ ํธ)์ ์์กดํฉ๋๋ค.
์ฐ๋ฆฌ๋ ๊ทธ๋ค์๊ฒ ๋ช ๊ฐ์ง ๋์ฒด ์๋ฃจ์ ์ ์ ๊ณตํด์ผํฉ๋๋ค
@Bessonov๋ ํ์ฌ knex์ ์์กดํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(๋ฐ ์๋ง๋ ํ๋ก์ ํธ)์ ๋ฐ๋ผ ์ ํํ ๋ธ๋ฃจ๋ฒ๋๊ฐ ํ์ํ๋ฉฐ ์ด์ ๋ํ ๋์ฒด ์๋ฃจ์ ์ ์ ๊ณตํด์ผ ํฉ๋๋ค.
knex์ ์ฌ์ฉ์๊ฐ ๋ธ๋ฃจ๋ฒ๋์ ์์กดํ๋์ง ์ฌ๋ถ๋ ์ค์ํ์ง ์์ต๋๋ค. Knex๋ ์ฌ์ ํ ๊ธฐ๋ณธ ํ๋ผ๋ฏธ์ค๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๋ธ๋ฃจ๋ฒ๋ ํ๋ผ๋ฏธ์ค์ ์ ์ํธ ์ด์ฉ๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ ํ ๋์ฒด๋ ํ์ง ๋ง์์ผ ํฉ๋๋ค.
๊ทธ๋์ ์ด ๋ฌธ์ ๋ Promise ๊ตฌํ์ ์ ํํ๋ ๊ธฐ๋ฅ์ ๋ํ ์์ฒญ์ผ๋ก ์์๋์์ต๋๋ค.
๊ฐ์๊ธฐ ๋์ฐ๋ณ์ด๋ฅผ ์ผ์ผ์ผ ์ด์ ์์ด ๋ธ๋ฃจ๋ฒ๋๋ฅผ ์ ๊ฑฐํ๊ณ ๋ชจ๋ ๋ถ์๊ฐ์กฑ์ ํ๊ดดํ์ต๋๋ค. ๊ฒฝ๊ณ , ๋ณ๊ฒฝ ๋ก๊ทธ, ๋์ฒด ๋ฐ ์ฃผ์ ๋ฆด๋ฆฌ์ค ์ต์
์ด ์์ต๋๋ค.
ํ์ง๋ง ์ง๊ธ์ ๋ชจ๋ 1.5 ํ์ดํ์คํฌ๋ฆฝํธ ์ฌ์ฉ์๋ค์ด ๋ง์กฑํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋์ ์ด ๋ฌธ์ ๋ Promise ๊ตฌํ์ ์ ํํ๋ ๊ธฐ๋ฅ์ ๋ํ ์์ฒญ์ผ๋ก ์์๋์์ต๋๋ค.
๊ฐ์๊ธฐ ๋์ฐ๋ณ์ด๋ฅผ ์ผ์ผ์ผ ์ด์ ์์ด ๋ธ๋ฃจ๋ฒ๋๋ฅผ ์ ๊ฑฐํ๊ณ ๋ชจ๋ ๋ถ์๊ฐ์กฑ์ ํ๊ดดํ์ต๋๋ค. ๊ฒฝ๊ณ , ๋ณ๊ฒฝ ๋ก๊ทธ, ๋์ฒด ๋ฐ ์ฃผ์ ๋ฆด๋ฆฌ์ค ์ต์ ์ด ์์ต๋๋ค.
์ต์ํ knex 0.x ๋ฒ์ ์ ์ด์ ๋ฒ์ ์ ์ ์ฌ์ ์ธ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋ ์ฃผ์ ๋ฆด๋ฆฌ์ค๋ก ๊ฐ์ฃผ๋์์ผ๋ฏ๋ก 0.20.x๋ก ์ ๋ฐ์ดํธํ๋ ๊ฒ๋ง ์์ ํ ์ ๊ทธ๋ ์ด๋๋ก ๊ฐ์ฃผ๋์ด์ผ ํฉ๋๋ค(๋ฒ์ ๋ฒํธ < 1์ผ ๋ semver๋ ์ค์ ๋ก ๋์จํฉ๋๋ค).
๋ธ๋ฃจ๋ฒ๋ ์ ๊ฑฐ๋ ์ค๋ซ๋์ ๋ ผ์๋์ด ์์ง๋ง ์ด ๋ฌธ์ ๋ง ์๋ ๊ฒ์ ์๋๋๋ค.
์ด์ ์์ด ๋ธ๋ฃจ๋ฒ๋ ์ ๊ฑฐ
๋ธ๋ฃจ๋ฒ๋๋ฅผ ์ ๊ฑฐํ ์ด์ ๊ฐ ์์ต๋๋ค. knex ์ฝ์๊ณผ ํจ๊ป ์ฌ์ ํ ์ธ๋ถ์์ ๋ธ๋ฃจ๋ฒ๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. bluebird๋ฅผ ์ญ์ ํ๋ ํฐ ์ด์ ์ค ํ๋๋ async
ํจ์๊ฐ ์์์ ์ผ๋ก ๊ธฐ๋ณธ ์ฝ์์ ์์ฑํ๋ฏ๋ก ์์ผ๋ก Bluebird๋ฅผ ๊ณ์ ์ฌ์ฉํ๋ ค๋ฉด ์ด์ ์์ด knex API์ ์ถ๊ฐ ๋ธ๋ฃจ๋ฒ๋ ๋ํ ์ฝ๋๊ฐ ์ถ๊ฐ๋์ด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค.
๊ฒฝ๊ณ ์์ด ๋ณ๊ฒฝ ๋ก๊ทธ,
๋์. ๋๋ ์ต์ ๋ณ๊ฒฝ ๋ก๊ทธ๋ฅผ ์กฐ์ฌํ์ต๋๋ค... ์ฌํ๊ฒ๋ ๋ฒ์ ๊ฐ์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋์ดํ์ง ๋ชปํ ๊ฒ ๊ฐ์ต๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ์ค์ ๋ก ์ง์ ํ๊ธฐ ์ํด ๋ณ๊ฒฝ ๋ก๊ทธ๋ฅผ ์์ฑํ ๋ ๋ ์ฃผ์ํด์ผ ํ๋ฉฐ, ์ด๋ ์ด์ API๋ฅผ ์์์ํต๋๋ค. ์๋ฅผ ๋ค์ด ๋ง์ ํ์ดํ ๋ณ๊ฒฝ ์ฌํญ์ ์ค์ ๋ก ์ค๋๋ TS ์ฝ๋๋ฅผ ์์์ํต๋๋ค.
ioredis ํ๋ก์ ํธ https://github.com/luin/ioredis/commit/da60b8b์์๋ ๋์ผํ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ๊ทธ๋ค์ ๋ค์ดํฐ๋ธ ํ๋ผ๋ฏธ์ค๋ฅผ ์ง์ํ๊ธฐ๋ฅผ ์ํ๊ณ ์ฌ๋๋ค์ ์ ๋ง ์ข์ ์๋ฃจ์ ์ ๋ง๋ค์์ต๋๋ค. ๊ทธ๋ค์ ๋ชจ๋ ์ปค์คํ ํ๋ผ๋ฏธ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ง์ํ๋ ์ต์ ์ ์ถ๊ฐํ๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์ดํฐ๋ธ ํ๋ผ๋ฏธ์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ ์ ๋ผ? ์ฌ์ฉ์ ์ง์ ์ฝ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์ ์ ๋น ๋ฅด๊ณ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ํจ์นํ ํ์๊ฐ ์์ต๋๋ค.
Bluebird๋ฅผ ๊ณ์ ์ฌ์ฉํ๋ ค๋ฉด ์๋ฌด๋ฐ ์ด์ ์์ด knex API์ ์ถ๊ฐ bluebird ๋ํ ์ฝ๋๊ฐ ํ์ํ์ ๊ฒ์ ๋๋ค.
์. ๊ทธ๋ฌ๋ ๋ช ์์ ์ผ๋ก ์ง์ ๋ ๊ฒฝ์ฐ ๋ธ๋ฃจ๋ฒ๋(๋๋ ๋ค๋ฅธ Promise ๋ผ์ด๋ธ๋ฌ๋ฆฌ)์์ ๋ชจ๋ ํธ์ถ์ ๋ํํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ด๊ฒ์ ํ๋์ ๊ฐ๋จํ ๋ํผ์ด๊ณ ์ค๋ฒํค๋๊ฐ ์์ผ๋ฉฐ ์ฌ์ฉ์๊ฐ ์ํ๋ ๋ชจ๋ promise ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค. ์๋ฌด๋ ๋ธ๋ฃจ๋ฒ๋๊ฐ ํ์ํ์ง ์๋ค๋ฉด ์๋ฌด๋ ์ด ์ต์ ์ ์ฌ์ฉํ์ง ์์ ๊ฒ์ด๋ฉฐ ์ ๋์ ์์ ํ๊ฒ ํ๊ธฐํ ์ ์์ต๋๋ค.
๋ํ, ๋๋ ๋ค์๊ณผ ๊ฐ์ ์๊ฒฌ์ ๋ณด์์ต๋๋ค.
์ฅ๊ธฐ์ ์ผ๋ก ๋ชจ๋ promise ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ธ๋ชจ์๊ฒ ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๊ทธ๋ฌ๋ IMHO์๋ ๋ ๊ฐ์ง ์๋ชป๋ ๊ฐ์ ์ด ์์ต๋๋ค.
async-await ํ๋์ ๋ผ์ด๋๋ฅผ ๋์ด์๋ ์ ๋ง ๋ณต์กํ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฒฝ์ฐ๋ ๊ทธ๋ ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
Bluebird์๋ ํ์์์, ์ฌ์ฉ์ ์ ์ ์ค๋ฅ ์ฒ๋ฆฌ, ๋์์ฑ ๋งคํ, ์ทจ์, ์ถ์ ๋ฑ๊ณผ ๊ฐ์ด ๋ณต์กํ ๋น๋๊ธฐ ํ๋ฆ์ ์ ๋์ ์ผ๋ก ํ์ํ ๋ง์ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ์ด๋ฌํ ๋ชจ๋ ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ ํ๋ผ๋ฏธ์ค๋ก ๊ตฌํ๋ ์ ์์ง๋ง ์ด๋ ์ธ๋ชจ์๋ ์์ฉ๊ตฌ์
๋๋ค. 2020๋
์๋ ์ฐ๋ฆฌ๋ ์ด ๋ชจ๋ ์์ฉ๊ตฌ๋ฅผ ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋
ธ๋ 12์์ ์ฌ์ ํ ๋ธ๋ฃจ๋ฒ๋๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
์ ์ ๋ผ? ์ฌ์ฉ์ ์ง์ ์ฝ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์ ์ ๋น ๋ฅด๊ณ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ํจ์นํ ํ์๊ฐ ์์ต๋๋ค.
๋ด๋ถ์ ์ผ๋ก async-await๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ๊ฒ์ ์ฝ์์ ๊ธฐ๋ณธ ์ฝ์์ผ๋ก ๊ฐ์ ๋ณํํ๋ฏ๋ก ์ต์ ์ ์ฌ์ฉ์ ์ง์ ์ฝ์์์ ๊ฐ ๋ฉ์๋์ ์ถ๋ ฅ์ ๋ํํ๊ฑฐ๋ ๋ด๋ถ ์ฝ๋์์ async-await๋ฅผ ๊ธ์งํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๊ฒ์ ์ฒซ ๋ฒ์งธ ๊ฒ์ฌ์์ ๋ณด์ผ ์ ์๋ ๊ฒ์ฒ๋ผ ์์ ์ฌ์ ์ด ์๋๋๋ค.
@ํ๋ฐ์ดํธ
๊ทธ๊ฒ์ ์ฒซ ๋ฒ์งธ ๊ฒ์ฌ์์ ๋ณด์ผ ์ ์๋ ๊ฒ์ฒ๋ผ ์์ ์ฌ์ ์ด ์๋๋๋ค.
์๋์, ์ด๋ฏธ ๋งํ๋ฏ์ด ๊ฐ๋จํฉ๋๋ค. ๋ด๋ณด๋ธ ์ธ๋ถ ๊ธฐ๋ฅ์ ๋ํ ๋ํผ๋ฅผ ๋ง๋ค๊ณ ๊ทธ๊ฒ ์ ๋ถ์ ๋๋ค. ์ฝ 10์ค์ ์ฝ๋. ๊ทธ๋ฆฌ๊ณ ์ํ๋ ๋ฐฉ์์ผ๋ก ๋ชจ๋ ๋ด๋ถ ์ฝ๋๋ฅผ ์์ฑํ์ญ์์ค.
@jehy : 10์ค์ ์ฝ๋๋ฅผ ๊ตฌํํ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด ๋ณด์ด๋ฉด ์์ ๋กญ๊ฒ PR์ ์ ์ถํ์ธ์.
๋๋ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ๊ธฐ ์ํด ์ค๋ ์๊ฐ์ ํ ์ ํ ๊ฒ์ ๋๋ค.
๊ทธ๋งํ ๊ฐ์น๊ฐ ์๊ธฐ ๋๋ฌธ์ bluebird API์ ๋๋ถ๋ถ์ ๋ค์ ํจํค์ง์ ๊ธฐ๋ณธ ์ฝ์์ ์ฌ์ฉํ์ฌ ๋์ผํ๊ฑฐ๋ ๊ฐ๊น์ด API๋ก ๋ณต์ ๋ฉ๋๋ค. https://github.com/sindresorhus/promise-fun
๊ทธ๋งํ ๊ฐ์น๊ฐ ์๊ธฐ ๋๋ฌธ์ bluebird API์ ๋๋ถ๋ถ์ ์ด๋ฌํ ํจํค์ง์ ๊ธฐ๋ณธ ์ฝ์์ ์ฌ์ฉํ์ฌ ๋์ผํ๊ฑฐ๋ ๊ฐ๊น์ด API๋ก ๋ณต์ ๋ฉ๋๋ค.
1 ๋์ ~50 ํจํค์ง? ์ง์งํ๊ฒ?
์, ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋ช ๊ฐ์ง๋ง ํ์ํฉ๋๋ค(์: p-map). ๋ฌผ๋ก ๋ง์ผ๋ฆฌ์ง๋ ๋ค๋ฅผ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋น์ ์ด ์ํ๋ ๊ฒ์ ๋ํ ํ๋์ ์ ์ฌ์ ์ธ ๊ฒฝ๋ก๋ก๋ง ์ ๊ณต๋ฉ๋๋ค.
@jehy : ๋ค์์ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋ ๋ด์์ ์์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ์๋ํ ์ ์๋ ๊ฒ์ ๋๋ค.
const Bluebird = require('bluebird');
const prototypesNeedingDecoration = [
require('knex/lib/query/builder').prototype,
require('knex/lib/schema/builder').prototype,
require('knex/lib/transaction').prototype,
require('knex/lib/raw').prototype,
];
const corePromiseMethods = ["then", "catch", "finally"];
function decoratePromiseMethods(target) {
for(const m of corePromiseMethods) {
const original = target[m];
target[m] = function(...args) {
return Bluebird.resolve(original.apply(this, args))
}
}
}
function hackBluebird() {
for(const target of prototypesNeedingDecoration) {
decoratePromiseMethods(target);
}
}
hackBluebird();
์ด๊ฒ์ ์ ์ฒด ๋ฌธ์ ์ ๋ํ ์ ์ ํ ํด๊ฒฐ์ฑ
์ด ์๋๋๋ค. ๋น์ทํ ๋ฐฉ์์ผ๋ก ์ฅ์ํด์ผ ํ๋ knex
๋ด์ ์์ฑ๋ ๋ค๋ฅธ ์์ ๊ฐ์ฒด๊ฐ ์์ต๋๋ค.
๋ํ ๋ฉด์ฑ ์กฐํญ: ํด๊ฒฐ ๋ฐฉ๋ฒ โ๏ธ์ ํ ์คํธ๊ฐ ๊ฑฐ์ ์์์ต๋๋ค. ๋ฐ๋ผ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ์คํธ๋ฅผ ๋ค์ ์คํํ์ฌ ๋ฌธ์ ๊ฐ ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค.
์ฌ๊ธฐ์ 2์ผํธ๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์์ต๋๋ค. ๋ถ์ ์ ์ธ ํผ๋๋ฐฑ์ ๊ด๊ณ์์ด ์ด ๋ง์ด๊ทธ๋ ์ด์ ์ ํฌ์ ๋ ๋ชจ๋ ์์ ์ ์ ๋ง ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
์ฐ๋ฆฌ ์ฑ์ ๊ด์ ์์ knex๋ Bluebird๋ฅผ ์๊ตฌํ๋ ๋ง์ง๋ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ผ๋ฉฐ ์์ ํ ๊ธฐ๋ณธ ์ฝ์ ์ง์์ ์ค์ํ๋ค๋ ๊ฒ์ ๋ค์์ ์๋ฏธํฉ๋๋ค.
es ํ์ค์ ํฅํด ๊ณ์ ๋ฌ๋ ค๊ฐ๋ ๊ฒ์ ๋๋จํ ์น๋ฆฌ์ ๋๋ค... ๊ทธ๋ฆฌ๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ด๋ฆฌ์์๊ฒ ๊ทธ๊ฒ ์ฌ์ด ์ผ์ด ์๋๋ผ๋ ๊ฒ์ ์๊ณ ์๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ๋ถ์๊ฒ ์๋ฆฌ์น๊ณ ์ถ์๊ณ ๊ทธ๋ฐ ๋ถ๋ด์ ๋งก์์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
๋ณ๊ฒฝ์ผ๋ก ๊ณ ํต๋ฐ๋ ์ฌ๋๋ค์ ์ํด: ๋์์ด ๋์์ผ๋ฉด ํ๋ ๋ฐ๋จ์ ๋๋ค. ๋๋ฒ๊น ์ด๋ ๋ง์ด๊ทธ๋ ์ด์ ์ ๋์์ด ํ์ํ์๋ฉด ์ฐ๋ฝ์ฃผ์ธ์!
@chaffeqa ์ด ํผ๋๋ฐฑ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ํฐ ์๋ฏธ๊ฐ ์์ต๋๋ค!
@jehy : ์ ์๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์๋ํ ๊ธฐํ๊ฐ ์์์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด ์ฆ๊ฐ์ ์ธ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๊น?
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
:+1: ๋ค์ดํฐ๋ธ Promise์ ๊ฒฝ์ฐ.