백엔드 개발자로서 RESTful API를 구축하는 것은 필수적인 기술 중 하나입니다. 이번 포스팅에서는 Node.js와 Express를 이용해 RESTful API를 차근차근 구축하는 방법에 대해 알아보겠습니다.

환경 설정

먼저 Node.js와 Express를 설치해야 합니다. Node.js가 설치되어 있지 않다면, Node.js 공식 웹사이트에서 다운로드 후 설치하세요. 설치 후 다음 명령어로 Express를 설치하겠습니다.

mkdir my-api
cd my-api

# npm 초기화
npm init -y

# Express 설치
npm install express

서버 설정

이제 기본 서버를 설정해 보겠습니다. index.js 파일을 생성하고 다음 코드를 추가합니다.

const express = require('express');
const app = express();
const PORT = 3000;

// JSON 파싱 미들웨어
app.use(express.json());

// 기본 라우트
app.get('/', (req, res) => {
    res.send('Hello, World!');
});

// 서버 시작
app.listen(PORT, () => {
    console.log(Server is running on http://localhost:${PORT});
});

위 코드를 실행하려면 터미널에서 다음 명령어를 입력하세요.

node index.js

웹 브라우저에 http://localhost:3000을 입력하면 "Hello, World!" 메시지를 확인할 수 있습니다.

RESTful API 설계

RESTful API는 자원을 URI로 표현하고, HTTP 메서드를 통해 자원에 대한 행동을 정의합니다. 이번 예제에서는 간단한 Todo API를 만들어 보겠습니다.

Todo 데이터 구조

Todo 데이터는 다음과 같은 구조로 설정합니다.

let todos = [
    { id: 1, task: 'Learn Node.js', completed: false },
    { id: 2, task: 'Write Blog Post', completed: false }
];

CRUD 엔드포인트 만들기

이제 CRUD(Create, Read, Update, Delete) 기능을 구현할 수 있는 API 엔드포인트를 추가하겠습니다.

1. Todo 목록 조회 (GET)

app.get('/todos', (req, res) => {
    res.json(todos);
});

2. Todo 추가 (POST)

app.post('/todos', (req, res) => {
    const { task } = req.body;
    const newTodo = {
        id: todos.length + 1,
        task,
        completed: false
    };
    todos.push(newTodo);
    res.status(201).json(newTodo);
});

3. Todo 수정 (PUT)

app.put('/todos/:id', (req, res) => {
    const { id } = req.params;
    const { task, completed } = req.body;

    const todo = todos.find(t => t.id = parseInt(id));
    if (!todo) return res.status(404).send('Todo not found.');

    todo.task = task ! undefined ? task : todo.task;
    todo.completed = completed !== undefined ? completed : todo.completed;

    res.json(todo);
});

4. Todo 삭제 (DELETE)

app.delete('/todos/:id', (req, res) => {
    const { id } = req.params;
    todos = todos.filter(t => t.id !== parseInt(id));
    res.status(204).send();
});

이제 이 모든 코드를 index.js에 추가하면 Todo API가 완성됩니다.

전체 코드

최종적으로, index.js 파일의 전체 코드는 다음과 같습니다.

const express = require('express');
const app = express();
const PORT = 3000;

let todos = [
    { id: 1, task: 'Learn Node.js', completed: false },
    { id: 2, task: 'Write Blog Post', completed: false }
];

app.use(express.json());

app.get('/', (req, res) => {
    res.send('Hello, World!');
});

app.get('/todos', (req, res) => {
    res.json(todos);
});

app.post('/todos', (req, res) => {
    const { task } = req.body;
    const newTodo = {
        id: todos.length + 1,
        task,
        completed: false
    };
    todos.push(newTodo);
    res.status(201).json(newTodo);
});

app.put('/todos/:id', (req, res) => {
    const { id } = req.params;
    const { task, completed } = req.body;

    const todo = todos.find(t => t.id = parseInt(id));
    if (!todo) return res.status(404).send('Todo not found.');

    todo.task = task ! undefined ? task : todo.task;
    todo.completed = completed ! undefined ? completed : todo.completed;

    res.json(todo);
});

app.delete('/todos/:id', (req, res) => {
    const { id } = req.params;
    todos = todos.filter(t => t.id ! parseInt(id));
    res.status(204).send();
});

app.listen(PORT, () => {
    console.log(Server is running on http://localhost:${PORT});
});

마무리

이번 포스팅에서는 Node.js와 Express를 사용해 간단한 RESTful API를 구축하는 방법에 대해 알아보았습니다. CRUD 기능을 구현하여 Todo 목록을 관리하는 API를 작성해 보았는데요, 이를 통해 RESTful API 설계의 기본적인 원리를 이해할 수 있었기를 바랍니다. 앞으로 더 많은 기능을 추가하거나 다른 데이터베이스와 통합해보는 것도 좋은 연습이 될 것입니다.