250x250
Notice
Recent Posts
Recent Comments
Link
«   2025/10   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

devlog_owen

231128 TIL) 입문강의 중 할일목록 api patch 코드분석 본문

TIL

231128 TIL) 입문강의 중 할일목록 api patch 코드분석

developer_owen 2023. 11. 29. 00:28
728x90
//할일순서 변경, 할일완료,해제,내용변경
router.patch('/todos/:todoId', async (req, res) => {
    // 변경할 '해야할 일'의 ID 값을 가져옵니다.
    const { todoId } = req.params;
    // '해야할 일'을 몇번째 순서로 설정할 지 order 값을 가져옵니다.
    const { order, done, value } = req.body;
  
    // 변경하려는 '해야할 일'을 가져옵니다. 만약, 해당 ID값을 가진 '해야할 일'이 없다면 에러를 발생시킵니다.
    const currentTodo = await Todo.findById(todoId).exec();
    if (!currentTodo) {
      return res
        .status(404)
        .json({ errorMessage: '존재하지 않는 todo 데이터입니다.' });
    }
  
    if (order) {
      // 변경하려는 order 값을 가지고 있는 '해야할 일'을 찾습니다.
      const targetTodo = await Todo.findOne({ order }).exec();
      if (targetTodo) {
        // 만약, 이미 해당 order 값을 가진 '해야할 일'이 있다면, 해당 '해야할 일'의 order 값을 변경하고 저장합니다.
        targetTodo.order = currentTodo.order;
        await targetTodo.save();
      }
      // 변경하려는 '해야할 일'의 order 값을 변경합니다.
      currentTodo.order = order;
    }
    if (done !== undefined) {
        // 변경하려는 '해야할 일'의 doneAt 값을 변경합니다.
        currentTodo.doneAt = done ? new Date() : null;
    }
    
    if(value){
        // 변경하려는 '해야할 일'의 value 값을 변경합니다.
        currentTodo.value = value;
    }
    // 변경된 '해야할 일'을 저장합니다.
    await currentTodo.save();
  
    return res.status(200).json({});
});

 

 

입문주차 리뉴얼 강의를 듣고 patch부분이 조금 헷갈려 코드분석글을 올린다.

const { todoId } = req.params;
const { order, done, value } = req.body;

 

url을 보게되면 todoId라는 동적 세그먼트가 있다. 이 동적 세그먼트는 주로 req.params 객체에 {todoId: 123 }이런식으로 저장해서 해당값을 얻을 수 있다.

req.body는 http 요청 본문에서 전송된 데이터를 포함한 객체다. 즉 order,done,value에 대해 데이터 정보를 받는다.

 

const currentTodo = await Todo.findById(todoId).exec();
if (!currentTodo) {
  return res
    .status(404)
    .json({ errorMessage: '존재하지 않는 todo 데이터입니다.' });
}

 

todolist 조회 및 에러 핸들링

Todo에서 특정 todoId를 찾아 만약 currentTodo가 없으면 에러메시지 '존재하지 않는 todo 데이터~"를 띄움 

 

    if (order) {
      // 변경하려는 order 값을 가지고 있는 '해야할 일'을 찾습니다.
      const targetTodo = await Todo.findOne({ order }).exec();
      if (targetTodo) {
        // 만약, 이미 해당 order 값을 가진 '해야할 일'이 있다면, 해당 '해야할 일'의 order 값을 변경하고 저장합니다.
        targetTodo.order = currentTodo.order;
        await targetTodo.save();
      }
      // 변경하려는 '해야할 일'의 order 값을 변경합니다.
      currentTodo.order = order;
    }

 

1. order 값이 주어지면

=> 변경하려는 order값이 있는 다른 해야할일을 찾아서 만약 그 order값을 가진 다른 해야할 일이 있으면 해당 해야할 일의 값을 변경하고 저장함. 변경하려는 기존의 해야할 일의 order값을 변경해서 저장.

그리고 마지막으로 현재 order값을 변경함.

 

 

    if (done !== undefined) {
        // 변경하려는 '해야할 일'의 doneAt 값을 변경합니다.
        currentTodo.doneAt = done ? new Date() : null;
    }

done값이 없다면 (완료가 되지 않았다면)

삼항연산자로 done값이 주어진 경우 true면 현재 날짜를, false면 null값을 doneAt 속성에 할당.

    if(value){
        // 변경하려는 '해야할 일'의 value 값을 변경합니다.
        currentTodo.value = value;
    }

value값이 있다면 현재 가지고 있는 value값을 수정함.

 

    // 변경된 '해야할 일'을 저장합니다.
    await currentTodo.save();
  
    return res.status(200).json({});
});

 

변경된 해야할 일을 저장하고 200 status code를 반환한다.

728x90