Mongoose: ์–ด๋–ค ES6์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชฝ๊ตฌ์Šค๊ฐ€ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์ง€์ •ํ•˜๋Š” ๊ธฐ๋Šฅ

์— ๋งŒ๋“  2015๋…„ 02์›” 17์ผ  ยท  45์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: Automattic/mongoose

#1699์— ๋Œ€ํ•œ ํ† ๋ก ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

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

๋„ค require('mongoose').Promise = global.Promise ๋Š” ๋ชฝ๊ตฌ์Šค๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ ํ”„๋ผ๋ฏธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ES6 ์•ฝ์† ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ ๋„ค์ดํ‹ฐ๋ธŒ, ๋ธ”๋ฃจ๋ฒ„๋“œ ๋ฐ Q ๋กœ๋งŒ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

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

๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์ด ์™„๋ฃŒ๋œ ํ›„ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด Promise.all()์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์ •๋ง๋กœ ๊ณ ๋Œ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

:+1:

https://github.com/LearnBoost/mongoose/issues/1699 ์—์„œ ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ํ•œ ๊ฐ€์ง€๋Š” ๊ตฌํ˜„์ด ๊ธฐ๋ณธ๊ฐ’์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ญ๋ฐฉํ–ฅ ๋ฆด๋ฆฌ์Šค๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ๊ฐ์•ˆํ•˜๋ฉด mpromise๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์ด ๋˜์–ด์•ผ ํ•˜์ง€๋งŒ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

+1

:+1:

ํ•ดํ‚น๋‹นํ•˜๋Š” ์ง€์ ์ด ์žˆ๋‚˜์š”? ๋‚˜๋Š” mpromise๊ฐ€ ์žˆ๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ํ๋ฆ„์„ ์ฐธ์„ ์ˆ˜ ์—†์œผ๋ฉฐ ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ๋ณด๊ธฐ ์œ„ํ•ด ์†Œ์Šค๋ฅผ ์—ด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์•ฝ์†ํ•˜๋‹ค:

  query.exec()
    .then(function(ou) {
      if(!ou) {
        return next(new errors.http.NotFound('The specified OU was either not found, or your credentials lack the required permissions to view it.'));
      }

      res.send(ou);
    }, next)
    .end(next);

๊ฑฐ๋ถ€๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  end ๋„ ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. end ๊ฐ€ ์—†์œผ๋ฉด ์˜ˆ์™ธ(์˜ˆ: NotFound ํด๋ž˜์Šค์˜ ์ฒ ์ž๊ฐ€ ํ‹€๋ฆฌ๋Š” ๊ฒฝ์šฐ)๋Š” ์กฐ์šฉํžˆ ์‚ผ์ผœ์ง€๊ณ  ํ‘œํ˜„์€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

ํŒŒ๋ž‘์ƒˆ:

  query.exec()
    .then(function(ou) {
      if(!ou) {
        return next(new errors.http.NotFound('The specified OU was either not found, or your credentials lack the required permissions to view it.'));
      }

      res.send(ou);
    })
    .catch(next);

promisifyAll(require('mongoose')) ํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ์ง€๊ธˆ๊นŒ์ง€ Mongoose 4์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๋‹ค๋ฃจ๋Š” ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๊ฐ€ ๋„ˆ๋ฌด ํ‘œ์ ์ด ๋ฉ๋‹ˆ๊นŒ?

์ง€๊ธˆ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์€ #2754 ๋ฐ vkarpov15 /kareem#2์— ๋”ฐ๋ผ kareem ๋ชจ๋“ˆ์—์„œ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•œ ๋Œ๋กœ ๋‘ ๋งˆ๋ฆฌ์˜ ์ƒˆ๋ฅผ ์ฃฝ์ด๊ณ  ํ›„ํฌ์™€ ์•ฝ์†์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ž‘์„ฑ๋œ ์ •๋ง ์ง€์ €๋ถ„ํ•œ ํฌ์ธํŠธ ์ปท ๋„Œ์„ผ์Šค๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ˜‘๋ ฅ. ๊ทธ๋ž˜๋„ ์ž์œ ๋กญ๊ฒŒ ํ•ด๋ณด์‹ญ์‹œ์˜ค. ์ €๋Š” PR์— ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ Promise ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ณ„์† ์ง€์›ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ES6 Promises ์‚ฌ์–‘์€ ์ด์ œ ํ™•๊ณ ํ•˜๊ณ  ์—ฌ๊ธฐ์— ๋จธ๋ฌผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ „ ๋ฒ„์ „์˜ ๋…ธ๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์„ ๋•Œ ๋กœ๋“œ๋œ ํด๋ฆฌํ•„๊ณผ ํ•จ๊ป˜ ์ˆœ์ˆ˜ํ•œ ES6 ์•ฝ์†์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?

