1. 라우트
라우트(Route)는 웹 애플리케이션에서 클라이언트가 요청한 URL 경로와 HTTP 메서드(GET, POST 등)에 따라 서버가 어떤 동작을 수행할지를 정의하는 규칙입니다. 즉, 사용자가 /login, /about 같은 특정 경로로 요청을 보냈을 때, 그 요청을 처리할 코드를 지정해주는 역할을 합니다. Express에서는 app.get(), app.post() 같은 메서드를 통해 라우트를 설정하며, 각 라우트에는 요청 정보를 처리하고 응답을 보내는 핸들러 함수가 연결됩니다. 라우팅은 웹 서버가 어떤 페이지나 데이터를 제공할지를 결정하는 핵심적인 구조입니다.
1. route 메서드
Express의 .route() 메서드는 동일한 URL 경로에 대해 여러 HTTP 메서드(GET, POST, PUT 등)를 체이닝 방식으로 한 번에 정의할 수 있게 해주는 기능입니다. 예를 들어 /user라는 경로에 대해 GET, POST, DELETE 요청을 따로따로 app.get, app.post 등으로 작성하지 않고, app.route('/user')로 묶어서 관리하면 코드가 더 간결하고 구조화되어 유지보수에 유리합니다.
app.route('/경로')
.get((req, res) => {
// GET 요청 처리
})
.post((req, res) => {
// POST 요청 처리
})
.put((req, res) => {
// PUT 요청 처리
});
import express from 'express'
const app = express()
app.route('/posts')
.get((req, res) => {
res.status(200).send('/posts GET 호출')
})
.post((req, res) => {
res.status(201).send('/posts POST 호출')
})
.put((req, res) => {
res.status(201).send('/posts PUT 호출')
})
.delete((req, res) => {
res.status(200).send('/posts DELETE 호출')
})
app.listen(3000)
2. route 활용
📁 폴더 구조
routing-demo/
├── routing.js
├── routes/
│ ├── user.js
│ └── post.js
routing.js
import express from 'express'
import userRouter from './routes/user.js'
import postRouter from './routes/post.js'
const app = express()
app.use(express.json())
// http://localhost:3000/users
app.use('/users', userRouter)
// http://localhost:3000/posts
app.use('/posts', postRouter)
app.listen(3000)
routes/user.js
import express from 'express'
const router = express.Router()
router.use((req, res, next) => {
console.log('users에 존재하는 미들웨어')
next()
})
// http://localhost:3000/users (GET)
// 회원정보 보기
router.get('/', (req, res) => {
res.status(200).send('GET: /users 회원정보보기')
})
// http://localhost:3000/users (POST)
// 회원가입
router.post('/', (req, res) => {
res.status(201).send('POST: /users 회원가입')
})
// http://localhost:3000/users (PUT)
// 정보수정
router.put('/:id', (req, res) => {
res.status(201).send('PUT: /users/:id 정보수정')
})
// http://localhost:3000/users (DELETE)
// 회원탈퇴
router.delete('/:id', (req, res) => {
res.status(201).send('DELETE: /users/:id 회원탈퇴')
})
export default router
routes/post.js
import express from 'express'
const router = express.Router()
router.use((req, res, next) => {
console.log('posts에 존재하는 미들웨어')
next()
})
// http://localhost:3000/posts (GET)
// 글 보기
router.get('/', (req, res) => {
res.status(200).send('GET: /posts 글 보기')
})
// http://localhost:3000/posts (POST)
// 글 작성하기
router.post('/', (req, res) => {
res.status(201).send('POST: /posts 글 작성하기')
})
// http://localhost:3000/posts (PUT)
// 글 수정하기
router.put('/:id', (req, res) => {
res.status(201).send('PUT: /posts/:id 글 수정하기')
})
// http://localhost:3000/posts (DELETE)
// 글 삭제하기
router.delete('/:id', (req, res) => {
res.status(201).send('DELETE: /users/:id 글 삭제하기')
})
export default router
2. Swagger
Swagger는 RESTful API를 문서화하고 시각적으로 테스트할 수 있도록 도와주는 오픈소스 도구 모음입니다. 개발자가 API의 구조와 사용 방법을 명확히 정의할 수 있도록 해주며, 작성한 API 문서를 웹 브라우저에서 Swagger UI를 통해 쉽게 확인하고 직접 테스트할 수 있습니다. Swagger는 OpenAPI 스펙(OpenAPI Specification)을 기반으로 하며, 이를 통해 API의 경로, 메서드, 요청/응답 형식 등을 표준화된 형식으로 기술할 수 있어 API의 설계, 구현, 테스트, 협업에 매우 유용하게 활용됩니다.
npm install express swagger-jsdoc swagger-ui-express
📁 폴더 구조
swagger-demo/
├── app.js
├── swagger.js
├── routes/
│ └── posts.js
swagger.js
const swaggerJSDoc = require('swagger-jsdoc');
const options = {
definition: {
openapi: '3.0.0',
info: {
title: '게시판 API',
version: '1.0.0',
description: '게시글 관련 REST API 문서입니다.',
},
servers: [
{
url: 'http://localhost:3000',
},
],
},
apis: ['./routes/*.js'], // 주석으로부터 API 문서 생성
};
const swaggerSpec = swaggerJSDoc(options);
module.exports = swaggerSpec;
routes/posts.js
const express = require('express');
const router = express.Router();
/**
* @swagger
* /posts:
* get:
* summary: 모든 게시글 조회
* responses:
* 200:
* description: 게시글 목록 성공 응답
* post:
* summary: 새 게시글 생성
* requestBody:
* required: true
* content:
* application/json:
* schema:
* type: object
* properties:
* title:
* type: string
* content:
* type: string
* responses:
* 201:
* description: 생성 성공
*/
router.get('/', (req, res) => {
res.send('모든 게시글 조회');
});
router.post('/', (req, res) => {
res.status(201).send('게시글이 생성되었습니다');
});
module.exports = router;
app.js
const express = require('express');
const app = express();
const port = 3000;
const swaggerUi = require('swagger-ui-express');
const swaggerSpec = require('./swagger');
const postRoutes = require('./routes/posts');
app.use(express.json());
// Swagger UI 라우트 등록
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec));
// 실제 API 라우트
app.use('/posts', postRoutes);
app.listen(port, () => {
console.log(`서버 실행 중: http://localhost:${port}`);
console.log(`Swagger 문서 보기: http://localhost:${port}/api-docs`);
});