TIL

2024. 01. 19

아리단길아조씨 2024. 1. 19. 21:07
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