๊ทธ๋ ‡๋‹ค๋ฉด ์‹œ๋„ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์š”์ ์€ ์›ํ•˜๋Š” ES6 ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ Promise ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด when, q, rsvp ๋“ฑ์— ์—ฌ์ „ํžˆ ๋งŽ์€ ํˆฌ์ž๋ฅผ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ์ผ๋ฐ˜ ํด๋ฆฌํ•„์ด ํฌ์ฐฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ณ ์œ ํ•œ ํŠน์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹ค๋ฅธ ์ œ์•ˆ์— ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํŠน๋ณ„ํžˆ ์•ฝ์†์„ ์ข‹์•„ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์‚ฌ๋žŒ๋“ค์ด "์•ฝ์†์œผ๋กœ ๋ธ”๋ฃจ๋ฒ„๋“œ ๊ธฐ๋Šฅ X ์ง€์›" ๋˜๋Š” "๋„ค์ดํ‹ฐ๋ธŒ rsvp.js ์ง€์›"์„ ์š”์ฒญํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ๊ฐ€ ์‚ฐ์ ํ•ด ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์— ๋™๊ธฐ๋ฅผ ๋ถ€์—ฌ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. " ๊ทธ๋ฆฌ๊ณ  ์‚ฌ๋žŒ๋“ค์ด ์ž์‹ ์˜ ์•ฝ์† ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํŒŒํ‹ฐ์— ๊ฐ€์ ธ์˜ค๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ์ข…๊ฒฐํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋ฌด์Šจ ๋ง์ธ์ง€ ์•Œ๊ฒ ๋‹ค. ์ €๋Š” Promises์˜ ํฐ ์‚ฌ์šฉ์ž์ด์ž ์ง€์ง€์ž์ž…๋‹ˆ๋‹ค. ๊ธฐ์ค€์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
A+ ์•ฝ์†์€ ES6์˜ ํ•„์ˆ˜ ์š”์†Œ๋กœ ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ES6 ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋…ธ๋“œ ๋ฒ„์ „(์˜ˆ: https://github.com/jakearchibald/es6-promise)์— ๋Œ€ํ•œ ์ง€์›์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ํด๋ฆฌํ•„์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค.

ES6 Promise์™€ ํ˜ธํ™˜๋˜๊ณ  ํ˜ผํ•ฉ๋  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค๋ฅธ Promise ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์†์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘ํ•˜๋‹ค:
๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ API๊ฐ€ ์ค‘๋‹จ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ œ๊ฐ€ ๋†“์น˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

Promises/A+ ์‚ฌ์–‘์€ ES6 Promise ์‚ฌ์–‘๊ณผ ๋งค์šฐ ๋‹ค๋ฅด๋ฉฐ, ์ด๋Š” ์ด์ „ ์ฃผ์„์—์„œ ๋‚˜์—ดํ•œ Promise ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€๋„ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ˆ˜๋งŽ์€ Promise ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ชจ๋‘ ES6์œผ๋กœ ํ†ตํ•ฉ๋œ๋‹ค๋ฉด ๋‚˜์—๊ฒŒ๋Š” ์ข‹์„ ๊ฒƒ์ด์ง€๋งŒ, ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ์„์ง€ ์˜๋ฌธ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์˜คํ”ˆ ์†Œ์Šค์˜ ์•„๋ฆ„๋‹ค์›€์€ Promise๋ฅผ ์‚ฌ๋ž‘ํ•˜๋Š” ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์ด ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์›ํ•˜๊ณ  ์ž์‹ ์˜ Promise๋ฅผ ์ž‘์„ฑํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋„์„œ๊ด€.

ํ˜„์žฌ API์— ๋Œ€ํ•œ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์€ mongoose.set('Promise', require('bluebird')); ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ฏ€๋กœ ์˜ตํŠธ์ธ์ด ๋˜๊ณ  mpromise๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„ ๋งž๋‹ค, ์‹ค์ˆ˜ํ•ด์„œ ๋ฏธ์•ˆํ•ด.
ํ˜„์žฌ ๊ตฌํ˜„๊ณผ ๋‹ค๋ฅธ ์•ฝ์† ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

mongoose.set('Promise', Promise);

mongoose.set('Promise', require('bluebird'));

mongoose.set('Promise', require('q').defer());

mongoose.set('Promise', require('when').defer());

// and so on...

๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ resolve ๋ฐ reject ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š” ์„ ํƒ ๊ฐœ์ฒด์˜ ์•ฝ์†์„ ๋ชฝ๊ตฌ์Šค์— ๋…ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋‹น์‹ ์ด ์—ผ๋‘์— ๋‘์—ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋กœ ์ž‘์—…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ํ•˜๋‹ค:
mongoose.set('Promise', Promise); ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์–ด๋ฆฌ์„์€ ์ผ์ž…๋‹ˆ๋‹ค. ES6์ด ๊ธฐ๋ณธ์ด์–ด์•ผ ํ•˜๋ฉฐ ์„ ํƒํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(ES6 Promises๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์„ ๋•Œ๋งˆ๋‹ค mpromise).

๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค. ๋„์™€์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊นŒ๋‹ค๋กœ์šด ๋ถ€๋ถ„์€ 1) ํ›„ํฌ๋กœ ์ž‘๋™ํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. vkarpov15/kareem#2๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. 2) mpromise์™€ ์—ญํ˜ธํ™˜๋˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ re: Q, ES6 ์‚ฌ์–‘์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด Q ๊ตฌ๋ฌธ์ด๋ฏ€๋กœ require('q').Promise ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ž…๋ ฅํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ฒฝ์Ÿ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ ๋˜๋Š” ์ง€์†์ ์ธ PR์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๊นŒ?

