본문 바로가기
프로젝트

24/09/05 - [실습] 할 일 메모 사이트(2): 스키마(Schema) 설계

by Jini_Lamp 2024. 9. 5.

이젠 스키마(Schema)를 설계해 볼 것이다. 스키마는 이전 시간에 잠시 배웠다.(https://dkskfktldi.tistory.com/entry/240905-Nodejs-%EC%9E%85%EB%AC%B82-2-mongoose)

스키마에 대해 다시 설명해보자면,  DB의 구조와 제약조건에 관한 전반적인 명세를 기술한 것이라 할 수 있다.

 

 

 

스키마 연결

스키마를 작성하기 위해 먼저 mongoose 연결 코드를 작성해야 한다. 따라서 schemas 폴더를 생성하고, 하위 파일인 index.js를 준비한다. DB 이름은 todo_meno로 지정한다. mongoose에 연결하기 위해선 MongoDB Atlas에서 대여한 주소가 필요하다는 걸 잊지말자.

  • mongoose와 연결(index.js)
더보기
import mongoose from 'mongoose';

const connect = () => {
  mongoose
    .connect(
      // 대여한 ID, Password, 주소에 맞게끔 수정
      'mongodb+srv://jini031104:여기에 패스워드 입력@express-mongo.s1oq6.mongodb.net/?retryWrites=true&w=majority&appName=express-mongo',
      {
        dbName: 'todo_memo', // todo_memo 데이터베이스명을 사용한다.
      },
    )
    .then(() => console.log('MongoDB 연결에 성공하였습니다.'))
    .catch((err) => console.log(`MongoDB 연결에 실패하였습니다. ${err}`));
};

mongoose.connection.on('error', (err) => {
  console.error('MongoDB 연결 에러', err);
});

export default connect;

 

이제 해당 파일을 외부에서 사용할 수 있어야 한다. 즉, app.js에서도 사용이 되어야 한다.

따라서 app.js 부분 중 일 부분을 다음과 같이 변경한다.

import express from 'express';
import connect from './schemas/index.js';	// <= 추가!

const app = express();
const PORT = 3000;

connect();	// <= 추가!

 

이후 결과를 확인해보면 제대로 MongoDB에 연결이 된 것을 알 수 있다.

결과

 

 

 

스키마 설계

MongoDB와 연결이 끝났다면 이젠 스키마를 설계해야 한다.

우리가 구현해야 할 기능은 다음과 같다.

1. 할 일 추가하기
2. 할 일 목록 보기
3. 할 일 내용 변경하기
4. 할 일 순서 변경하기
5. 할 일 완료하기
6. 할 일 완료 해제하기

 

MongoDB를 도입하기 위해 필요한 데이터와 형식을 정의하는 것은 스키마(Schema) 설계의 가장 중요한 요소이다. 이는 실제 프로젝트에서도 가장 핵심적인 부분으로, 추후 수정될 가능성을 미리 예측하고 고려하여 설계해야 시간이 지났을 때 적은 리소스만으로도 해당 내역을 반영할 수 있다.

 

따라서 구현해야 할 기능들을 바탕으로, 필요한 데이터를 도출해보도록 하자.

  1. 할 일 추가하기, 할 일 목록 보기, 할 일 내용 변경하기
    • 할 일을 구현하기 위해선, 내가 어떠한 할 일이 있는지 확인하는 내용이 필요하다.
    • 하여, 해야 할 일(value)로 나타내고, 이는 문자열(String) 값을 가지게 된다.
      즉, value라는 필드(Field)를 String 값으로 정의한다.
  2. 할 일 순서 변경하기
    • 이를 위해선 할 일에 순서가 필요하다. 즉, 몇 번 째 해야할 일인지 정의해야 한다.
    • 따라서 해야 할 일의 순서(order)를 숫자(Number) 형식의 필드로 나타낸다.
  3. 할 일 완료하기, 완료 해제하기
    • 이 둘의 공통점은 할 일을 완료했다는 뜻이다. 따라서 언제 완료했는지 시간을 확인할 수 있어야 한다.
    • 하여, 완료 날짜(doneAt)을 날짜(Date) 형식의 필드로 나타낸다.

 

최종적으로 나타난 스키마 요소들은 다음과 같다.

해야 할 일(value) 문자열(string) 형식의 데이터
: 할 일의 내용을 나타낸다.
해야 할 일의 순서(order) 숫자(number) 형식의 데이터
: 할 일의 순서를 나타낸다.
완료 날짜(doneAt) 날짜(Date) 형식의 데이터
: 완료되지 않았다면 null, 완료되었다면 날짜 형식의 데이터를 가지게 된다.

 

이제 실제로 코드 작성을 해보자.

해당 코드는 schemas 폴더의 todo.schema.js에 작성한다.

스키마를 작성하는 기본 틀은 다음과 같다.

  • 스키마 작성 기본 틀
더보기
const UsersSchema = new mongoose.Schema({
  name: String, // 문자열 타입입니다.
  age: Number, // 숫자 타입입니다.
  favorites: [String], // 문자열 배열 타입입니다.
  createdAt: { type: Date, default: Date.now }, // 날짜 타입입니다.
  someId: mongoose.Schema.Types.ObjectId // ObjectId 타입입니다.

});

 

실제로 작성한 코드는 다음과 같다.

  • todo.schema.js
더보기
import mongoose from 'mongoose';

const TodoSchema = new mongoose.Schema({
    value: {
        type: String,
        required: true  // value 필드는 필수 요소입니다.
    },
    order: {
        type: Number,
        required: true
    },
    doneAt: {
        type: Date,
        required: false // doneAt 필드는 필수 요소가 아니다.
    }
});

// 프론트엔드 서빙을 위한 코드. 자세히 몰라도 된다.
TodoSchema.virtual('todoId').get(function () {
    return this._id.toHexString();
});
TodoSchema.set('toJSON', {
    virtuals: true,
});

// TodoSchema를 바탕으로 Todo모델을 생성하여, 외부로 내보낸다.
export default mongoose.model('Todo', TodoSchema);