MongoDB

ν•™μŠ΅ν‚€μ›Œλ“œ

  • 초기 μ„€μ •

  • ν™˜κ²½λ³€μˆ˜ μ„€μ •

  • MongoDB + mongoose

βš™οΈ 초기 μ„€μ •

Step1. Project 생성

Step1

Step2. cluster 생성

Step2

Step3. cluster μƒμ„±μ‹œ 선택사항

Step3

Step4. Network Access λ³€κ²½

  • μ΄λ―Έμ§€μ˜ ν‘œμ‹œλœ λ²„νŠΌ ν΄λ¦­ν•˜λ©΄ νŒμ—… λ…ΈμΆœ 됨

Step4

Step5. Network Access λ³€κ²½

  • μ΄λ―Έμ§€μ˜ ν‘œμ‹œλœ λ²„νŠΌ ν΄λ¦­ν•˜λ©΄ λ³€κ²½ ν›„ 확인 λ²„νŠΌ 클릭

Step5

Step6. Database Access 생성

Step6

Step7. Database Access μž‘μ„±

  • 아이디

  • λΉ„λ°€λ²ˆν˜Έ μž‘μ„±(@ κΈ°ν˜ΈλŠ” μ‚¬μš©ν•˜λ©΄ μ•ˆλ¨)

  • Role SelectBox 선택

Step7

πŸ“„ ν™˜κ²½λ³€μˆ˜

  • .env νŒŒμΌμ— μž‘μ„±ν•  ν™˜κ²½λ³€μˆ˜ μ°ΎλŠ” 방법

  • connect λ²„νŠΌ 클릭

Dashboard
  • Drivers μ˜μ—­ 선택

Dashboard
  • ν•΄λ‹Ήμ˜μ—­ μ½”λ“œ λ³΅μ‚¬ν•΄μ„œ ν™˜κ²½λ³€μˆ˜μ— μ§€μ •

Dashboard
MONGODB_URL=λ³΅μ‚¬ν•œ μ½”λ“œ

mongodb+srv://alnmi28:<λΉ„λ°€λ²ˆν˜Έμž‘μ„±>@cluster0.205t0vj.mongodb.net/<DBλͺ…μž‘μ„±>?retryWrites=true&w=majority&appName=Cluster0

πŸƒ mongoose

mongoose νŒ¨ν‚€μ§€ μ„€μΉ˜

npm i mongoose

DB 폴더 및 파일 생성

  • src/lib/db.ts 생성

import mongoose from 'mongoose';

const connectDB = async () => {
  try {
    if (mongoose.connection.readyState >= 1) {
      console.log('Already connected to MongoDB');
      return;
    }
    await mongoose.connect(process.env.MONGODB_URL as string);
    console.log(`MongoDB Connected`);
  } catch (error) {
    console.error(`Error: ${error}`);
    process.exit(1);
  }
};
export default connectDB;

schema 폴더 및 파일 생성

import mongoose from 'mongoose';
const userSchema = new mongoose.Schema(
  {
    name: { type: String, required: true },
    email: { type: String, required: true },
    password: { type: String, select: false },
    role: {
      type: String,
      enum: ['user', 'admin'],
      default: 'user',
    },
    authProviderId: { type: String }, // μ†Œμ…œ 둜그인 둜그인
  },
  { timestamps: true }
);

export const User = mongoose.models?.User || mongoose.model('User', userSchema);
νƒ€μž… μ§€μ • (Type)

String, Number, Date, Buffer, Boolean, Mixed, ObjectId, Array, Decimal128, Map, Schema.Types
예: { name: String }
ν•„μˆ˜ ν•­λͺ© (required)

ν•„λ“œκ°€ ν•„μˆ˜μΈμ§€ μ—¬λΆ€λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.
예: { name: { type: String, required: true } }
κΈ°λ³Έκ°’ (default)

ν•„λ“œμ˜ 기본값을 μ§€μ •ν•©λ‹ˆλ‹€.
예: { age: { type: Number, default: 0 } }
μœ μΌμ„± (unique)

