MongoDB
νμ΅ν€μλ
μ΄κΈ° μ€μ
νκ²½λ³μ μ€μ
MongoDB + mongoose
βοΈ μ΄κΈ° μ€μ
Step1. Project μμ±

Step2. cluster μμ±

Step3. cluster μμ±μ μ νμ¬ν

Step4. Network Access λ³κ²½
μ΄λ―Έμ§μ νμλ λ²νΌ ν΄λ¦νλ©΄ νμ λ ΈμΆ λ¨

Step5. Network Access λ³κ²½
μ΄λ―Έμ§μ νμλ λ²νΌ ν΄λ¦νλ©΄ λ³κ²½ ν νμΈ λ²νΌ ν΄λ¦

Step6. Database Access μμ±

Step7. Database Access μμ±
μμ΄λ
λΉλ°λ²νΈ μμ±(@ κΈ°νΈλ μ¬μ©νλ©΄ μλ¨)
Role SelectBox μ ν

π νκ²½λ³μ
.envνμΌμ μμ±ν νκ²½λ³μ μ°Ύλ λ°©λ²connectλ²νΌ ν΄λ¦

Driversμμ μ ν

ν΄λΉμμ μ½λ 볡μ¬ν΄μ νκ²½λ³μμ μ§μ

MONGODB_URL=볡μ¬ν μ½λ
mongodb+srv://alnmi28:<λΉλ°λ²νΈμμ±>@cluster0.205t0vj.mongodb.net/<DBλͺ
μμ±>?retryWrites=true&w=majority&appName=Cluster0
π mongoose
mongoose ν¨ν€μ§ μ€μΉ
npm i mongooseDB ν΄λ λ° νμΌ μμ±
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 ν΄λ λ° νμΌ μμ±
src/lib/schema.ts μμ±
DBμ 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