Mongoose: Document.toObject() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ObjectId๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

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

๋ฌธ์„œ์˜ _id ๊ฐ€ toObject() ์ดํ›„์— ์—ฌ์ „ํžˆ ObjectId์ž„์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

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

๋ชฝ๊ณ ์˜ ์ด ๊ธฐ๋Šฅ์€ ์ •๋ง ์•„์‰ฝ๋‹ค

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

๊ฐ™์€ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. toJSON() ๋ฐ toObject() ๋ชจ๋‘ ObjectId ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฌธ์ž์—ดํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ObjectIds๋Š” ๊ธฐ์ˆ ์ ์œผ๋กœ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ํ˜„์žฌ ์˜๋„์ ์œผ๋กœ ์„ค๊ณ„๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ๋จธ๋ฆฌ ๊ผญ๋Œ€๊ธฐ์—์„œ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ JSON.parse(JSON.stringify(doc)); ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฐœ์ฒด ID๋ฅผ ๋ฌธ์ž์—ดํ™”ํ•˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ทธ๋ž˜์„œ toJSON() ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด๋ฅผ JSON ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? _id ๋ฐ date๋Š” ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ผ ๊ฐ์ฒด์ž…๋‹ˆ๊นŒ?

๊ทธ๋Ÿฐ๋ฐ toObject() ์™€ toJSON() ์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
๊ณ ๋งˆ์›Œ!

์˜ˆ ๋‚ ์งœ๋Š” toJSON() + toObject() ์ดํ›„์˜ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ผ ๋‚ ์งœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

toJSON() ๋ฐ toObject() ๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ๋™์ผํ•˜์ง€๋งŒ JSON.stringify(doc) ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ JavaScript๋Š” ๋ฌธ์„œ์—์„œ toJSON() ํ•จ์ˆ˜๋ฅผ ์ฐพ๊ณ  ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌผ์ฒด. ๋”ฐ๋ผ์„œ toJSON() JSON.stringify() ์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ ์„คํƒ•์ž…๋‹ˆ๋‹ค.

@vkarpov15 ๋งˆ๊ฐ๋œ ์ด์Šˆ์— ๋Œ“๊ธ€์„ ๋‹ฌ์•„์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค๋งŒ, ์ด ์ด์Šˆ์™€ ์ง์ ‘์ ์ธ ๊ด€๋ จ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒŒ์‹œํ•˜๊ธฐ์— ๊ฐ€์žฅ ์ ์ ˆํ•œ ์žฅ์†Œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‘ ๊ฐœ์˜ ๋ชฝ๊ตฌ์Šค ๋ฌธ์„œ๋ฅผ ์‹ฌ์ธต ๋น„๊ตํ•˜์—ฌ ๋‘ ๋ฌธ์„œ ๊ฐ„์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ diff ๊ฐœ์ฒด๋ฅผ ์–ป์œผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ObjectID๋Š” ์ •ํ™•ํžˆ ๋™์ผํ•œ ID๋ฅผ ํฌํ•จํ•˜๋”๋ผ๋„ ํ•ญ์ƒ diff๋กœ ๋๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์ง์ ‘ ๋น„๊ตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ๋‚ด๊ฐ€ ํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

var objectdiff = require('object-deep-diff');

var diffresult = objectdiff(
  JSON.parse(JSON.stringify(doc1.toObject())),
  JSON.parse(JSON.stringify(doc2.toObject()))
);

๊ทธ๊ฒƒ์€ ๊ฐ์ฒด ์‚ฌ์ด์˜ ์ฐจ์ด๋ฅผ ์–ป๋Š” ๋น„์‹ผ ๋ฐฉ๋ฒ•์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.
mongoose ๋ฌธ์„œ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ๋น„๊ตํ•˜๋Š” ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์–ผ๋งˆ๋‚˜ ๊นŠ์€ diff๊ฐ€ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ mongodb ObjectIds์— ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. _id ๋ฐ ๊ธฐํƒ€ objectid ํ•„๋“œ๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ด ๋ณด์‹ญ์‹œ์˜ค. ๋˜๋Š” lodash์˜ ๊นŠ์€ ๋™๋“ฑ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ObjectIds์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@vkarpov15 deep diff๋Š” ํ‰๋“ฑ ํ™•์ธ์„ ์œ„ํ•ด lodash๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋ถˆํ–‰ํžˆ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
https://github.com/rbs392/object-deep-diff/blob/master/index.js

