이제 프로젝트의 요구사항이 좀 다양해지다 보니 구현 해야 할 기능들이 많아졌다. 하지만, 데이터베이스를 난생 처음 다루면서(그것도 첫 프로젝트에서) 모르는 부분들이 너무 많아 일일히 찾아보면서 여러가지 기능들을 구현하다보니 새롭고 흥미로운 주제를 발견했다. 이전까지 프로젝트를 구현하며 궁금했던건 도대체 데이터베이스와 상호작용은 어떻게 하며, 데이터 모델은 어떻게 구현하지? 였다. 

 

그러니까 내 말은, 예를 들어, users, feedback이라는 두개의 컬렉션이 있을때, 어떤 컬렉션에서 데이터를 찾고, 또 어떤 컬렉션을 선택하여 데이터를 넣을지 등등 아무것도 몰랐던 차에 데이터베이스를 건드릴 일이 생겼다. 그래서 한번 데이터베이스 스키마, CRUD 연산을 간단히 살펴보자.

 

🛠️ 데이터베이스 스키마 정의

사실 이 부분이 백엔드 로직을 짜기 전 더욱 더 중점을 두어야 하는 부분이다. 데이터 스키마를 정의해야 이제 서버측에서 데이터를 원하는대로 다룰 수 있기 때문이다.

 

  1. 요구사항 분석
    우선, 요구사항을 분석 해야한다. 여기서의 요구 사항이란, 어떤 데이터 모델이 어떠한 값들을 담을지, 그리고 데이터 간의 단계를 정확히 파악하고 이해해야 한다. 예를 들어, 이번 프로젝트에서의 모델은 users, feedbacks, course 정도가 있다.
    우선, 유저는 email, 이름, 역할(학생인지 교수님인지) 등등이 있다. 모델은 다음과 같이 정의 할 수 있다.
const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
  pid: { type: String, required: true, unique: true },
  role: { type: String},
  name: { type: String }, 
  email: { type: String, required: false, unique: true },
  isFirstLogin: { type: Boolean, default: true }, 
  createdAt: { type: Date, default: Date.now },
  group: {type: String}
});

const User = mongoose.model('User', userSchema);

module.exports = User;

 

📌 Mongoose 모델과 스키마를 설정할 때, 해당 모델이 어느 컬렉션에 저장될지 결정된다. 위 코드에서 User 모델을 정의할 때 컬렉션 이름이 결정된다. 이 코드에서 User 모델이 userSchema 스키마를 사용하고 있다. Mongoose는 모델 이름의 복수형을 기본 컬렉션 이름으로 사용한다. 따라서 User 모델의 경우 기본적으로 users라는 컬렉션에 데이터가 저장된다.

 

한번 간단하게 학생이 수업을 등록하고, 등록한 학생을 그 course 모델의 데이터베이스에 추가 할 수 있도록 짜보자. 아래는 CRUD 연산을 이용해 학생이 Course에 등록하는 로직이다.

exports.register = async (req, res) => {
  const { uniqueCode } = req.body;
  const userPid = req.session.user.pid;

  try {
    const course = await Course.findOne({ uniqueCode });
    if (!course) {
      return res.status(404).send('Course not found');
    }

    if (course.students.includes(userPid)) {
      return res.status(400).send('User already registered for this course');
    }

    course.students.push(userPid);
    await course.save();
    res.status(200).json({ message: 'Successfully registered for the course', course });
  } catch (error) {
    console.error('Error registering course:', error);
    res.status(500).json({ message: 'Failed to register course' });
  }
};

 

아래에 course.students.push는 course라는 컬렉션의 student라는 필드에 현재 등록하려는 학생의 id를 넣고자 하는 것이다.

 

이렇게 하고 등록을 해 보면

위와 같이 courses 컬렉션의 students 필드에 kevinc97이라는 학생을 성공적으로 넣어주었다.

 

이제, 이 학생의 정보를 가져와 보여주도록 해 보자.

+ Recent posts