Express 개발 강좌, CRUD(Create, Read, Update, Delete) API 구현하기

본 강좌에서는 Node.js의 웹 프레임워크인 Express를 사용하여 기본적인 CRUD API를 구현하는 방법을 심도 있게 알아보겠습니다. CRUD는 데이터베이스에서 데이터를 생성(Create), 읽기(Read), 업데이트(Update), 삭제(Delete)하는 기본적인 작업으로, 대부분의 웹 어플리케이션에서 자주 사용됩니다.

1. 환경 설정

CRUD API를 구현하기 위해 먼저 Node.js와 Express를 설치해야 합니다. Node.js가 설치되어 있지 않은 경우 Node.js 공식 웹사이트에서 설치할 수 있습니다. Node.js를 설치한 후, Express를 프로젝트에 추가합니다.

bash
# 빈 폴더를 생성하고 이동
mkdir express-crud-api
cd express-crud-api

# npm 초기화
npm init -y

# Express 설치
npm install express

2. 프로젝트 구조

먼저 기본적인 프로젝트 구조를 설정합니다. 다음과 같은 파일과 폴더를 생성합니다:

  • express-crud-api/
    • server.js
    • package.json
    • routes/
      • userRoutes.js
    • models/
      • User.js

3. 서버 설정

이제 API 서버를 설정해 보겠습니다. server.js 파일을 열고 다음과 같이 작성합니다. 이 파일은 API 서버의 엔트리 포인트로 작동합니다.

javascript
const express = require('express');
const bodyParser = require('body-parser');
const userRoutes = require('./routes/userRoutes');

const app = express();
const PORT = process.env.PORT || 3000;

// Body-parser 미들웨어 설정
app.use(bodyParser.json());

// 유저 라우터 설정
app.use('/api/users', userRoutes);

// 서버 시작
app.listen(PORT, () => {
    console.log(`서버가 http://localhost:${PORT} 에서 실행 중입니다.`);
});

4. 데이터 모델링

기본적으로 우리는 사용자의 정보를 저장할 것이므로, 사용자 모델을 설정해야 합니다. MongoDB를 사용할 것을 가정하고 Mongoose를 설치하여 모델을 설정합니다.

bash
# Mongoose 설치
npm install mongoose

다음으로 models/User.js를 생성하고 아래와 같이 작성합니다.

javascript
const mongoose = require('mongoose');

// Mongoose 스키마 설정
const userSchema = new mongoose.Schema({
    name: {
        type: String,
        required: true
    },
    email: {
        type: String,
        required: true,
        unique: true
    },
    age: {
        type: Number,
        required: true
    }
});

// 모델 생성
const User = mongoose.model('User', userSchema);

module.exports = User;

5. API 라우팅

이제 사용자에 대한 CRUD 작업을 처리하는 API 경로를 설정합니다. routes/userRoutes.js를 생성하고 다음과 같이 작성합니다.

javascript
const express = require('express');
const router = express.Router();
const User = require('../models/User');

// 사용자 생성 (Create)
router.post('/', async (req, res) => {
    const user = new User(req.body);
    try {
        const savedUser = await user.save();
        res.status(201).json(savedUser);
    } catch (error) {
        res.status(400).json({ message: error.message });
    }
});

// 사용자 목록 조회 (Read)
router.get('/', async (req, res) => {
    try {
        const users = await User.find();
        res.json(users);
    } catch (error) {
        res.status(500).json({ message: error.message });
    }
});

// 사용자 정보 조회 (Read)
router.get('/:id', async (req, res) => {
    try {
        const user = await User.findById(req.params.id);
        if (!user) return res.status(404).json({ message: '유저를 찾을 수 없습니다.' });
        res.json(user);
    } catch (error) {
        res.status(500).json({ message: error.message });
    }
});

// 사용자 정보 수정 (Update)
router.put('/:id', async (req, res) => {
    try {
        const updatedUser = await User.findByIdAndUpdate(req.params.id, req.body, { new: true });
        if (!updatedUser) return res.status(404).json({ message: '유저를 찾을 수 없습니다.' });
        res.json(updatedUser);
    } catch (error) {
        res.status(400).json({ message: error.message });
    }
});

