백엔드/Node.js

라우트

Ryuzy 2025. 4. 23. 00:24
728x90
반응형

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`);
});

 

728x90
반응형

'백엔드 > Node.js' 카테고리의 다른 글

JSON Web Token  (0) 2025.04.26
Express  (0) 2025.04.22
EJS  (0) 2025.04.22
http 모듈  (0) 2025.04.22
파일 입출력  (0) 2025.04.22