์™„์„ฑ๋œ ๊ฒƒ์ด ๋” ๋‚ซ์ง€๋งŒ ํ•ญ์ƒ ๋ช‡ ๊ฐ€์ง€ ์ œ์•ˆ์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ง‰ํžˆ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”

์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด +1์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ธ”๋ฃจ๋ฒ„๋“œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค

๊ณผ๊ฐํ•œ ๊ฒƒ์— ๋Œ€ํ•ด ์œ ๊ฐ์Šค๋Ÿฝ๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋Œ€์•ˆ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์€ promise ์ง€์›์„ ์™„์ „ํžˆ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ง€์›์„ ์š”์ฒญํ•˜๋Š” ์•ฝ์†์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์„ ๋ง‰์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
bluebird์™€ ๊ฐ™์€ ๊ฐ•๋ ฅํ•œ promise ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ์ฝœ๋ฐฑ API๋ฅผ ๋…ธ์ถœํ•˜๊ณ  bluebird๊ฐ€ ์ด๋ฅผ 0 ๋น„์šฉ์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ž˜ํ•‘ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ด์จŒ๋“  ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์ˆ˜๋™์œผ๋กœ ์ง€์›ํ•˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

@benjamingr 100% ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์ œ iojs์™€ NodeJ๊ฐ€ Node 3.0์œผ๋กœ ๋ณ‘ํ•ฉ๋˜๋ฉด์„œ ES6 Promises ๋ฐ Generators๊ฐ€ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

์ง€์›์„ ์ค‘๋‹จํ•˜๋Š” ๊ฒƒ์€ ์—„์ฒญ๋‚œ ํ›„ํ‡ด๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฆ‰, Promise.promisifyAll(require("mongoose")) ๋Š” ํ‘œ์ค€์— ๋ถ€ํ•ฉํ•˜๋Š” Mongoose์šฉ ๋น ๋ฅธ(์ˆ˜๋™ ์‹œ๋„๋ณด๋‹ค ๋น ๋ฅธ) ๋ž˜ํผ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด์— ๋Œ€ํ•ด ์•„๋ฌด ์กฐ์น˜๋„ ์ทจํ•˜์ง€ ์•Š๊ณ ๋„ ๋ชจ๋“  API๋ฅผ ๋‘˜๋Ÿฌ์‹ธ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค, export ๊ฐ์ฒด์— Promise.promisifyAll ๋ฅผ ์ง์ ‘ ํ•˜๊ณ  bluebird Promise์™€ Dual Promise ๋ฉ”์†Œ๋“œ (save - saveAsync) ๋ฅผ ๋ฌด๋ฃŒ๋กœ ๋…ธ์ถœ์‹œํ‚จ ๋‹ค์Œ ์‹ค์ œ ์ž‘์—…์„ ํ•˜์ง€ ์•Š๊ณ ๋„ bluebird Promise ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋…ธ์ถœํ•œ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ œ๊ฐ€ bluebird promise๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ ๋‘ ๊ฐœ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ฝ”๋”ฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ณด๋‹ค ๋ฌธ์„œ์˜ ์„น์…˜์—์„œ ์ด ๋ชจ๋“  ๊ฒƒ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@albertorestifo ๋Š” ์‹ค์ œ๋กœ ์‚ญ์ œ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š”. ๋‚˜๋Š” ์•ฝ์†์ด ๋ฌด์—‡์ธ์ง€ ์ž˜ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ(์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์—์„œ 1500ํฌ์ธํŠธ ์ด์ƒ 500 ๋‹ต๋ณ€:P) io.js์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์˜ ์ผ๋ถ€์— ๋Œ€ํ•ด์„œ๋„ ์ฑ…์ž„์ด ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: https://github.com/ nodejs/io.js/issues/256).

๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ @vkarpov15 ๊ฐ€ ์•ฝ์†์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ž์‹ ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์•ฝ์†์„ ์ง€์›ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์€ ๋ณ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. mongoose๊ฐ€ ์ œ๊ณตํ•˜์ง€ ์•Š๋”๋ผ๋„ ์‰ฝ๊ฒŒ mongoose์™€ ํ•จ๊ป˜ promise๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ ์ง€์›์„ ๊ตฌํ˜„ํ•˜๋Š” mongoose๋Š” ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ๋” ๋งŽ๊ณ  ๋Š๋ฆฌ๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. @vkarpov15 ๋Š” ์ฝœ๋ฐฑ API ์ž‘์—…์„ ๊ณ„์†ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‚ฌ์šฉ์ž๋Š” Mongoose๋ฅผ ์‰ฝ๊ฒŒ ํ•˜๋‚˜์˜ ๋ผ์ด๋„ˆ๋กœ ํ”„๋ผ๋ฏธ์Šค๋กœ ๋ฌถ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์•ฝ์†ํ•ฉ๋‹ˆ๋‹ค.