๋ชจ๋“  ObjectId๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด ํšจ๊ณผ๊ฐ€ ์žˆ์ง€๋งŒ ๊ฐ์ฒด์— ๋ฐฐ์—ด ๋ฐ/๋˜๋Š” ๊ธฐํƒ€ ์ค‘์ฒฉ ๊ฐ์ฒด๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ์—๋„ ์ƒ๋‹นํ•œ ๋น„์šฉ์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค. :/

์—ฌ๊ธฐ ๋˜ ๋‹ค๋ฅธ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค toObject() ์˜ ๊ฒฐ๊ณผ์ธ 2๊ฐœ์˜ mongoose ๋ฌธ์„œ ๋˜๋Š” 2๊ฐœ์˜ ๋ฌธ์„œ์—์„œ deep-diff๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ํ›„์ž๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ ์ „์ž๋Š” ๊ทธ๋‹ค์ง€ ํšจ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@vkarpov15 ์ผ๋ฐ˜์ ์œผ๋กœ 1๊ฐœ์˜ ๋ชฝ๊ตฌ์Šค ๋ฌธ์„œ(.toObject๊ฐ€ ์žˆ๋Š” javscript ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜๋จ)์™€ ํ•˜๋‚˜์˜ ์ผ๋ฐ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
๊ทธ ์ด์œ ๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์˜ค๋Š” ๋ฐ์ดํ„ฐ์™€ ์ด๋ฏธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๊ตํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ํด๋ผ์ด์–ธํŠธ์—์„œ ์˜ค๋Š” ๋ฐ์ดํ„ฐ์—๋Š” ์ด๋ฏธ ObjectID๊ฐ€ ๋ณ€ํ™˜๋˜์–ด ์žˆ์ง€๋งŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์˜ค๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋ณ€ํ™˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ mongoose ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ์ด deep-diff ๊ฒ€์‚ฌ๋ฅผ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ๋ฌธ์„œ๊ฐ€ ๋™์ผํ•˜๊ฒŒ ๊ตฌ์„ฑ๋˜์—ˆ๋Š”์ง€ ์ ˆ๋Œ€์ ์œผ๋กœ ํ™•์ธํ•ด์•ผ ํ•˜๋ฏ€๋กœ JSON.parse(JSON.stringify(doc.toObject())๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ) ๋‘ ๋ฌธ์„œ ๋ชจ๋‘์—์„œ.

์˜ˆ, ์ด ๊ฒฝ์šฐ JSON.parse(JSON.stringify()) ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ชจ๋“  ๊ฐœ์ฒด ID๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

JSON.parse(JSON.stringify()) ๋Š” ๋‚˜์—๊ฒŒ ๋„ˆ๋ฌด ๊ณ„์‚ฐ ์ง‘์•ฝ์ ์ด์–ด์„œ ์ด ์„ฑ๋Šฅ์„ ๊ณ ๋ คํ•œ lib๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค .

var transformProps = require('transform-props');

function castToString(arg) {
    return String(arg);
}

var doc = new MongooseModel({ subDoc: { foo: 'bar' }});
var docObj = doc.toObject();

transformProps(docObj, castToString, '_id');

console.log(typeof docObj._id); // 'string'
console.log(typeof docObj.subDoc._id); // 'string'

๋ชฝ๊ณ ์˜ ์ด ๊ธฐ๋Šฅ์€ ์ •๋ง ์•„์‰ฝ๋‹ค

@ZacharyRSmith ๊ทธ๋ ‡๋‹ค๋ฉด ๋‹ค๋ฅธ ์†Œํ’ˆ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? author_id(ObjectId๋Š” ์‚ฌ์šฉ์ž ๋ชจ๋ธ์„ ๋‚˜ํƒ€๋ƒ„)/author_ids(ObjectId์˜ ๋ฐฐ์—ด)?

@flight9 ์—ฌ๋Ÿฌ ํ‚ค๋ฅผ ์ฐพ๋„๋ก transformProps()์— ์ง€์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์ด ํ…Œ์ŠคํŠธ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค: https://github.com/ZacharyRSmith/transform-props/blob/master/index.test.js#L67

๋‚˜๋Š” ๋‹น์‹ ์ด ์ด๊ฒƒ์œผ๋กœ ๋‹น์‹ ์ด ์›ํ•˜๋Š” ๊ฒƒ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

function myToString(val) {
  if (Array.isArray(val)) {
    return val.map(item => String(item));
  }
  return String(val);
}

transformProps(obj, myToString, ['author_id', 'author_ids']);

