Mongoose create() Gotcha: Two Writes Instead of One ๐Ÿ˜จ
AI Store์—์„œ AI์ฝ”๋”ฉ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ์•ฑ์„ ๋งŒ๋‚˜๋ณด์„ธ์š”!
์ง€๊ธˆ ๋ฐ”๋กœ ๋ฐฉ๋ฌธํ•˜๊ธฐ

When a Single create() Call Becomes Two Writes: A Mongo + Mongoose Gotcha ๐Ÿ˜จ

์นดํ…Œ๊ณ ๋ฆฌ

ํ”„๋กœ๊ทธ๋ž˜๋ฐ/์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ

์„œ๋ธŒ์นดํ…Œ๊ณ ๋ฆฌ

์›น ๊ฐœ๋ฐœ

๋Œ€์ƒ์ž

MongoDB์™€ Mongoose๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž, ํŠนํžˆ ๋ฌธ์„œ ์ƒ์„ฑ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐœ๋ฐœ์ž

ํ•ต์‹ฌ ์š”์•ฝ

  • Mongoose์˜ Model.create() ๋ฉ”์„œ๋“œ๋Š” ์ธ์ž๋กœ ๋ฌธ์„œ ๋ฐฐ์—ด์„ ๋ฐ›๋Š” ๊ฒƒ์œผ๋กœ ์„ค๊ณ„๋˜์–ด ์žˆ์–ด, { session }๊ณผ ๊ฐ™์€ ์˜ต์…˜์„ ์ž˜๋ชป ์ „๋‹ฌํ•˜๋ฉด 2๊ฐœ์˜ ๋ฌธ์„œ๊ฐ€ ์‚ฝ์ž…๋  ์ˆ˜ ์žˆ๋‹ค
  • insertMany()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ๋ฌธ์„œ๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ์˜ต์…˜์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•ด์„ํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ๋ฐ˜ํ™˜๊ฐ’์€ ๋ฐฐ์—ด ํ˜•ํƒœ๊ฐ€ ๋œ๋‹ค
  • ๋‹จ์ผ ๋ฌธ์„œ ์‚ฝ์ž…์€ .save() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•˜๋ฉฐ, ์ด ๋ฉ”์„œ๋“œ๋Š” ํ•ญ์ƒ ๋‹จ์ผ ๋ฌธ์„œ๋ฅผ ๋ฐ˜ํ™˜

์„น์…˜๋ณ„ ์„ธ๋ถ€ ์š”์•ฝ

1. ๋ฌธ์ œ ๋ฐœ์ƒ ์›์ธ

  • Mongoose์˜ Model.create() ๋ฉ”์„œ๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์ค‘ ๋ฌธ์„œ ์‚ฝ์ž…์„ ์ง€์›ํ•˜๋ฉฐ, doc1, doc2, ... ํ˜•ํƒœ๋กœ ์ธ์ž๋ฅผ ๋ฐ›๋Š”๋‹ค
  • { session }๊ณผ ๊ฐ™์€ ์˜ต์…˜์„ ๊ฐœ๋ณ„ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๋ฉด Mongoose๊ฐ€ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ์šด ๋ฌธ์„œ๋กœ ์ธ์‹ํ•˜์—ฌ ์‚ฝ์ž…
  • mongoose.set('debug', true)๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด insertOne ๋ช…๋ น์ด 2ํšŒ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ

2. ์ž„์‹œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • insertMany()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์„œ ๋ฐฐ์—ด๋กœ ์ „๋‹ฌํ•˜๋ฉด ์˜ต์…˜์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•ด์„

```javascript

await tagModel.create([ { name, color, user, parent } ], { session });

```

  • ์ด ๋ฐฉ๋ฒ•์€ ๋‹จ์ผ ๋ฌธ์„œ ์‚ฝ์ž… ์‹œ ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ธก๋ฉด์—์„œ ๋ถˆํŽธํ•จ์„ ์œ ๋ฐœ

3. ๊ถŒ์žฅ ์†”๋ฃจ์…˜

  • ๋‹จ์ผ ๋ฌธ์„œ ์‚ฝ์ž…์€ .save() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉ

```javascript

const doc = new tagModel({ name, color, user, parent });

await doc.save({ session });

return doc;

```

  • .save()๋Š” ์˜ต์…˜์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•ด์„ํ•˜๊ณ , ํ•ญ์ƒ ๋‹จ์ผ ๋ฌธ์„œ๋ฅผ ๋ฐ˜ํ™˜
  • Model.insertMany()๋Š” ๋Œ€๋Ÿ‰ ์‚ฝ์ž…์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์Œ

๊ฒฐ๋ก 

  • ๋‹จ์ผ ๋ฌธ์„œ ์‚ฝ์ž…์€ .save() ๋ฉ”์„œ๋“œ๋ฅผ, ๋Œ€๋Ÿ‰ ์‚ฝ์ž…์€ insertMany()๋ฅผ ์‚ฌ์šฉ
  • Model.create() ์‚ฌ์šฉ ์‹œ ์ธ์ž ํ˜•ํƒœ๋ฅผ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•˜์—ฌ ์˜ต์…˜๊ณผ ๋ฌธ์„œ๋ฅผ ํ˜ผ๋™ํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜
  • mongoose.set('debug', true)๋ฅผ ํ™œ์„ฑํ™”ํ•˜์—ฌ ๋กœ๊ทธ๋ฅผ ํ†ตํ•ด ๋ช…๋ น๋ฌธ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ง„๋‹จ ๊ฐ€๋Šฅ