Dandy Now!
  • [개발자의품격][부트캠프][1기][31차시] Node.js #5 | route(정규 표현식, Module, Alias) | nodemon
    2022년 04월 08일 17시 22분 27초에 업로드 된 글입니다.
    작성자: DandyNow
    728x90
    반응형

    | route

    정규 표현식 사용

    정규 표현식을 이용할 수 있다. 경로 우선순위는 위에서 아래이다. 실무에서는 이 우선순위를 이용해 설계하기도 한다.

    // 12_route.js
    const express = require("express");
    const app = express();
    
    app.listen(3000, () => {
      console.log("서버가 포트 3000번으로 시작되었습니다.");
    });
    
    // ? 0개 혹은 1개, /abcd, /acd
    app.get("/ab?cd", (req, res) => {
      res.send("ab?cd");
    });
    
    // b가 1개 이상
    app.get("/ab+cd", (req, res) => {
      res.send("ab+cd");
    });
    
    // b와 C 사이에 아무 것도 없거나 하나 이상의 문자                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
    app.get("/ab*cd", (req, res) => {
      res.send("ab*cd");
    });
    
    // a가 포함된 모든 경우
    app.get(/a/, (req, res) => {
      res.send("/a/");
    });
    
    // insert 문자로 시작
    app.get(/^insert/, (req, res) => {
      res.send("/a/");
    });

     

    Module

    실무에서는 route를 모듈화 하여 사용한다.

    // routes/product.js
    const express = require("express");
    const router = express.Router();
    const mysql = require("../mysql");
    
    router.get("/category", async (req, res) => {
      const categoryList = await mysql.query("categoryList");
      res.send(categoryList);
    });
    
    router.get("/category/:product_category_id", async (req, res) => {
      const { product_category_id } = req.params;
      const categoryList = await mysql.query("categoryDetail", product_category_id);
      res.send(categoryList);
    });
    
    router.post("/category", async (req, res) => {
      const result = await mysql.query("categoryInsert", req.body.param);
      res.send(result);
    });
    
    router.put("/category/:product_category_id", async (req, res) => {
      const { product_category_id } = req.params;
      const result = await mysql.query("categoryUpdate", [
        req.body.param,
        product_category_id,
      ]);
      res.send(result);
    });
    
    module.exports = router; // 모듈로 사용될 것이므로

     

    // 13_route_module.js
    const express = require("express");
    require("dotenv").config({ path: `mysql/.env.test` }); // 환경변수 정보를 모듈 보다 먼저 넣어 줘야 한다.
    const productRoute = require("./routes/product");
    const app = express();
    
    app.use(
      express.json({
        limit: "50mb", // 최대 50메가
      })
    ); // 클라이언트 요청 body를 json으로 파싱 처리
    
    app.listen(3000, () => {
      console.log("서버가 포트 3000번으로 시작되었습니다.");
    });
    
    app.use("/api/product", productRoute); // routes/product.js 모듈의 경로에 붙어 /api/product/category로 만든다.

     

    Alias

    규모가 작은 프로젝트의 경우 alias 파라미터를 받도록 하면 하나의 get 함수로 모든 get 라우터 처리가 가능하다.

    // 14_route_alias.js
    const express = require("express");
    const app = express();
    console.log(app.get("env"));
    
    require("dotenv").config({ path: `mysql/.env.test` }); // 반드시 "const mysql = require("./mysql");" 코드 위에 작성해야 한다.
    // console.log(process.env);
    const mysql = require("./mysql");
    
    app.use(
      express.json({
        limit: "50mb", // 최대 50메가
      })
    ); // 클라이언트 요청 body를 json으로 파싱 처리
    
    app.listen(3000, () => {
      console.log("서버가 포트 3000번으로 시작되었습니다.");
    });
    
    // alias 파라미터를 받도록 함
    app.get("/api/:alias", async (req, res) => {
      const categoryList = await mysql.query(req.params.alias);
      res.send(categoryList);
    });

     

    실무에서는 get, post, put, delete를 post로 처리하기도 한다. 아래와 같이 코드를 작성하고 sql.js에 필요한 쿼리를 추가하여 사용하는 방법이다. 하지만 유지보수와 가독성 등을 고려하여 서버단에서 API 코드를 작성하는 것이 좋을 수 있다.

    // 14_route_alias.js
    ...
    app.post("/api/:alias", async (req, res) => {
      const categoryList = await mysql.query(req.params.alias, req.bogy.param);
      res.send(categoryList);
    });

     


     

    | nodemon

    개발할 때 코드의 변경 발생 시 node의 재실행 없이 변경이 적용되도록 한다. 개발 시 유용하며 운영 시에는 사용할 수 없다.

    npm install -g nodemon

     

    [그림 1] nodemon 실행, mysql 폴더의 변경을 감시한다.

     

    // mysql/sql.js
    module.exports = {
      ...
      // categoryDetail 커리를 추가하였다.
      categoryDetail: `select * from product_category where product_category_id=?`,
      ...
    };

     

    [그림 2] mysql폴더 내 sql.js 파일의 변경 발생시 자동으로 재시작하는 nodemon

     

    728x90
    반응형
    댓글