@ZacharyRSmith ์†”๋ฃจ์…˜์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค!

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

const ObjectID = require('mongodb').ObjectID;

/**
 * Convert ObjectId field values inside an object to String type values
 * (includes array of ObjectIds and nested ObjectId fields)
 * <strong i="9">@param</strong> obj Object - The Object to be converted.
 * <strong i="10">@return</strong> none
 */
function objectIdtoString(obj) {
  for(let k in obj) {
    let v = obj[k];
    if(typeof v == 'object') {
      if(k.endsWith('_id') && v instanceof ObjectID) {
        obj[k] = v.toString();
      }
      else if(
        k.endsWith('_ids') && Array.isArray(v) &&
        v.length > 0 && v[0] instanceof ObjectID
      ) {
        let vs = [];
        for(let iv of v) {
          vs.push(iv.toString());
        }
        obj[k] = vs;
      }
      else {
        objectIdtoString(v);
      }
    }
  }
}

// Call example
objectIdtoString(obj):

@vkarpov15

์˜ˆ, ์ด ๊ฒฝ์šฐ JSON.parse(JSON.stringify())๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ชจ๋“  ๊ฐ์ฒด ID๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

https://medium.com/ft-product-technology/this-one-line-of-javascript-made-ft-com-10-times-slower-5afb02bfd93f

tldr; JSON.parse(JSON.stringify()) ๋Š” ๋™๊ธฐ์‹ ์ฐจ๋‹จ ์ž‘์—…์ด๋ฉฐ ์‹ฌ๊ฐํ•œ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ํ—ˆ์šฉ/์ œ์•ˆ๋œ ์†”๋ฃจ์…˜์ด ์•„๋‹ˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค...

mongoose.Types.ObjectId.prototype.toJSON = function() { return this.toString(); ๋„ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ๊ธฐ์‚ฌ์—์„œ๋„ JSON.parse(JSON.stringify)๋Š” ๋”ฅ ํด๋ก ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋” ๋น ๋ฅธ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋”ฅ ํด๋ก ์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ž, ์—ฌ๊ธฐ 2019๋…„์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ์ฒด์˜ ๋ชจ๋“  ObjectId ์ธ์Šคํ„ด์Šค์—์„œ 16์ง„์ˆ˜ ๋ฌธ์ž์—ด์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ‹์ง€๊ณ  ๊นจ๋—ํ•˜๊ณ  ๋ถ„๋ช…ํ•œ ๋ฐฉ๋ฒ•์ด ์•„์ง ์žˆ์Šต๋‹ˆ๊นŒ?

@gitowiec

mongoose.ObjectId.get(v => v.toString());

์ฐธ์กฐ: http://thecodebarbarian.com/whats-new-in-mongoose-54-global-schematype-configuration.html#schematype -getters

@vkarpov15 ๋Š” '๋ฆฐ'์„ ์‚ฌ์šฉํ•  ๋•Œ ์ด๊ฒƒ์ด ์†”๋ฃจ์…˜์ด ์•„๋‹Œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ string objectIds๊ฐ€ ์žˆ๋Š” ์ผ๋ฐ˜ json ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด ์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š” ๊ฐ€์žฅ ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์€ lean ์˜ต์…˜๊ณผ ํ•จ๊ป˜ JSON.parse(JSON.stringify()) ๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜๋Š” ๊ฐ€๋Šฅํ•œ ๋ฆฐ ํ”Œ๋Ÿฌ๊ทธ์ธ: https://www.npmjs.com/package/mongoose-lean-objectid-string

@nhitchins ๋งž์Šต๋‹ˆ๋‹ค. mongoose-lean-getters ์™€ ๊ฐ™์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@ vkarpov15 ์ด๊ฒƒ์€ ๋˜ํ•œ ํŒ๋ณ„์ž ์Šคํ‚ค๋งˆ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋ณ€ํ˜•์„ ๋งŒ๋“œ๋Š” ๊ธฐ๋ณธ ์Šคํ‚ค๋งˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์Šคํ‚ค๋งˆ์—์„œ getter๋ฅผ ์„ค์ •ํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” lean()์„ ์‚ฌ์šฉํ•˜๊ณ  mongoose-lean-getters๋ฅผ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ์ด๊ฒƒ์ด ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

@pwrnrd ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ด๊ณ  ๋ฌธ์ œ ํ…œํ”Œ๋ฆฟ์„ ๋”ฐ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํŒ๋ณ„์ž ์Šคํ‚ค๋งˆ์™€ ์ž˜ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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