@benjamingr ๋Š” ์™ธ๋ถ€ Promise ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‚ฌ์–‘์— ์žˆ๋Š” ๊ฒƒ์„ ๊ณ ์ˆ˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„๋„ ์ž˜ ์•„์‹œ๊ฒ ์ง€๋งŒ ๋ž˜ํผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์˜ ์š”์ ์„ ๋ด…๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์ง€์›ํ•˜๋ฉด ์—„์ฒญ๋‚œ ํ˜ผ๋ž€์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์ฝœ๋ฐฑ์„ ์‹ซ์–ดํ•˜๋ฏ€๋กœ ๋Œ€์‹  ์ฝœ๋ฐฑ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ์ƒ์„ฑ๊ธฐ์™€ ์•ฝ์†์„ ์‚ฌ์šฉํ•˜๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ฝœ๋ฐฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๋‘ ๊ฐœ์˜ ๋ณ„๋„ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ๋™์ผํ•œ ๊ตฌ์กฐ์™€ API๋ฅผ ์ตœ๋Œ€ํ•œ ๊ฐ€๊น๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

@benjamingr ๋Š” ์™ธ๋ถ€ Promise ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‚ฌ์–‘์— ์žˆ๋Š” ๊ฒƒ์„ ๊ณ ์ˆ˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„๋„ ์ž˜ ์•„์‹œ๊ฒ ์ง€๋งŒ ๋ž˜ํผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋Š๋ฆฌ๊ณ  ๋””๋ฒ„๊ทธํ•˜๊ธฐ ์–ด๋ ต๊ณ  ๊ธฐ๋Šฅ์ด ๋œ ํ’๋ถ€ํ•œ ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ์„ ํƒํ•œ ๊ฒฝ์šฐ ๋‹น์—ฐํžˆ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์ด ๋ž˜ํผ์™€ ์–ด๋–ค ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ธฐ๋ณธ ์•ฝ์†*์„ ์‚ฌ์šฉํ•˜์—ฌ bluebird์˜ promisifyAll ์™€ ์œ ์‚ฌํ•œ ๋ž˜ํผ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๋ณ„๋„์˜ ํŒจํ‚ค์ง€๋กœ ๋ชฝ๊ตฌ์Šค์˜ ์•ฝ์†์ด ํ™œ์„ฑํ™”๋œ ๋ฒ„์ „์„ ์›ํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • 1๋‹จ๊ณ„, ์ข‹์•„ํ•˜๋Š” ํŽธ์ง‘๊ธฐ๋ฅผ ์—ด๊ฑฐ๋‚˜ ๊ดœ์ฐฎ์€ ํŽธ์ง‘๊ธฐ๋งŒ ์—ฝ๋‹ˆ๋‹ค.
  • 2๋‹จ๊ณ„, module.exports = require("bluebird").promisifyAll(require("mongoose")) ์ž…๋ ฅ
  • 3๋‹จ๊ณ„, ์ ์ ˆํ•œ package.json ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  npm์— ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค.
  • 4๋‹จ๊ณ„, ์ˆ˜๋งŒ ๋‹ค์šด๋กœ๋“œ.

์ด์ œ "๋„ค์ดํ‹ฐ๋ธŒ ํ”„๋ผ๋ฏธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค"๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์„ ์••๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ Promise ํ”„๋กœํ† ํƒ€์ž…์—์„œ then ๋ฐ catch ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๊ณ  all ๋ฐ race from Promise ๊ทธ๋ฆฌ๊ณ  ๋™์ผํ•œ API๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๊ธฐ๋ณธ ์•ฝ์†์„ ๋‚ด๋ณด๋‚ด๊ณ  ์žˆ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋‹จ์ง€ ๋‘ ๊ฐœ์˜ Promises/A+ ๊ตฌํ˜„์ด๊ธฐ ๋•Œ๋ฌธ์— ์•Œ์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•ฝ์†ํ•ฉ๋‹ˆ๋‹ค ;)

(* ๋น ๋ฅด๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ์ž ์ˆ˜์ค€์—์„œ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ง€๊ธˆ ๋‹น์žฅ Promise๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋น ๋ฅธ ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— io.js๊ฐ€ ๊ฒฐ๊ตญ promisify ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ๋‚ด๋ณด๋‚ผ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์ฒœ์ฒœํžˆ).

