728x90
오늘 한 것.
MongoDB Atlas 대여, studio 3T 다운로드 및 사용, Insomnia API 클라이언트 사용, 할일 메모 사이트 만들기 등;;
너무 많아서 적기도 힘들다 ㅋㅋ...
import mongoose from "mongoose";
const TodoSchema = new mongoose.Schema({
value: {
type: String,
required: true, // value 필드는 필수 요소이다.
},
order: {
type: Number,
required: true, // order 필드도 필수 요소이다.
},
doneAt: {
type: Date, // doneAt 필드는 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);
import mongoose from "mongoose"; // 몽구스 불러오기.
// connnect가 실행되면 MongoDB가 연결된다.
const connect = () => {
mongoose
.connect(
'mongodb+srv://soule125:242804@cluster0.vtgmuez.mongodb.net/?retryWrites=true&w=majority',
{
dbName: 'todo_memo', // 데이터 베이스 이름을 todo_memo로 설정한다.
}
)
// 만약 MongoDB가 연결되었을 때
.then(() => console.log('MongoDB 연결에 성공하였습니다.'))
// 연결에 실패하거나 에러가 발생 되었을 때
.catch((err) => console.log(`MongoDB 연결에 실패하였습니다. ${err}`));
};
mongoose.connection.on('error', ()=> {
// 서버스 중에 에러가 났을 때
console.error('MongoDB 연결 에러', err);
});
// export default를 통해서 connect를 밖으로 수출할 준비를 마침
export default connect;
import express from "express"; // router를 만들기 위해 express를 불러온다.
import Todo from "../schemas/todo.schema.js";
const router = express.Router(); // 라우터를 생성할 준비가 끝났다.
/** 할 일 등록 API **/
// 실제로 api를 구현할 때는 해당하는 라우터에 바탕하여 시작함.
router.post('/todos', async (req, res, next) => {
// 1. 클라이언트로 부터 받아 온 value 데이터를 가져온다.
const { value } = req.body;
// 1-5. 만약, 클라이언트가 value 데이터를 전달하지 않았을 때, 클라이언트에게 에러 메세지를 전달한다.
if (!value) {
return res.status(400).json({ errorMessage: "해야할 일(value) 데이터가 존재하지 않습니다." });
};
// 2. 해당하는 마지막 oreder 데이터를 조회한다.
// findOne()은 하나의 데이터를 조회한다.
// sort() : 정렬하다. -> '어떤 컬럼을?'
const todoMaxOrder = await Todo.findOne().sort('-order').exec(); // todo.schema.js 에 있는 Todo 몽구스 모델이다.
// 3. 만약에 존재한다면 현재 해야할 일을 +1 하고, order 데이터가 존재하지 않다면 1로 할당한다.
const order = todoMaxOrder ? todoMaxOrder.order + 1 : 1;
// 4. 해야할 일을 등록
const todo = new Todo({ value, order }); // todo는 실제 인스턴스 형식으로 만든 것
await todo.save(); // 실제로 데이터베이스에 저장하는 것.
// 5. 해야할 일을 클라이언트에게 반환한다.
return res.status(201).json({ todo: todo });
});
/** 해야할 일 목록 조회 API **/
router.get('/todos', async (req, res, next) => {
// 1. 해야할 일 목록 조회를 진행한다.
const todos = await Todo.find().sort('-order').exec();
// 2. 해야할 일 목록 조회 결과를 클라이언트에게 반환한다.
return res.status(200).json({ todos });
});
/** 해야할 일 순서 변경, 완료 / 해제, 내용 변경 API**/
router.patch('/todos/:todoId', async (req, res, next) => {
const { todoId } = req.params;
const { order, done, value } = req.body;
// 현재 나의 order가 무엇인지 알아야함.
const currentTodo = await Todo.findById(todoId).exec();
if (!currentTodo) {
return res.status(404).json({ errorMessage: "존재하지 않는 해야할 일 입니다." });
}
if (order) {
const targetTodo = await Todo.findOne({ order }).exec();
if (targetTodo) {
targetTodo.order = currentTodo.order;
await targetTodo.save();
}
currentTodo.order = order;
}
if (done !== undefined) {
currentTodo.doneAt = done ? new Date() : null;
}
if (value) {
currentTodo.value = value;
}
await currentTodo.save();
return res.status(200).json({});
});
/** 할 일 삭제 API **/
router.delete('/todos/:todoId', async (req, res, next) => {
const { todoId } = req.params;
const todo = await Todo.findById(todoId).exec();
if (!todo) {
return res.status(404).json({ errorMessage: "존재하지 않는 해야할 일 정보입니다." });
}
await Todo.deleteOne({ _id: todoId });
return res.status(200).json({});
})
export default router; // router를 외부 파일에서 사용할 수 있게 수출을 한다.
하.... 재미는 있는데 너무 막막하다 강의를 들어도 뭔 말인지도 모르겠고,
공부도 이것저것 너무 많이해서 정리하기도 너무 힘들다;;
'TIL' 카테고리의 다른 글
24.01.23 TIL (1) | 2024.01.23 |
---|---|
24.01.22 (2) | 2024.01.22 |
2024. 01. 18 TIL (0) | 2024.01.18 |
2024.01.17 (0) | 2024.01.17 |
2024. 01. 16 TIL 겸 일기 (1) | 2024.01.16 |