AIHYEONJI 2025. 4. 27. 12:30

1. Route

: 웹 애플리케이션에서 클라이언트가 요청한 URL 경로와 HTTP 메서드(GET, POST 등)에 따라 서버가 어떤 동작을 수행할지를 정의하는 규칙입니다. 즉, 사용자가 /login, /about 같은 특정 경로로 요청을 보냈을 때, 그 요청을 처리할 코드를 지정해주는 역할이다.

웹 애플리케이션에서 클라이언트가 요청한 URL 경로와 HTTP 메서드(GET, POST 등)에 따라 서버가 어떤 동작을 수행할지를 정의하는 규칙이다. 즉, 사용자가 /login, /about 같은 특정 경로로 요청을 보냈을 때, 그 요청을 처리할 코드를 지정해주는 역할을 한다.

 

1.1 route method

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("/post POST 호출");
  })
  .put((req, res) => {
    res.status(201).send("/post PUT 호출");
  })
  .delete((req, res) => {
    res.status(204).send("/post DELETE 호출");
  });

app.listen(3001, () => {
  console.log("서버 실행 중");
});

 

 

1.2 route 활용

 

* routing.js

import express from "express";
import userRouter from "./routes/user.mjs";
import userPost from "./routes/post.mjs";

const app = express();
app.use(express.json());

app.use("/users", userRouter);
app.use("/post", userPost);

app.listen(3001, () => {
  console.log("서버 실행 중");
});

 

* route/user.js

import express from "express";

const router = express.Router();

router.use((req, res, next) => {
  console.log("user에 존재하는 미들웨어");
  next();
});

//  /users/
router.get("/", (req, res) => {
    res.status(200).send("GET: /users 회원정보보기");
});
router.post("/", (req, res) => {
  res.status(201).send("POST /users 회원가입");
});
router.put("/:id", (req, res) => {
  res.status(201).send("PUT /users:id 정보수정");
});
router.delete("/:id", (req, res) => {
  res.status(201).send("DELETE /users:id 회원탈퇴");
});

export default router;

 

* route/ post.js

import express from "express";

const router = express.Router();

router.use((req, res, next) => {
  console.log("post에 존재하는 미들웨어");
  next();
});

//  /users/
router.get("/", (req, res) => {
    res.status(200).send("GET: /post 글보기");
});
router.post("/", (req, res) => {
  res.status(201).send("POST /post 글 작성하기");
});
router.put("/:id", (req, res) => {
  res.status(201).send("PUT /post:id 글 수정하기");
});
router.delete("/:id", (req, res) => {
  res.status(201).send("DELETE /post:id 글 삭제하기");
});

export default router;

 

 

2. Swagger

: 스웨거는 RESTfulAPI 를 문서화하고 시각적으로 테스트할 수 있도록 도와주는 오픈소스 도구 모음이다.  작성한 API 문서를 웹 브라우저에서 Swageer UI를 통해 쉽게 확인하고 직접 테스트 할 수 있다. 

 

* 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:3001',
      },
    ],
  },
  apis: ['./routes/*.js'], // 주석으로부터 API 문서 생성
};

const swaggerSpec = swaggerJSDoc(options);
module.exports = swaggerSpec;

 

* route / 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 = 3001;

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