ํ™•์‹คํžˆ ๊ดœ์ฐฎ์€ ๋Œ€์•ˆ์ž…๋‹ˆ๋‹ค. ์ข‹๋“  ์‹ซ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ๋ชฝ๊ตฌ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ๋‚ด์—์„œ ์•ฝ์†์„ ์ง€ํ‚ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ชฝ๊ตฌ์Šค์™€ ํ•จ๊ป˜ ์•ฝ์† ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ X๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค." ๊ฐœ๋ณ„ ๋ชจ๋“ˆ๋กœ ์—ฐ๊ฒฐ์„ ๋Š์„ ๋•Œ์˜ ๋‹จ์ ์€ "์ด ๋ฒ„์ „์˜ mongoose-promise๋Š” mongoose 3.8์—์„œ๋งŒ ์ž‘๋™ํ•˜๊ณ  ์ด๊ฒƒ์€ mongoose >= 4.1์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ๊นŒ๋‹ค๋กญ๊ณ  mongoose๊ฐ€ ์ค‘์š”ํ•œ ์•ฝ์† ๋ž˜ํผ๋ฅผ ๊นจ๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. .

ํ™•์‹คํžˆ ๊ดœ์ฐฎ์€ ๋Œ€์•ˆ์ž…๋‹ˆ๋‹ค. ์ข‹๋“  ์‹ซ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ๋ชฝ๊ตฌ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ๋‚ด์—์„œ ์•ฝ์†์„ ์ง€ํ‚ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ์›ํ•˜๊ฑฐ๋‚˜ ํ•„์š”๋กœ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ฝ”๋“œ์—์„œ ์•ฝ์† ์ž์ฒด๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ์ด๋ฏธ ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‚ฌ์šฉํ•  ๋•Œ http ๋ชจ๋“ˆ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ชฝ๊ตฌ์Šค๊ฐ€ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์•ฝ์† ๋ž˜ํผ๋ฅผ ๊นจ๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

Bluebird๋Š” ์ •๋ง ๊ฐ„๋‹จํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœํ† ํƒ€์ž…์„ ์ฐพ์€ ๋‹ค์Œ Async ์ ‘๋ฏธ์‚ฌ๊ฐ€ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ •๋ง ๊ฐ„๋‹จํ•˜๊ณ  ์‹ค์ œ๋กœ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. Mongoose๋ฅผ ํฌํ•จํ•œ ๋Œ€๋ถ€๋ถ„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋Š” ํ•˜๋‚˜์˜ ๋ผ์ด๋„ˆ์ด๋ฉฐ ์ค‘๋‹จ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ง€๋‚œ 1๋…„ ๋™์•ˆ ๋‚˜๋ฅผ ์œ„ํ•ด ํ•œ ๋ฒˆ์ด๋ผ๋„.

์ž ์žฌ์ ์œผ๋กœ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฌ์šด ๋งŽ์€ ์Šคํ‹ฐ์นญ ์ฝ”๋“œ๋ฅผ ์œ ์ง€ํ•˜๋ ค๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ API๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ง€์›ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€ ์ž‘์—…์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๊ณ  ์ž‘์—…์„ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. bluebird์˜ promisifyAll ์ฝ”๋“œ๋ฅผ "๋นŒ๋ ค" ํ•˜๊ณ  ๋‹ค๋ฅธ Promise ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(๊ฒฐ๊ตญ ์˜คํ”ˆ ์†Œ์Šค์ž„)์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ์กฐ์ •ํ•˜์ง€๋งŒ ์ˆ˜๋™์œผ๋กœ ํ•˜์ง€๋Š” ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

"์ด ๋ฒ„์ „์˜ mongoose-promise๋Š” mongoose 3.8์—์„œ๋งŒ ์ž‘๋™ํ•˜๊ณ , ์ด๊ฒƒ์€ mongoose >= 4.1์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค." ๊ทธ๋ฆฌ๊ณ  ๋ชฝ๊ตฌ์Šค๊ฐ€ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์•ฝ์† ๋ž˜ํผ๋ฅผ ๊นจ๋Š” ๊ฒƒ์„ ํ”ผํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๊ธ€์Ž„์š”, ์•ฝ์†์ด ์ž๋™์ด๋ผ๋ฉด ์ผ์–ด๋‚˜์•ผ ํ•˜๋Š” ํš๊ธฐ์ ์ธ ๋ณ€ํ™”์˜ ์˜ˆ๋ฅผ ๋“ค์–ด์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

1) ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

2) ๊ฒŒ์œผ๋ฅด๊ณ  ํ”ผํ•˜๊ณ  ์‹ถ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ์•ฝ์† ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” promisifyAll์— ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด "Xpromise ๊ธฐ๋Šฅ Y ์ง€์›"์ด ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ๋ชฝ๊ตฌ์Šค ๊ธฐ๋Šฅ ์š”์ฒญ์ธ ์ด์œ ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€, ์šฐ๋ฆฌ๋Š” Bluebird์˜ ์•ฝ์†์„ ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ƒ๊ฐ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‹จ์ง€ mongoose ํ•จ์ˆ˜๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

3) ์•ฝ์†์˜ ๊ตฌํ˜„ ๋ฐ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. :)

1) ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ํ…Œ์ŠคํŠธํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ์ฝœ๋ฐฑ์— ๋Œ€ํ•œ ๋น„์œ ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

2) ๊ฒŒ์œผ๋ฅด๊ณ  ํ”ผํ•˜๊ณ  ์‹ถ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ์•ฝ์† ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” promisifyAll์— ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด "Xpromise ๊ธฐ๋Šฅ Y ์ง€์›"์ด ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ๋ชฝ๊ตฌ์Šค ๊ธฐ๋Šฅ ์š”์ฒญ์ธ ์ด์œ ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€, ์šฐ๋ฆฌ๋Š” Bluebird์˜ ์•ฝ์†์„ ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ƒ๊ฐ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‹จ์ง€ mongoose ํ•จ์ˆ˜๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์‹œ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ๊ตฌํ˜„์ด ๋” ๋Š๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜๋™์œผ๋กœ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๋„ ๊ฒŒ์œผ๋ฆ„์ด ์•„๋‹™๋‹ˆ๋‹ค. NodeJS๋Š” ์ฝ”์–ด์— ์ต์Šคํ”„๋ ˆ์Šค๋ฅผ ๋„ฃ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฒŒ์œผ๋ฅธ๊ฐ€์š”? TC39๋Š” ํ•ต์‹ฌ์— ๋ฐ‘์ค„์„ ๋„ฃ์ง€ ์•Š์•„ ๊ฒŒ์œผ๋ฅธ๊ฐ€์š”? ๊ทœ์น™(์ฝœ๋ฐฑ)์„ ๊ณ ์ˆ˜ํ•จ์œผ๋กœ์จ ์‚ฌ์šฉ์ž์—๊ฒŒ ์›ํ•˜๋Š” ๋™์‹œ์„ฑ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

3) ์•ฝ์†์˜ ๊ตฌํ˜„ ๋ฐ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. :)

๊ธ€์Ž„, bluebird์˜ ์•ฝ์†, ๋˜๋Š” Q's ๋˜๋Š” When's - ๊ตฌํ˜„์€ ๋‹ค๋ฅด์ง€๋งŒ ๋ชจ๋‘ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์›ํ•˜๋Š” ๊ฒƒ์„ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค. ์–ด๋–ป๊ฒŒ ๊นจ์งˆ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์ด ํ† ๋ก ์—์„œ ์ œ๊ฐ€ ๋†“์น˜๊ณ  ์žˆ๋Š” ํ•œ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

mongoose๊ฐ€ ํ‘œ์ค€ ์•ฝ์†(ES6 ๊ธฐ๋ณธ ๊ตฌํ˜„์„ ์˜๋ฏธํ•จ)์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ ES6 ํ˜ธํ™˜ Promise ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ˜ธํ™˜๋˜์–ด์•ผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? Promise.all([model.query().exec(), ...]) ๋Š” ๋ฌผ๋ก ์ด๊ณ  ๋™๋“ฑํ•  ๋•Œ ๋ธ”๋ฃจ๋ฒ„๋“œ q๋„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ฝœ๋ฐฑ๊ณผ ํ‘œ์ค€ ํ”„๋ผ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ (์ง€๊ธˆ ํ•˜๊ณ  ์žˆ์ง€๋งŒ ์•ฝ์†์„ "์ œ๊ฑฐ"ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ) ์‚ฌ์šฉ์ž๊ฐ€ ์ฆ๊ฒจ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋ผ๋ฏธ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋‚ด๊ฐ€ ์—ฌ๊ธฐ์„œ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@albertorestifo ๊ธ€์Ž„์š”, ๋„ค์ดํ‹ฐ๋ธŒ ํ”„๋ผ๋ฏธ์Šค๋Š” ํ˜„์žฌ ๋Š๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž ์˜์—ญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋™๋“ฑํ•œ ์ˆ˜์ค€์— ๋„๋‹ฌํ•˜๊ธฐ๊นŒ์ง€ ์ž ์žฌ์ ์œผ๋กœ ๋ช‡ ๋…„์ด ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

@benjamingr ๋‹น์‹ ์€ ๋ช‡ ๊ฐ€์ง€ ์ข‹์€ ์ ์„ ์ง€์ ํ•ฉ๋‹ˆ๋‹ค. mongoose ์•ฝ์†์˜ ์ฃผ์š” ์š”์ ์€ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด mongoose ๋น„๋™๊ธฐ ์ž‘์—…๊ณผ ํ•จ๊ป˜ yield ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๊ฐ€๊นŒ์šด ๋ฏธ๋ž˜์— ๋Œ€ํ•œ ์•ฝ์†์„ ์œ ์ง€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. IMO๋Š” ์•ž์œผ๋กœ ๋ชฝ๊ตฌ์Šค ์ฝ”์–ด์˜ ์ผ๋ถ€๊ฐ€ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Q ๋˜๋Š” ์–ธ์ œ ์•ฝ์† ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

