#100DaysOfCode 33일 차 — Mongoose
Source: Dev.to
Introduction
데이터베이스는 어떤 양이나 유형의 데이터든 저장할 수 있지만, 기본적으로 엄격한 구조를 강제하지는 않습니다.
MongoDB는 스키마가 없으며, 즉 엄격한 구조를 강제하지 않습니다. 구조, 검증 및 일관성을 유지하기 위해 개발자들은 Mongoose라는 MongoDB와 Node.js용 객체 데이터 모델링(ODM) 라이브러리를 사용합니다.
Why Mongoose?
- 스키마, 검증, 모델을 제공합니다.
- Node.js와 MongoDB 사이에 레이어 역할을 하여 대규모 애플리케이션을 더 깔끔하고, 안전하며, 유지보수가 쉽게 만듭니다.
- 미들웨어 지원, 기본값, 필수 필드 강제 등을 제공합니다.
Without Mongoose
// raw MongoDB driver
const db = client.db("MyDatabase");
await db.collection("users").insertOne({ name: "Saad", age: 25 });
const users = await db.collection("users").find().toArray();- 검증이 없으므로 잘못된 데이터가 삽입될 수 있습니다.
- 일관된 구조가 없으므로 개발자마다 쿼리가 달라집니다.
- 훅이 없으므로 비밀번호 해싱 같은 반복 작업을 직접 처리해야 합니다.
With Mongoose
await User.create({ name: "Saad", age: 25 });Mongoose는 깔끔하고 구조화된, 검증된 상호작용을 제공합니다.
Installing Mongoose
npm install mongooseBasic Import & Connection
const mongoose = require("mongoose");
const uri = "mongodb://127.0.0.1:27017/testdb";
async function run() {
await mongoose.connect(uri);
console.log("Connected");
// ... your code ...
await mongoose.disconnect();
}
run().catch(console.error);Defining a Schema
Schema는 MongoDB 컬렉션 내부 문서의 구조를 정의합니다.
const userSchema = new mongoose.Schema({
name: String,
age: Number,
isWorking: Boolean,
});Advanced Schema Example (validation, defaults)
const userSchema = new mongoose.Schema({
name: { type: String, required: true },
age: Number,
email: { type: String, required: true },
createdAt: { type: Date, default: Date.now },
skills: [String],
});스키마는 다음을 정의하는 데 도움이 됩니다:
- 필드 타입
- 배열 및 중첩 객체
- 필수 필드
- 기본값
Creating a Model
Model은 컬렉션과 상호작용하기 위해 사용되는 인터페이스입니다.
const User = mongoose.model("User", userSchema); // collection: usersCRUD Operations with Mongoose
// Create
await User.create({ name: "Saad", age: 26, isWorking: false });
// Read
const users = await User.find(); // all users
const user = await User.findOne({ name: "Saad" });
const filtered = await User.find({ age: { $gt: 20 } });
// Update
await User.updateOne({ name: "Saad" }, { age: 24 });
// Delete
await User.deleteOne({ name: "Saad" });Comparison with raw MongoDB queries
// MongoDB
db.users.find({ age: { $gt: 20 } });
// Mongoose
User.find({ age: { $gt: 20 } });두 방식은 비슷하지만, Mongoose는 정의된 스키마를 따르는 JavaScript 객체를 반환합니다.
Key Concepts
- MongoDB URI – 데이터베이스 연결 문자열.
- Connection promise –
mongoose.connect()는 프로미스를 반환합니다. - Error handling – 비동기 호출 주변에
.catch()또는try/catch를 사용합니다.
Conclusion
Mongoose는 MongoDB 위에 구조와 규칙을 추가하여 개발자가 Node.js 애플리케이션에서 데이터를 보다 안전하고 효율적으로 관리할 수 있게 합니다. 스키마, 검증, 미들웨어, 깔끔한 CRUD API를 제공함으로써 스키마가 없는 데이터베이스를 잘 조직된 데이터 계층으로 변환합니다.