#100DaysOfCode 33일 차 — Mongoose

발행: (2026년 3월 7일 오전 10:45 GMT+9)
5 분 소요
원문: Dev.to

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 mongoose

Basic 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: users

CRUD 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 promisemongoose.connect()는 프로미스를 반환합니다.
  • Error handling – 비동기 호출 주변에 .catch() 또는 try/catch를 사용합니다.

Conclusion

Mongoose는 MongoDB 위에 구조와 규칙을 추가하여 개발자가 Node.js 애플리케이션에서 데이터를 보다 안전하고 효율적으로 관리할 수 있게 합니다. 스키마, 검증, 미들웨어, 깔끔한 CRUD API를 제공함으로써 스키마가 없는 데이터베이스를 잘 조직된 데이터 계층으로 변환합니다.

0 조회
Back to Blog

관련 글

더 보기 »