Knex: ํ‘œ์ค€ ES6 Promise๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2016๋…„ 07์›” 22์ผ  ยท  80์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: knex/knex

๋…ธ๋“œ v6์œผ๋กœ ์‹คํ–‰ํ•  ๋•Œ ํ‘œ์ค€ ES6 Promise๋งŒ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ(๋ธ”๋ฃจ๋ฒ„๋“œ ์ข…์†์„ฑ ์ œ๊ฑฐ)?

์˜ˆ๋ฅผ ๋“ค์–ด promise-queue ํŒจํ‚ค์ง€์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ Promise๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

https://www.npmjs.com/package/promise-queue

๋˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ Queue.configure(require('vow').Promise); ๋กœ ๋ช…์‹œ์ ์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด ํŒจํ‚ค์ง€๊ฐ€ ์œ ์‚ฌํ•œ ์ „๋žต์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

discussion

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

:+1: ๋„ค์ดํ‹ฐ๋ธŒ Promise์˜ ๊ฒฝ์šฐ.

๋ชจ๋“  80 ๋Œ“๊ธ€

ํ˜ธ๊ธฐ์‹ฌ: ๋” ๋น ๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋” ๋Š๋ฆฐ ๋‚ด์žฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๊ต์ฒดํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ? ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์ง€๋งŒ ๋…ธ๋“œ ์†๋„์—์„œ๋Š” ์š”์†Œ์ž…๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@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 ๋ฐ˜ํ™˜์— ๋Œ€ํ•ด ๋‚˜์—๊ฒŒ ๋ฒ„๊ทธ๋ฅผ ์ค๋‹ˆ๋‹ค.๋ฉ”์„œ๋“œ ์„ ์–ธ์ด Promise์ธ ๊ฒฝ์šฐ.

์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์•ฝ์† ๊ตฌํ˜„๊ณผ 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>() ์™€ ๊ฐ™์€ ๊ฒƒ์„ ๋งํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.Bluebirds๋Š” Promises์— ํ• ๋‹นํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‹คํŒจํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ ์–ด๋„ typescript 2.4์—์„œ๋Š” ์‹คํŒจํ•จ). ( ์—ฌ๊ธฐ ์— ๋”ฐ๋ฅด๋ฉด [Symbol.toStringTag]๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜๋ฅผ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์€ ๋น„๋ก ์ž‘์€ ์˜ค๋ฅ˜์ง€๋งŒ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค).

๋Œ€์‹  ๋‚ด๊ฐ€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

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 ํƒ€์ดํ•‘์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€์—ญํญ์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ–‰๋™ ๊ณ„ํš์„ ์„ธ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • [ ] ๋ชจ๋“  Bluebird ํ”„๋ก์‹œ ๋ฉ”์„œ๋“œ( tap , map , reduce , bind , return )์— ๋Œ€ํ•œ ์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๊ณ ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • [ ] Bluebird๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฒฝ๋กœ๊ฐ€ ๋  .toBluebird() ๋ฉ”์†Œ๋“œ ์ถ”๊ฐ€(์œ„ ๋ฉ”์†Œ๋“œ์˜ ๋ชจ๋“  ํ˜ธ์ถœ์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์ฐพ๊ธฐ/๋ฐ”๊พธ๊ธฐ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด์ „์— ์ถ”๊ฐ€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค)
  • [ ] ๋ณ‘ํ•ฉ/์ƒˆ ๋ฆด๋ฆฌ์Šค ์ปท(0.15)์ด ๋˜๋ฉด Typescript ์ •์˜๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • [ ] ๊ฒฐ๊ตญ ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ์™„์ „ํžˆ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋” ๊ฐ„๋‹จํ•œ API๋Š” ๊ฒฐ๊ตญ ๊ธฐ๋ณธ Promises & async/await๋ฅผ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธธ์„ ์—ด์–ด์ค๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ๊ณ  ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด๊ฒƒ์„ ์‹œ๋„ํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

ํ™•์‹คํžˆ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ 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

์ง€๋‚œ ์ฃผ์— 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์—๋Š” ๋‘ ๊ฐ€์ง€ ์ž˜๋ชป๋œ ๊ฐ€์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • Bluebird๊ฐ€ ๋” ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • Bluebird๋Š” ํด๋ฆฌํ•„๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

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๋ฅผ ์š”๊ตฌํ•˜๋Š” ๋งˆ์ง€๋ง‰ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜€์œผ๋ฉฐ ์™„์ „ํ•œ ๊ธฐ๋ณธ ์•ฝ์† ์ง€์›์„ ์ค€์ˆ˜ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋‹ค์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  1. ๋” ์ด์ƒ ์ง€์ €๋ถ„ํ•œ ์Šคํƒ ์ถ”์ ์ด ์—†์Šต๋‹ˆ๋‹ค.
  2. SSR ๋ฌด๊ฒŒ๋ฅผ ์ ๋‹นํžˆ ์ค„์˜€์Šต๋‹ˆ๋‹ค.
  3. ๋„ค์ดํ‹ฐ๋ธŒ ๋น„๋™๊ธฐ ๋Œ€๊ธฐ๊ฐ€ ์ด์ œ ๋ธ”๋ฃจ๋ฒ„๋“œ๋ณด๋‹ค ๋” ์„ฑ๋Šฅ์ด ์ข‹๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(์ ์  ๋” ์ปค์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!).

es ํ‘œ์ค€์„ ํ–ฅํ•ด ๊ณ„์† ๋‹ฌ๋ ค๊ฐ€๋Š” ๊ฒƒ์€ ๋Œ€๋‹จํ•œ ์Šน๋ฆฌ์ž…๋‹ˆ๋‹ค... ๊ทธ๋ฆฌ๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ด€๋ฆฌ์ž์—๊ฒŒ ๊ทธ๊ฒŒ ์‰ฌ์šด ์ผ์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ์†Œ๋ฆฌ์น˜๊ณ  ์‹ถ์—ˆ๊ณ  ๊ทธ๋Ÿฐ ๋ถ€๋‹ด์„ ๋งก์•„์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋ณ€๊ฒฝ์œผ๋กœ ๊ณ ํ†ต๋ฐ›๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด: ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ํ•˜๋Š” ๋ฐ”๋žจ์ž…๋‹ˆ๋‹ค. ๋””๋ฒ„๊น…์ด๋‚˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์— ๋„์›€์ด ํ•„์š”ํ•˜์‹œ๋ฉด ์—ฐ๋ฝ์ฃผ์„ธ์š”!

@chaffeqa ์ด ํ”ผ๋“œ๋ฐฑ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ํฐ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค!

@jehy : ์ œ์•ˆ๋œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•  ๊ธฐํšŒ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์ฆ‰๊ฐ์ ์ธ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