카테고리 없음

[NextJs] MongoDB(mongoose) 사용하기

ghkdtprhf5 2024. 10. 21. 22:01

✅ 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 중복 에러 발생