
지난 포스트 : ToDo List 개발과정 1 - SetUp & Table 생성 및 연결
지난 포스트 : ToDo List 개발과정 2 - 회원 생성/조회/수정
코드 링크 (Github)
Tools
Node.js + JavaScript + MySql + Sequelize



router.post('/', async (req, res, next) => {
    try {
        const todo = await Todo.create({ //INSERT
            member: req.body.id,
            content: req.body.content,
            isCompleted: req.body.isCompleted
        });
        console.log(todo);
        res.status(201).json(todo);
    } catch (err) {
        console.error(err);
        next(err);
    }
});
// todo 등록 시
document.getElementById('comment-form').addEventListener('submit', async (e) => {
    e.preventDefault();
    const id = e.target.userid.value;
    const content = e.target.content.value;
    const isCompleted = e.target.isCompleted.checked;
    if (!id) {
        return alert('아이디를 입력하세요');
    }
    if (!content) {
        return alert('할일을 입력하세요');
    }
    try {
        await axios.post('/todos', { id, content, isCompleted });
        getTodo();
    } catch (err) {
        console.error(err);
    }
    e.target.userid.value = '';
    e.target.comment.value = '';
    e.target.isCompleted.value = false;
});



router.route('/:id')
    .get(async (req, res, next) => {
        try {
            const todos = await Todo.findAll({
                include: {
                    model: Member,
                    where: { id: req.params.id },
                },
            });
            console.log(todos);
            res.json(todos);
        } catch (err) {
            console.error(err);
            next(err);
        }
    })



router.route('/:id')
    .patch(async (req, res, next) => {
        try {
            const result = await Todo.update({
                isCompleted: req.body.isCompleted,
            }, {
                where: { id: req.params.id },
            });
            res.json(result);
        } catch (err) {
            console.error(err);
            next(err);
        }
    })
const edit = document.createElement('button');
edit.textContent = '수정';
edit.addEventListener('click', async () => { // 수정 클릭 시
    const newCompleted = confirm('완료는 확인, 미완료는 취소를 클릭하세요.');
    try {
        await axios.patch(`/todos/${todo.id}`, { isCompleted: newCompleted });
        getTodo();
    } catch (err) {
        console.error(err);
    }
});

router.route('/:id')
    .delete(async (req, res, next) => {
        try {
            const result = await Todo.destroy({ where: { id: req.params.id } });
            res.json(result);
        } catch (err) {
            console.error(err);
            next(err);
        }
    });
const remove = document.createElement('button');
remove.textContent = '삭제';
remove.addEventListener('click', async () => { // 삭제 클릭 시
    try {
        await axios.delete(`/todos/${todo.id}`);
        getTodo();
    } catch (err) {
        console.error(err);
    }
});


router.route('/:id')
    //할 일 단건 조회
    .get(async (req, res, next) => {
        try {
            const id = req.params.id;
            const todos = await Todo.findOne({
                include: {
                    model: Member,
                    where: { id: req.params.id },
                },
            });
            console.log(todos);
            res.json(todos);
        } catch (err) {
            console.error(err);
            next(err);
        }
    })


router.route('/')
    .get(async (req, res, next) => {
        try {
            const resTodos = await Todo.findAll({
                include: {
                    model: Member,
                    where: {  },
                },
            });
            res.json(resTodos);
        } catch (err) {
            console.error(err);
            next(err);
        }
    })
// 전체 TODO 로딩
async function getTodo() {
    try {
        const res = await axios.get(`/todos`);
        const todos = res.data;
        const tbody = document.querySelector('#comment-list tbody');
        tbody.innerHTML = '';
        todos.map(function (todo) {
            console.log("메롱=>"+JSON.stringify(todo));
            // 로우 셀 추가
            const row = document.createElement('tr');
            let td = document.createElement('td');
            td.textContent = todo.id;
            row.appendChild(td);
            td = document.createElement('td');
            td.textContent = todo.Member.email;
            row.appendChild(td);
            td = document.createElement('td');
            td.textContent = todo.Member.name;
            row.appendChild(td);
            td = document.createElement('td');
            td.textContent = todo.content;
            row.appendChild(td);
            td = document.createElement('td');
            td.textContent = todo.isCompleted ? '⭕' : '❌';
            row.appendChild(td);
            const edit = document.createElement('button');
            edit.textContent = '수정';
            edit.addEventListener('click', async () => { // 수정 클릭 시
                const newCompleted = confirm('완료는 확인, 미완료는 취소를 클릭하세요.');
                try {
                    await axios.patch(`/todos/${todo.id}`, { isCompleted: newCompleted });
                    getTodo();
                } catch (err) {
                    console.error(err);
                }
            });
            const remove = document.createElement('button');
            remove.textContent = '삭제';
            remove.addEventListener('click', async () => { // 삭제 클릭 시
                try {
                    await axios.delete(`/todos/${todo.id}`);
                    getTodo();
                } catch (err) {
                    console.error(err);
                }
            });
            // 버튼 추가
            td = document.createElement('td');
            td.appendChild(edit);
            row.appendChild(td);
            td = document.createElement('td');
            td.appendChild(remove);
            row.appendChild(td);
            tbody.appendChild(row);
        });
    } catch (err) {
        console.error(err);
    }
}