2 분 소요


Next.js는 Next.js의 API Routes를 사용하여 간단한 RESTful API를 구축할 수 있다.

이번 포스팅에서는 Next.js를 사용하여 RESTful API Todo App의 백엔드 로직을 구현하는 방법을 살펴보자.


1. Todos API 설정하기

파일: src/app/api/todos/route.ts

  • 먼저, 할 일 관리를 위한 API 엔드포인트를 생성해 보자.
  • GET 요청을 통해 모든 할 일을 가져오고, POST 요청을 통해 새로운 할 일을 추가한다.
export async function GET() {
  const response = await fetch("http://localhost:4000/todos");
  const todos = await response.json();
  return new Response(JSON.stringify(todos), {
    status: 200,
    headers: { "Content-Type": "application/json" },
  });
}

export async function POST(request: Request) {
  const { title, contents } = await request.json();
  if (!title || !contents) {
    return new Response(
      JSON.stringify({ error: "Title and contents are required." }),
      { status: 400 }
    );
  }

  const response = await fetch("http://localhost:4000/todos", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ title, contents, isDone: false }),
  });
  const newTodo = await response.json();

  return new Response(JSON.stringify(newTodo), {
    status: 201,
    headers: { "Content-Type": "application/json" },
  });
}



2. 특정 Todo 항목 관리하기

파일: src/app/api/todos/[id]/route.ts

  • 이제 특정 할 일을 조회하고 수정, 삭제할 수 있는 API 라우트를 만들어보자.
  • GET 요청을 통해 특정 할 일을 조회하고, PATCH 요청을 통해 할 일의 완료 상태를 업데이트하며, DELETE 요청을 통해 할 일을 삭제한다.
export async function GET(
  request: Request,
  {
    params,
  }: {
    params: {
      id: string;
    };
  }
) {
  const { id } = params;
  const response = await fetch(`http://localhost:4000/todos/${id}`);
  const todo = await response.json();

  if (!todo) {
    return new Response("Todo not found", { status: 404 });
  }

  return new Response(JSON.stringify(todo), {
    status: 200,
    headers: { "Content-Type": "application/json" },
  });
}

export async function PATCH(
  request: Request,
  {
    params,
  }: {
    params: {
      id: string;
    };
  }
) {
  const { id } = params;
  const { isDone } = await request.json();

  const response = await fetch(`http://localhost:4000/todos/${id}`, {
    method: "PATCH",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ isDone }),
  });
  const updatedTodo = await response.json();

  return new Response(JSON.stringify(updatedTodo), {
    status: 200,
    headers: { "Content-Type": "application/json" },
  });
}

export async function DELETE({ params }) {
  const { id } = params;
  await fetch(`http://localhost:4000/todos/${id}`, {
    method: "DELETE",
  });

  return new Response(null, { status: 204 });
}



2. 특정 Todo 항목 관리하기

파일: src/app/api/todos/[id]/comments/route.ts

  • 마지막으로, 할 일에 대한 댓글을 조회하고 추가하는 API 라우트를 만들어 보자.
  • 특정 할 일에 대한 댓글을 조회하고 추가한다.
// 댓글 조회
export async function GET(
  request: Request,
  {
    params,
  }: {
    params: {
      id: string;
    };
  }
) {
  const { id } = params;
  const response = await fetch(`http://localhost:4000/comments?todoId=${id}`);
  const comments = await response.json();

  return new Response(JSON.stringify(comments), {
    status: 200,
    headers: { "Content-Type": "application/json" },
  });
}

// 댓글 추가
export async function POST(
  request: Request,
  {
    params,
  }: {
    params: {
      id: string;
    };
  }
) {
  const { id } = params;
  const { text } = await request.json();

  if (!text) {
    return new Response(JSON.stringify({ error: "Text is required." }), {
      status: 400,
    });
  }

  const newComment = {
    todoId: id,
    text,
    createdAt: new Date().toISOString(),
  };

  const response = await fetch("http://localhost:4000/comments", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(newComment),
  });
  const comment = await response.json();

  return new Response(JSON.stringify(comment), {
    status: 201,
    headers: { "Content-Type": "application/json" },
  });
}


업데이트:

댓글남기기