Q ๋˜๋Š” ์–ธ์ œ ์•ฝ์† ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋„ค, ์ œ๊ฐ€ ์•„๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๋„๋ฆฌ ํผ์ง„ promise ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ผ์ข…์˜ ์•ฝ์†์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์–ธ์ œ์ž…๋‹ˆ๋‹ค: https://github.com/cujojs/when/blob/master/docs/api.md#nodeliftall
์—ฌ๊ธฐ Q: https://github.com/kriskowal/q/wiki/API-Reference#qnfbindnodefunc -args

๋„ค์ดํ‹ฐ๋ธŒ ํ”„๋ผ๋ฏธ์Šค์—๋Š” ์•„์ง ์—†์ง€๋งŒ ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค. ํ”„๋ผ๋ฏธ์Šค ์ƒ์„ฑ์„ ์œ„ํ•œ ๋น ๋ฅธ ๊ฒฝ๋กœ(์ฆ‰, ํ”„๋ผ๋ฏธ์Šค ์ƒ์„ฑ์ž๊ฐ€ ์•„๋‹˜)๊ฐ€ ์กด์žฌํ•˜๋ฉด NodeJS๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ํ”„๋ผ๋ฏธ์Šค์— ๋Œ€ํ•ด ์ฝ”์–ด์—์„œ ์ด๋ฅผ ์ง€์›ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์˜์—ญ์—์„œ _๋น ๋ฅธ_ ์ˆ˜ํ–‰).

mongoose ์•ฝ์†์˜ ์ฃผ์š” ์š”์ ์€ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด mongoose ๋น„๋™๊ธฐ ์ž‘์—…๊ณผ ํ•จ๊ป˜ yield๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ด์จŒ๋“  promise์™€ ํ•จ๊ป˜ ์˜๋ฏธ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ yield ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฐœ์ „๊ธฐ๋ฅผ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋กœ ํŽŒํ”„ํ•˜๋Š” 9 LoC๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ™•์‹คํžˆ promisify๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž์™€ ๊ฐ™๋‹ค๋ฉด ์–ด์จŒ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ™•์‹คํžˆ Mongoose์—์„œ ์•ฝ์†์„ ํ—ˆ์šฉํ•˜๊ณ  ์‹ถ์€/ํ•„์š”ํ•œ ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐˆ ๊ธธ์ด๋ฉฐ ์–ธ์–ด๊ฐ€ ํ˜„์žฌ ๋™์‹œ์„ฑ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ์†”์งํžˆ ๋ฐฉ๋ฒ•๋ณ„๋กœ ์ˆ˜๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๊ณ ํ†ต์Šค๋Ÿฌ์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ์˜ "promise์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ" ๋˜๋Š” "์ œ๋„ˆ๋ ˆ์ดํ„ฐ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ" ์„น์…˜์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ์ด๋ฏธ ๋ฐฉ๋ฒ•๋ณ„๋กœ ์ˆ˜ํ–‰ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๋ถ€ ์•ฝ์† ๋ž˜ํผ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์–ด๋Š ์ชฝ์ด๋“  5.0๊นŒ์ง€๋Š” ํ•ต์‹ฌ์—์„œ ์•ฝ์†์„ ์™„์ „ํžˆ ์ œ๊ฑฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ƒ๊ฐ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. @benjamingr ๋Š” ๋‚ด๊ฐ€ ๋ฉด๋ฐ€ํžˆ ๊ณ ๋ คํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ์ข‹์€ ์ฃผ์žฅ์„ ํ•˜์ง€๋งŒ ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ์–ด์จŒ๋“  #2688์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ๋ถ„๋ช…ํžˆ Mongoose์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ๊ฒฝํ—˜์ด ์žˆ๊ณ  ๋” ์ค‘์š”ํ•œ ๊ฒƒ์€ ์‚ฌ์šฉ์ž์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์„ ํƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๋“ค์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” "its"๋ฅผ ์ž…๋ ฅํ–ˆ์ง€๋งŒ ๋‚ด iPhone์€ "it's"๋กœ ์ž๋™ ์ˆ˜์ •๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ๋Š๊ผˆ๊ณ  GitHub๋Š” ์ฃผ์„ ํŽธ์ง‘์ด ํฅ๋ฏธ๋กœ์šด ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค. ์ด์ค‘๋Œ“๊ธ€ ์ŠคํŒธ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค:)

๋Œ“๊ธ€ ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์˜ ์—ฐํ•„์„ ํด๋ฆญํ•˜๋ฉด ์›น์‚ฌ์ดํŠธ์˜ ๋Œ“๊ธ€์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ํ•ญ์ƒ ์ง„์‹ฌ ์–ด๋ฆฐ ํ† ๋ก , ํŠนํžˆ ์ €์—๊ฒŒ ์ƒˆ๋กœ์šด ๊ฒƒ์„ ๊ฐ€๋ฅด์ณ์ฃผ๋Š” ํ† ๋ก ์— ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฏธ๋ž˜๋Š” ๊ธฐ๋ณธ ์•ฝ์†์— ์†ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Mongoose๋Š” mongo ops์˜ ์‚ฐ์—… ํ‘œ์ค€์ด๋ฉฐ ํ‘œ์ค€ ์•ฝ์†์— ์˜์กดํ•˜๋Š” ๊ฒƒ๋„ ์™„์ „ํžˆ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

