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)
๋ฅผ ํ์ฑํํ์ฌ ๋ก๊ทธ๋ฅผ ํตํด ๋ช ๋ น๋ฌธ์ ์ค์๊ฐ์ผ๋ก ํ์ธํ์ฌ ๋ฌธ์ ๋ฅผ ๋น ๋ฅด๊ฒ ์ง๋จ ๊ฐ๋ฅ