// 사용자 삭제 (Delete)
router.delete('/:id', async (req, res) => {
    try {
        const deletedUser = await User.findByIdAndDelete(req.params.id);
        if (!deletedUser) return res.status(404).json({ message: '유저를 찾을 수 없습니다.' });
        res.json({ message: '유저가 삭제되었습니다.' });
    } catch (error) {
        res.status(500).json({ message: error.message });
    }
});

module.exports = router;

6. MongoDB 연결 설정

MongoDB와의 연결을 설정해야 합니다. server.js 파일에 연결 코드를 추가합니다.

javascript
const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost:27017/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true })
    .then(() => console.log('MongoDB에 연결되었습니다.'))
    .catch(err => console.error('MongoDB 연결 오류:', err));

7. API 테스트

서버 및 MongoDB 연결이 제대로 되었으면, Postman과 같은 API 클라이언트를 사용하여 API를 테스트할 수 있습니다. 예를 들어:

  • 사용자 생성 (POST): POST http://localhost:3000/api/users에 JSON 형식의 사용자 데이터를 전송합니다.
  • 사용자 목록 조회 (GET): GET http://localhost:3000/api/users를 통해 모든 사용자 정보를 조회합니다.
  • 특정 사용자 조회 (GET): GET http://localhost:3000/api/users/{id}를 통해 특정 사용자의 정보를 조회합니다.
  • 사용자 수정 (PUT): PUT http://localhost:3000/api/users/{id}에 수정할 데이터와 함께 요청합니다.
  • 사용자 삭제 (DELETE): DELETE http://localhost:3000/api/users/{id}를 통해 특정 사용자를 삭제합니다.

8. 결론

이번 강좌를 통해 Express를 사용하여 기본적인 CRUD API를 구현하는 방법을 알아보았습니다. 더 나아가, 데이터베이스와의 연결, API 테스트를 위한 클라이언트 사용법까지 살펴보았습니다. 이 기본적인 구조를 바탕으로 여러분만의 웹 어플리케이션을 구축해 나가시길 바랍니다.

추가적으로, 인증 및 인가 기능을 추가하거나, 테스트 프레임워크를 도입하는 등의 작업을 통해 더욱 발전된 API를 구현할 수 있습니다. 계속해서 학습하고 실습하여 더 나은 백엔드 개발자가 되어 보세요!

Express 개발 강좌, 웹소켓을 활용한 실시간 애플리케이션 예제

웹 개발의 발전에 따라 사용자는 점점 더 실시간으로 상호작용하는 웹 애플리케이션을 기대하게 되었습니다. 이러한 요구를 충족시키기 위해 웹소켓(WebSocket) 프로토콜은 필수적인 요소로 자리잡았습니다. 이 글에서는 Node.js의 Express 프레임워크와 웹소켓을 사용하여 실시간 애플리케이션을 만드는 방법에 대해 자세히 알아보겠습니다.

웹소켓이란?

웹소켓은 클라이언트와 서버 간의 전이중(Full-Duplex) 통신을 가능하게 하는 프로토콜입니다. 이는 HTTP 요청/응답 모델에 비해 효율적이며, 특히 실시간 데이터 전송이 필요한 애플리케이션에서 유용합니다. 웹소켓을 사용하면 클라이언트와 서버 간의 연결이 지속적으로 유지되며, 데이터가 필요할 때마다 연결을 설정할 필요가 없습니다.

웹소켓의 주요 특징

  • 전이중 통신 지원: 클라이언트와 서버가 동시에 데이터를 전송할 수 있습니다.
  • 낮은 레이턴시: 빠른 데이터 전송이 가능하여 실시간 애플리케이션에 적합합니다.
  • 효율적인 리소스 사용: HTTP 프로토콜에 비해 적은 리소스를 사용합니다.

Express와 웹소켓으로 실시간 애플리케이션 만들기

이제 Express와 ws 라이브러리를 사용하여 간단한 실시간 애플리케이션을 만들어 보겠습니다. 이번 예제에서는 사용자가 입력한 메시지를 실시간으로 다른 사용자에게 전송하는 채팅 애플리케이션을 개발할 것입니다.

1. 프로젝트 설정하기

bash
mkdir websocket-chat
cd websocket-chat
npm init -y
npm install express ws

2. 서버 코드 작성하기

디렉토리 내에 server.js 파일을 생성하고 다음 코드를 입력합니다:

javascript
const express = require('express');
const http = require('http');
const WebSocket = require('ws');
const path = require('path');

const app = express();
const server = http.createServer(app);
const wss = new WebSocket.Server({ server });

// 정적 파일 제공
app.use(express.static(path.join(__dirname, 'public')));

// 클라이언트 연결 이벤트
wss.on('connection', (ws) => {
    console.log('새로운 클라이언트가 연결되었습니다.');

    // 클라이언트로부터 메시지를 받을 때
    ws.on('message', (message) => {
        console.log(`받은 메시지: ${message}`);
        
        // 모든 클라이언트에게 메시지 전송
        wss.clients.forEach((client) => {
            if (client.readyState === WebSocket.OPEN) {
                client.send(message);
            }
        });
    });

    // 클라이언트 연결 종료 이벤트
    ws.on('close', () => {
        console.log('클라이언트가 연결을 종료했습니다.');
    });
});

// 서버 포트 설정
const PORT = process.env.PORT || 3000;
server.listen(PORT, () => {
    console.log(`서버가 http://localhost:${PORT} 에서 실행 중입니다.`);
});

3. 클라이언트 코드 작성하기

이제 public 디렉토리를 생성하고 그 안에 index.html 파일을 추가합니다. 다음과 같은 코드로 클라이언트를 작성합니다:

html




    
    
    웹소켓 채팅
    


    