ν•„λ“œ 값이 μœ μΌν•΄μ•Ό 함을 μ§€μ •ν•©λ‹ˆλ‹€.
예: { email: { type: String, unique: true } }
인덱슀 (index)

ν•„λ“œμ— 인덱슀λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
예: { email: { type: String, index: true } }
μœ νš¨μ„± 검사 (validate)

ν•„λ“œ 값에 λŒ€ν•œ μœ νš¨μ„± 검사λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.
예: { age: { type: Number, validate: value => value >= 0 } }
길이 μ œν•œ (maxlength, minlength)

λ¬Έμžμ—΄ ν•„λ“œμ˜ μ΅œλŒ€/μ΅œμ†Œ 길이λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.
예: { name: { type: String, maxlength: 50 } }
μ—΄κ±°ν˜• (enum)

λ¬Έμžμ—΄ ν•„λ“œκ°€ κ°€μ§ˆ 수 μžˆλŠ” 값듀을 μ œν•œν•©λ‹ˆλ‹€.
예: { role: { type: String, enum: ['user', 'admin'] } }
일치 (match)

λ¬Έμžμ—΄ ν•„λ“œκ°€ μ •κ·œν‘œν˜„μ‹μ— λ§žμ•„μ•Ό 함을 μ§€μ •ν•©λ‹ˆλ‹€.
예: { email: { type: String, match: /.+\@.+\..+/ } }
맞좀 λ©”μ‹œμ§€ (custom error messages)

μœ νš¨μ„± 검사 μ‹€νŒ¨ μ‹œ μ‚¬μš©μž μ •μ˜ 였λ₯˜ λ©”μ‹œμ§€λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.
예: { age: { type: Number, min: [18, 'Too young'] } }

πŸ“Œ μ°Έκ³  예제

const mongoose = require('mongoose');
const { Schema } = mongoose;

// μ‚¬μš©μž μŠ€ν‚€λ§ˆ μ •μ˜
const userSchema = new Schema({
  // λ¬Έμžμ—΄ νƒ€μž… ν•„λ“œ, ν•„μˆ˜ μž…λ ₯, μ΅œλŒ€ 길이 100자
  name: {
    type: String,
    required: true,
    maxlength: 100,
  },
  // 이메일 ν•„λ“œ, ν•„μˆ˜ μž…λ ₯, μœ μΌν•΄μ•Ό ν•˜λ©° μ •κ·œ ν‘œν˜„μ‹μ„ 톡해 이메일 ν˜•μ‹ 검사
  email: {
    type: String,
    required: true,
    unique: true,
    match: /.+\@.+\..+/,
  },
  // λ‚˜μ΄ ν•„λ“œ, μ΅œμ†Œ 18μ„Έ, μ΅œλŒ€ 65μ„Έ, μœ νš¨μ„± 검사 μ‹€νŒ¨ μ‹œ 맞좀 였λ₯˜ λ©”μ‹œμ§€
  age: {
    type: Number,
    min: [18, 'Must be at least 18'],
    max: [65, 'Must be at most 65'],
  },
  // μ—­ν•  ν•„λ“œ, 'user' λ˜λŠ” 'admin'만 ν—ˆμš©, 기본값은 'user'
  role: {
    type: String,
    enum: ['user', 'admin'],
    default: 'user',
  },
  // 생성 λ‚ μ§œ ν•„λ“œ, 기본값은 ν˜„μž¬ μ‹œκ°„
  createdAt: {
    type: Date,
    default: Date.now,
  },
  // μˆ˜μ • λ‚ μ§œ ν•„λ“œ, 기본값은 ν˜„μž¬ μ‹œκ°„
  updatedAt: {
    type: Date,
    default: Date.now,
  },
});

// λͺ¨λΈ 생성
const User = mongoose.model('User', userSchema);

module.exports = User;

λͺ¨λΈμ„ μ‚¬μš©ν•˜κΈ° μœ„ν•œ λ©”μ„œλ“œ

Last updated