이젠 스키마(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) 설계의 가장 중요한 요소이다. 이는 실제 프로젝트에서도 가장 핵심적인 부분으로, 추후 수정될 가능성을 미리 예측하고 고려하여 설계해야 시간이 지났을 때 적은 리소스만으로도 해당 내역을 반영할 수 있다.
따라서 구현해야 할 기능들을 바탕으로, 필요한 데이터를 도출해보도록 하자.
- 할 일 추가하기, 할 일 목록 보기, 할 일 내용 변경하기
- 할 일을 구현하기 위해선, 내가 어떠한 할 일이 있는지 확인하는 내용이 필요하다.
- 하여, 해야 할 일(value)로 나타내고, 이는 문자열(String) 값을 가지게 된다.
즉, value라는 필드(Field)를 String 값으로 정의한다.
- 할 일 순서 변경하기
- 이를 위해선 할 일에 순서가 필요하다. 즉, 몇 번 째 해야할 일인지 정의해야 한다.
- 따라서 해야 할 일의 순서(order)를 숫자(Number) 형식의 필드로 나타낸다.
- 할 일 완료하기, 완료 해제하기
- 이 둘의 공통점은 할 일을 완료했다는 뜻이다. 따라서 언제 완료했는지 시간을 확인할 수 있어야 한다.
- 하여, 완료 날짜(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);
'프로젝트' 카테고리의 다른 글
24/09/06 - [실습] 할 일 메모 사이트(4): Update, Delete 구현 (0) | 2024.09.06 |
---|---|
24/09/06 - [실습] 할 일 메모 사이트(3): Create, Read 구현 (0) | 2024.09.06 |
24/09/05 - [실습] 할 일 메모 사이트(1): 설계 & 서버 구현 & 프론트엔드 서빙 (0) | 2024.09.05 |
24/08/29 - [개인] 로그 라이크 게임(3): 최종 결과물 및 피드백 (0) | 2024.08.29 |
24/08/23 - [개인] 로그 라이크 게임(2): JS 클래스의 _와 private (0) | 2024.08.23 |