웹소켓 채팅 애플리케이션

    4. 애플리케이션 실행하기

    이제 서버를 실행해 보겠습니다. 터미널에 다음 명령어를 입력하여 서버를 시작합니다:

    bash
    node server.js
    

    서버가 성공적으로 실행되면 브라우저에서 http://localhost:3000로 이동해보세요. 여러 개의 브라우저 탭을 열고 메시지를 입력하면 실시간으로 서로의 메시지를 확인할 수 있습니다.

    코드 분석

    서버 코드 분석

    서버 코드는 Express 서버를 설정하고, 웹소켓 서버를 구성하여 메시지를 처리하는 부분이 포함되어 있습니다. 주요 기능은 다음과 같습니다:

    • Express와 WS 설치: Express는 HTTP 서버를 구성하고, WebSocket은 실시간 통신을 지원합니다.
    • 정적 파일 제공: app.use(express.static(...))를 사용하여 public 폴더의 정적 파일을 제공합니다.
    • 클라이언트 연결 이벤트: 웹소켓 서버에 새로운 클라이언트가 연결되면 connection 이벤트가 발생합니다.
    • 메시지 처리: 클라이언트로부터 메시지를 받으면, 이를 다른 모든 클라이언트에게 전송합니다.

    클라이언트 코드 분석

    클라이언트 코드에서는 웹소켓 서버에 연결하고, 사용자 입력을 처리하여 서버로 메시지를 전송하는 기능을 구현합니다. 주요 부분은 다음과 같습니다:

    • 웹소켓 연결: new WebSocket('ws://localhost:3000');를 통해 서버에 연결합니다.
    • 서버로부터 메시지 수신: socket.addEventListener(...)로 서버에서 수신한 메시지를 처리합니다.
    • 사용자 입력 전송: 사용자 입력이 있을 때마다 서버로 메시지를 전송합니다.

    추가 기능 및 확장

    이번 예제에서는 간단한 채팅 기능만을 구현하였습니다. 하지만 여기서 더 나아가 다양한 기능을 추가할 수 있습니다:

    • 사용자 인증: 사용자 ID나 닉네임을 통해 각 사용자를 식별할 수 있습니다.
    • 메시지 저장: Redis나 MongoDB와 같은 데이터베이스를 사용하여 메시지를 저장하고, 사용자가 재접속했을 때 이전 메시지를 불러오는 기능을 구현할 수 있습니다.
    • 더 복잡한 UI: React, Vue.js 또는 Angular와 같은 프론트엔드 프레임워크를 사용하여 더 직관적인 사용자 인터페이스를 만들 수 있습니다.

    결론

    이번 강좌에서는 Express와 웹소켓을 사용하여 간단한 채팅 애플리케이션을 구현했습니다. 웹소켓을 통해 실시간으로 데이터를 주고받을 수 있는 가능성을 확인할 수 있었습니다. 이를 기반으로 다양한 실시간 애플리케이션을 개발할 수 있으니, 여러분도 자신의 아이디어를 구현해 보세요!

    Express 개발 강좌, 배포 후 모니터링 및 유지보수 전략

    Express.js는 Node.js 환경에서 웹 애플리케이션을 구축하기 위한 경량 프레임워크입니다. 이 강좌에서는 Express 서버를 배포한 후, 필요한 모니터링 및 유지보수 전략을 소개할 것입니다. 애플리케이션의 가용성을 높이고, 성능 트렌드를 추적하며, 이슈를 조기에 발견하기 위한 다양한 방법을 모색해보겠습니다. 가장 먼저, 애플리케이션을 성공적으로 배포한 후 어떤 요소들이 필요한지 살펴보겠습니다.

    1. 배포 후 고려 사항

    배포 후 애플리케이션의 안정성을 보장하기 위해서는 다음과 같은 요소들을 고려해야 합니다:

    • 서버 상태 모니터링
    • 애플리케이션 성능 모니터링
    • 로그 관리
    • 사용자 피드백 수집
    • 정기적인 업데이트 및 보안 패치

    2. 서버 상태 모니터링

    서버 상태 모니터링은 리소스 사용량(메모리, CPU, 디스크 I/O 등)을 확인하여 서버가 최적의 상태에서 작동하도록 관리하는 과정입니다. PM2와 같은 프로세스 관리 도구를 사용하면 Express 애플리케이션을 쉽게 모니터링하고 관리할 수 있습니다.

    PM2 설치

    npm install pm2 -g

    PM2로 Express 애플리케이션 실행

    pm2 start app.js

    PM2는 애플리케이션의 실행 상태를 모니터링하고, 충돌이 발생했을 경우 자동으로 재시작하는 기능을 제공합니다. 아래 명령어를 통해 애플리케이션의 상태를 모니터링할 수 있습니다.

    pm2 status

    3. 애플리케이션 성능 모니터링

    애플리케이션의 성능을 모니터링하여 사용자 경험을 향상시키기 위해 New Relic, Datadog와 같은 모니터링 도구를 사용할 수 있습니다. 이러한 도구들은 애플리케이션의 응답 시간, 처리량 및 오류 비율 등을 시각적으로 표시하여 성능을 분석하는 데 도움을 줍니다.

    New Relic 설치 및 설정

    npm install newrelic --save

    설치 후, newrelic.js 파일을 생성하고 API 키와 애플리케이션 이름을 설정합니다. 코드의 맨 상단에 다음과 같이 추가합니다:

    require('newrelic');

    4. 로그 관리

    정확한 로그 분석은 문제 해결의 첫 단계입니다. winston 또는 morgan과 같은 로깅 라이브러리를 사용하면 Express 애플리케이션의 로그를 쉽게 관리할 수 있습니다.

    winston 설치

    npm install winston --save

    winston을 사용한 로깅 설정

    
    const winston = require('winston');
    
    const logger = winston.createLogger({
        level: 'info',
        format: winston.format.json(),
        transports: [
            new winston.transports.File({ filename: 'error.log', level: 'error' }),
            new winston.transports.File({ filename: 'combined.log' }),
        ],
    });
    
    module.exports = logger;
    

    5. 사용자 피드백 수집

    사용자 피드백은 애플리케이션 개선에 중요한 역할을 합니다. 설문 조사를 통해 사용자 경험을 평가하거나, 사용자의 행동을 추적하여 통계적으로 피드백을 분석할 수 있습니다.

    Survicate 또는 Google Forms 활용

    설문 조사를 통해 정기적으로 사용자 경험을 평가하고 피드백을 수집합니다. 이를 통해 사용자 요구에 맞는 기능을 추가하거나 문제를 해결할 수 있습니다.

    6. 정기적인 업데이트 및 보안 패치

    정기적으로 애플리케이션의 종속성을 업데이트하고 보안 패치를 적용해야 합니다. npm audit 명령어는 애플리케이션에 포함된 패키지의 보안 취약점을 분석하여 제안 사항을 제공합니다.

    npm audit

    결론

    Express 애플리케이션을 성공적으로 배포한 후, 효과적인 모니터링과 유지보수 전략을 통해 애플리케이션의 안정성을 확보하고 지속적으로 개선해 나가야 합니다. 본 강좌에서 소개한 다양한 도구와 기법을 통해 귀하의 서버와 애플리케이션을 최적화하십시오. 이상으로 Express 개발 강좌를 마칩니다. 독자 여러분의 개발 여정에 성공과 행복이 가득하길 바랍니다!

    Express 개발 강좌, 권한 관리 및 사용자 역할 정의

    Express.js는 Node.js를 위한 웹 프레임워크로, 사용자가 클라이언트 요청에 대해 쉽게 서버 응답을 처리할 수 있도록 만들어졌습니다. 이번 강좌에서는 Express 애플리케이션에서 권한 관리 및 사용자 역할 정의에 대해 상세히 설명하고, 실제 예제 코드를 통해 구현하는 방법을 알아보겠습니다.

    1. 권한 관리의 중요성

    권한 관리란 특정 리소스나 기능에 대한 접근을 제공하거나 제한하는 과정을 의미합니다. 권한 관리는 특히 다음과 같은 이유로 중요합니다:

    • 보안 강화: 적절한 권한 관리를 통해 데이터 유출이나 시스템 침해를 예방합니다.
    • 유연한 사용자 경험: 각 사용자나 그룹에 맞춤화된 경험을 제공하여 사용자의 만족도를 높입니다.
    • 법적 요구 사항 준수: 많은 산업에서 규정된 보안 기준을 충족하기 위한 요구사항이 있습니다.

    2. 사용자 역할 정의

    사용자 역할은 시스템 내에서 사용자가 가질 수 있는 특정 권한의 집합을 의미합니다. Roles은 일반적으로 다음과 같은 형태로 정의될 수 있습니다:

    
    const roles = {
        ADMIN: 'admin',
        USER: 'user',
        GUEST: 'guest',
    };
    
    

    3. Express.js에서 권한 관리 설정하기

    Express.js에서 권한 관리를 설정하기 위해서는 다음단계가 필요합니다:

    1. 사용자 인증(authenticaion) 모듈 설정
    2. 역할 기반 접근 제어(Role Based Access Control, RBAC) 구현
    3. 미들웨어 개발

    3.1 사용자 인증 모듈 설정

    사용자를 인증하기 위해 passport.js와 같은 인증 라이브러리를 사용할 수 있습니다. 다음은 간단한 사용자 인증 예제입니다:

    
    const express = require('express');
    const passport = require('passport');
    const session = require('express-session');
    const bodyParser = require('body-parser');
    const LocalStrategy = require('passport-local').Strategy;
    
    const app = express();
    app.use(bodyParser.urlencoded({ extended: false }));
    app.use(session({ secret: 'your_secret_key', resave: false, saveUninitialized: false }));
    app.use(passport.initialize());
    app.use(passport.session());
    
    const users = [{ id: 1, username: 'admin', password: 'admin', role: 'admin' }];
    
    passport.use(new LocalStrategy((username, password, done) => {
        const user = users.find(u => u.username === username && u.password === password);
        if (user) {
            return done(null, user);
        } else {
            return done(null, false, { message: 'Incorrect credentials.' });
        }
    }));
    
    passport.serializeUser((user, done) => {
        done(null, user.id);
    });
    
    passport.deserializeUser((id, done) => {
        const user = users.find(u => u.id === id);
        done(null, user);
    });
    
    app.post('/login', passport.authenticate('local', {
        successRedirect: '/dashboard',
        failureRedirect: '/login'
    }));
    
    

    3.2 역할 기반 접근 제어(RBAC)

    RBAC는 사용자의 역할에 따라 접근 권한을 관리하는 기법입니다. 각 사용자는 특정 역할을 부여받고, 이는 사용자의 가능한 행동을 제한합니다. 다음은 역할 기반 접근 제어 미들웨어의 예입니다:

    
    const roleAuthorization = (role) => {
        return (req, res, next) => {
            if (req.isAuthenticated() && req.user.role === role) {
                return next();
            } else {
                return res.status(403).json({ message: 'Forbidden' });
            }
        };
    };
    
    app.get('/admin', roleAuthorization('admin'), (req, res) => {
        res.send('Welcome Admin');
    });
    
    app.get('/user', roleAuthorization('user'), (req, res) => {
        res.send('Welcome User');
    });
    
    

    3.3 미들웨어 개발

    미들웨어는 Express.js의 중요한 구성 요소로, 요청과 응답 객체를 수정하거나 요청 흐름을 제어할 수 있습니다. 권한 관리 미들웨어를 구현하는 예는 다음과 같습니다:

    
    const authMiddleware = (req, res, next) => {
        if (req.isAuthenticated()) {
            return next(); // 인증에 성공하면 다음 미들웨어로 이동
        } else {
            return res.redirect('/login'); // 인증에 실패하면 로그인 페이지로 이동
        }
    };
    
    app.get('/dashboard', authMiddleware, (req, res) => {
        res.send('User Dashboard');
    });
    
    

    4. 사용자 정의 역할 확장하기

    기본적인 역할 외에도 사용자의 역할을 추가하거나 변경할 수 있습니다. 예를 들어, 특정 기능에 대한 액세스 권한을 가진 editor 역할을 추가할 수 있습니다:

    
    const roles = {
        ADMIN: 'admin',
        USER: 'user',
        GUEST: 'guest',
        EDITOR: 'editor',
    };
    
    // 역할 기준 기능 추가
    app.get('/edit-content', roleAuthorization('editor'), (req, res) => {
        res.send('Edit Content Page');
    });
    
    

    5. 데이터베이스와 통합하기

    실제 애플리케이션에서는 사용자 및 역할 정보를 데이터베이스에 저장하는 것이 중요합니다. MongoDB와 mongoose를 사용하여 사용자 인증 및 역할을 관리할 수 있습니다:

    
    const mongoose = require('mongoose');
    
    mongoose.connect('mongodb://localhost/yourdb', {
        useNewUrlParser: true,
        useUnifiedTopology: true
    });
    
    const userSchema = new mongoose.Schema({
        username: String,
        password: String,
        role: String
    });
    
    const User = mongoose.model('User', userSchema);
    
    // 사용자를 데이터베이스에 저장하는 예
    app.post('/register', async (req, res) => {
        const { username, password, role } = req.body;
        const newUser = new User({ username, password, role });
        await newUser.save();
        res.send('User registered!');
    });
    
    

    6. 결론

    이번 강좌에서는 Express.js에서 권한 관리 및 사용자 역할 정의의 기초부터 DB와의 통합까지 다양하게 알아보았습니다. 권한 관리는 보안 및 운영 효율성을 위해 필수적이며, 역할 기반 접근 제어(RBAC)는 이를 위한 효과적인 방법입니다. 여러분의 Express 애플리케이션에서 이러한 기능들을 구현하여 더욱 안전하고 효율적인 시스템을 만들길 바랍니다.

    7. 참고 자료

    Express 개발 강좌, URL 파라미터 및 쿼리 파라미터 사용하기

    웹 애플리케이션을 개발할 때, 클라이언트가 서버에 데이터를 전달하는 방법은 매우 중요합니다. 특히 Express.js와 같은 Node.js 기반의 웹 프레임워크를 사용할 때, URL 파라미터와 쿼리 파라미터를 활용하는 방법을 이해하는 것은 필수적입니다. 이번 강좌에서는 URL 파라미터와 쿼리 파라미터의 개념과 함께 사용 방법을 자세히 알아보겠습니다.

    1. URL 파라미터란?

    URL 파라미터는 URL 경로의 일부로, 보통 리소스를 식별하는 데 사용됩니다. 예를 들어, 사용자의 프로필 정보를 조회하기 위한 URL이 /user/123라면, 123은 사용자 ID를 나타내는 URL 파라미터입니다.

    1.1 URL 파라미터의 사용 방법

    Express에서 URL 파라미터를 정의하는 방법은 매우 간단합니다. HTTP 요청 라우트에서 : 기호를 사용하여 URL 파라미터를 설정할 수 있습니다. 아래는 Express를 사용하여 URL 파라미터를 처리하는 간단한 예제입니다.

    const express = require('express');
    const app = express();
    const port = 3000;
    
    app.get('/user/:id', (req, res) => {
        const userId = req.params.id; // URL 파라미터 접근
        res.send(`User ID: ${userId}`);
    });
    
    app.listen(port, () => {
        console.log(`Server is running on http://localhost:${port}`);
    });

    위 예제에서 /user/:id 라우트는 사용자의 ID를 URL 경로에서 가져옵니다. 클라이언트가 /user/123에 GET 요청을 보내면, req.params.id를 통해 123이라는 값을 얻을 수 있습니다.

    2. 쿼리 파라미터란?

    쿼리 파라미터는 URL의 쿼리 스트링 부분에 포함된 파라미터입니다. 일반적으로 URL의 끝에 물음표(?) 다음에 “key=value” 형식으로 추가됩니다. 예를 들어, /search?keyword=express&page=1에서 keywordpage는 쿼리 파라미터입니다.

    2.1 쿼리 파라미터의 사용 방법

    Express에서는 쿼리 파라미터를 req.query 객체를 통해 쉽게 접근할 수 있습니다. 다음은 쿼리 파라미터를 처리하는 예제입니다.

    app.get('/search', (req, res) => {
        const keyword = req.query.keyword; // 쿼리 파라미터 접근
        const page = req.query.page || 1; // 기본값 설정
        res.send(`Searching for: ${keyword}, Page: ${page}`);
    });

    위 예제를 통해 /search?keyword=express&page=2에 GET 요청을 하면, req.query.keywordreq.query.page를 사용하여 각각 express2의 값을 얻을 수 있습니다.

    3. URL 파라미터와 쿼리 파라미터의 차이점

    • URL 파라미터: URL 경로의 일부로, 주로 리소스를 식별하는 데 사용됩니다.
    • 쿼리 파라미터: URL의 쿼리 스트링 부분에 포함되며, 추가적인 데이터나 옵션을 전달하는 데 사용됩니다.

    4. 복합적인 사용 사례

    실제 웹 애플리케이션에서는 URL 파라미터와 쿼리 파라미터를 함께 사용하는 경우가 많습니다. 예를 들어, 특정 사용자 ID에 대한 게시물 목록을 조회하는 API를 만들 수 있습니다.

    app.get('/user/:id/posts', (req, res) => {
        const userId = req.params.id;
        const page = req.query.page || 1; // 기본값 설정
        res.send(`Getting posts for user: ${userId}, Page: ${page}`);
    });

    위 코드는 특정 사용자(userId)의 게시물 목록을 쿼리 파라미터를 통해 페이지 넘버(page)와 함께 가져오는 예시입니다.

    5. 실습 프로젝트

    이제까지의 내용을 종합하여, 작은 실습 프로젝트를 만들어 보겠습니다. 이 프로젝트에서는 URL 파라미터와 쿼리 파라미터를 모두 사용하는 Express 애플리케이션을 구성해보겠습니다.

    const express = require('express');
    const app = express();
    const port = 3000;
    
    // 사용자 데이터
    const users = {
        1: { name: 'Alice' },
        2: { name: 'Bob' },
    };
    
    app.get('/user/:id', (req, res) => {
        const userId = req.params.id;
        const user = users[userId];
    
        if (user) {
            res.send(`User found: ${user.name}`);
        } else {
            res.status(404).send('User not found');
        }
    });
    
    app.get('/user/:id/posts', (req, res) => {
        const userId = req.params.id;
        const page = req.query.page || 1;
        res.send(`Getting posts for user ${userId} on page ${page}`);
    });
    
    app.listen(port, () => {
        console.log(`Server running at http://localhost:${port}`);
    });

    5.1 서버 실행 및 테스트

    서버를 실행한 후, 브라우저 또는 Postman과 같은 API 클라이언트를 사용하여 다음과 같이 테스트할 수 있습니다.

    • GET /user/1 -> 사용자 정보 조회
    • GET /user/3 -> 사용자 없음
    • GET /user/1/posts?page=2 -> 사용자 1의 게시물 조회 (2페이지)

    마무리

    이번 강좌에서는 Express.js를 사용하여 URL 파라미터와 쿼리 파라미터를 다루는 방법에 대해 자세히 살펴보았습니다. 이러한 개념은 웹 애플리케이션에서 데이터를 효과적으로 관리하고 사용자 요청에 응답하는 데 매우 유용합니다. 더 깊이 있는 이해를 위해 다양한 예제를 시도해보고, 자신만의 애플리케이션을 구축해보기를 권장합니다.

    감사합니다!