ํ‘œ์ค€ ์•ฝ์†์€ ํ•„์—ฐ์ ์œผ๋กœ ์„ฑ์ˆ™ํ•˜๊ณ  ์–ด๋–ค ํ”„๋ ˆ์ž„์›Œํฌ๋ณด๋‹ค ๋„๋ฆฌ ๋ณด๊ธ‰๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒธ์†ํ•œ +1.

@iliakan ์•„๋งˆ๋„ ๋ฏธ๋ž˜์—. 2016๋…„ ์ค‘๋ฐ˜๊นŒ์ง€๋Š” ๊ธฐ๋ณธ ํ”„๋ผ๋ฏธ์Šค๊ฐ€ "ํ‘œ์ค€"์ด ๋  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๋‹จํŽธํ™”๋œ ํ”„๋ผ๋ฏธ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋„ˆ๋ฌด ๊นŠ์ด ์ž๋ฆฌ ์žก๊ณ  ์žˆ๊ณ  ๋ฏธ๋ฌ˜ํ•œ ๋‹จ์ ์ด ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹ค. ์–ด๋Š ์ชฝ์ด๋“ , ๋ชฝ๊ตฌ์Šค๋Š” ๋Œ€๋Œ€์ ์ธ ์—ญ์ „ ๋ณ€๊ฒฝ ์—†์ด '๊ธฐ๋ณธ์ ์œผ๋กœ ๊ธฐ๋ณธ'์œผ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@vkarpov15 ํ™•์‹คํžˆ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ๋™์•ˆ ์œ ์ตํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ - ์•ฝ์†๊ณผ ๊ธฐ๋ณธ ์•ฝ์† ์‚ฌ์ด์˜ ์ฃผ์š” ๋น„ํ˜ธํ™˜์„ฑ์„ ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค. ์ ์–ด๋„ mpromise ๋กœ ์‹œ๋„ํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” ๊ฒƒ๋“ค ;)

์ง€๊ธˆ ๋‹น์žฅ์€ catch ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์ด ๋ชจ๋“  ์ œํ•œ ์‚ฌํ•ญ์ž…๋‹ˆ๊นŒ?

ES6 API์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. mpromise๋Š” Promises/A+ ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  .catch (), ๊ธด ์Šคํƒ ์ถ”์  ๋“ฑ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ .then() ๊ฐ€ ์•„๋‹Œ ๋ชจ๋“  ๊ฒƒ์€ mpromise์˜ ๊ตฌํ˜„ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ Promises/A+๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๋†’์€ ์ˆ˜์ค€์˜ ๊ด€์ ์—์„œ ES6 promise๋„ ๊ตฌํ˜„ํ•˜์ง€๋งŒ ๊ทธ ๋ฐ˜๋Œ€๋Š” ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. Promises/A+๋Š” ์ €์ˆ˜์ค€ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋งค์šฐ ๊ตฌ์ฒด์ ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, bluebird๋Š” Promises/A+๋ฅผ ์ •ํ™•ํžˆ ๋”ฐ๋ฅด์ง€ ์•Š์œผ๋ฉฐ ๋‹ค๋ฅธ ์ผ๋ฐ˜์ ์ธ promise ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด์„œ๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์‚ฌ์–‘์„ ์ค€์ˆ˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค๋งŒ์˜ ๋…ํŠนํ•œ ๋ฐฉ์‹. ์ด๊ฒƒ์ด ์ด๊ฒƒ์„ ํŠนํžˆ ๊นŒ๋‹ค๋กญ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์ œ ๋ธ”๋ฃจ๋ฒ„๋“œ์™€ ๋„ค์ดํ‹ฐ๋ธŒ ํ”„๋ผ๋ฏธ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋„ค require('mongoose').Promise = global.Promise ๋Š” ๋ชฝ๊ตฌ์Šค๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ ํ”„๋ผ๋ฏธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ES6 ์•ฝ์† ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ ๋„ค์ดํ‹ฐ๋ธŒ, ๋ธ”๋ฃจ๋ฒ„๋“œ ๋ฐ Q ๋กœ๋งŒ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

@vkarpov15 ๋ฉ‹์ง€๋„ค์š” ! ์ •๋ง ๊ณ ๋ง™์Šต๋‹ˆ๋‹ค!

@vkarpov15 ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ž˜ ํ–ˆ์–ด!

๋„ค, ํ™•์‹คํžˆ. ์ •๋ง ๋ฉ‹์ง€๋„ค์š”! :)

@vkarpov15 ์ •๋ง ๋ฉ‹์ง€๋„ค์š”

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