✅ 1. 데이터베이스 연결
MongoDB 클러스터와 Mongoose를 연결하는 코드를 작성합니다.
import mongoose from 'mongoose';
const connectDB = async () => {
try {
await mongoose.connect(process.env.MONGO_URI); // 데이터베이스 연결 주소
console.log('MongoDB 연결 성공');
} catch (err) {
console.error('MongoDB 연결 실패', err);
process.exit(1);
}
};
export default connectDB;
📒 connectDB 함수를 비동기 처리한 이유
MongoDB에 연결하는 과정이 네트워크 요청이기 때문입니다.
DB에 연결하려면 MongoDB 서버와 네트워크 통신을 해야 하고, 이 작업은 시간이 걸릴 수 있기 때문에 비동기 작업으로 처리합니다.
벨로그에서 사용한 글을 티스토리에서 활용할 수 있도록 조금 더 포맷을 깔끔하게 조정해보겠습니다. 티스토리의 에디터가 다소 제한적일 수 있으니, 기본적인 문단 구조와 마크다운을 활용한 형태로 재구성하겠습니다.
✅ 2. 스키마 및 모델 정의
import mongoose from 'mongoose';
const TopiceSchema = new mongoose.Schema({
id: {
type: Number, // 순차적인 ID 필드
required: true,
unique: true // 각 id는 고유해야 함
},
title: {
type: String,
required: true
},
questions: {
type: Number,
required: true
}
});
// 이미 모델이 존재하면 해당 모델을 사용하고, 없으면 새로 정의
export default mongoose.models.Topice || mongoose.model('Topice', TopiceSchema);
📒 required: true
의미: 이 필드는 반드시 값이 있어야 한다는 제약 조건을 설정합니다.
즉, 문서를 생성하거나 업데이트할 때 이 필드가 빈 값이거나 누락되면 ValidationError가 발생합니다.
사용 이유: 데이터의 무결성을 보장합니다.
예를 들어, 아래 코드와 같이 title 필드가 빠지거나 빈 값이면 데이터 저장이 실패합니다.
const newTopice = new Topice({ id: 1, questions: 5 }); // title이 없으므로 에러 발생
📒 unique: true
의미: 이 필드는 고유한 값이어야 한다는 제약 조건을 설정합니다.
즉, 같은 값이 중복되지 않도록 보장합니다.
사용 이유: 특정 필드가 중복되지 않도록 데이터의 고유성을 보장합니다.
아래 코드와 같이 id 필드에 같은 값이 두 번 입력되면 중복 에러가 발생합니다.
const newTopice1 = new Topice({ id: 1, title: "Test1", questions: 5 });
const newTopice2 = new Topice({ id: 1, title: "Test2", questions: 5 }); // id 중복 에러 발생