Menu
CoddyTech

PATCH로 부분 업데이트하기

Coddy Node.js 여정의 REST API 섹션에 포함된 레슨. 18개 중 3번째.

작업을 완료로 표시할 때 제목을 다시 보내야 하는 것은 아닙니다. PATCH에는 변경되는 필드만 담기며, 서버는 나머지 모든 필드를 그대로 유지합니다.

// PATCH /api/invoices/7   { "paid": true }
const { paid, amount } = req.body ?? {};
if (paid !== undefined) invoice.paid = paid;
if (amount !== undefined) invoice.amount = amount;
res.json(invoice);

각 필드는 undefined인지 확인해야 하며, if (paid)로 확인하면 안 됩니다. false도 클라이언트가 보낼 수 있는 값입니다. req.body를 객체에 펼쳐 넣는 대신 필드를 하나씩 복사하면 클라이언트가 id를 변경할 수 없습니다. 본문이 없는 요청에서는 req.body가 undefined가 되며, 이를 처리하는 것이 ?? {}입니다. 응답은 업데이트된 청구서 전체와 함께 200입니다.

challenge icon

챌린지

쉬움
  • PATCH /api/tasks/:id는 본문에 전송된 필드인 title 또는 done만 변경합니다.
  • 전체 작업과 함께 200을 반환합니다.
  • 알 수 없는 id에는 { "error": "Task not found" }와 함께 404를 반환합니다.

{ "done": true }를 포함해 PATCH /api/tasks/2를 전송한 다음, GET /api/tasks/2를 전송하고, 이어서 /api/tasks/99에 같은 PATCH를 전송하세요.

직접 해보기

import { Router } from 'express';
import { nextId, tasks } from '../store.js';

const router = Router();

router.get('/', (req, res) => {
    res.json(tasks);
});

router.get('/:id', (req, res) => {
    const task = tasks.find((t) => t.id === Number(req.params.id));
    if (!task) {
        return res.status(404).json({ error: 'Task not found' });
    }
    res.json(task);
});

router.post('/', (req, res) => {
    const { title } = req.body ?? {};
    if (!title) {
        return res.status(400).json({ error: 'title is required' });
    }
    const task = { id: nextId(), title, done: false, createdAt: new Date().toISOString() };
    tasks.push(task);
    res.status(201).location(`/api/tasks/${task.id}`).json(task);
});

export default router;
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

REST API의 모든 레슨