app


싱글톤 패턴 적용 전 app.ts 파일

import * as express from "express";
import { Cat, CatType } from "./app.model";
import catRouter from "./cats/cats.route";
const app: express.Express = express();
const router = express.Router();

// logging middleware
app.use((req, res, next) => {
  console.log(req.rawHeaders[1]);
  console.log("this is middleware");
  next(); // 다음 라우터 실행
});

// json middleware
app.use(express.json());

// router
app.use(catRouter);

// middleware for 404 error
app.use((req, res, next) => {
  console.log("this is middleware");
  res.send({ error: "404 not found Error!" });
});
app.listen(8000, () => {
  console.log("server is on");
});

싱글톤 패턴 적용 후 app.ts 파일

import * as express from "express";
import catRouter from "./cats/cats.route";
const app: express.Express = express();

// 싱글톤 패턴
class Server {
  public app: express.Application;

  constructor() {
    const app: express.Application = express();
    this.app = app;
  }
  private setRoute() {
    // router
    app.use(catRouter);
  }
  private setMiddleware() {
    // ---- middleware ----
    // logging middleware
    app.use((req, res, next) => {
      console.log(req.rawHeaders[1]);
      console.log("this is middleware");
      next(); // 다음 라우터 실행
    });

    // json middleware
    app.use(express.json());

    // route middleware
    this.setRoute();

    // middleware for 404 error
    app.use((req, res, next) => {
      console.log("this is middleware");
      res.send({ error: "404 not found Error!" });
    });
  }
  public listen() {
    this.setMiddleware();
    this.app.listen(8000, () => {
      console.log("server is on");
    });
  }
}

function init() {
  const server = new Server(); // 서버 인스턴스 생성
  server.listen(); // 서버의 listen 실행
}

init(); // init 함수 실행

route파일 수정과 service 파일 추가


싱글톤패턴 적용 전 cats.route.ts 파일

import * as express from "express";
import { Cat, CatType } from "./cats.model";
import { readAllcat } from "./cats.service";

const route = express.Router();

// ----router----
// READ 고양이 전체 데이터 가져옴
route.get("/cats", (req: express.Request, res: express.Response) => {
  try {
    // 더미데이터지만 db에서 데이터를 가져온다고 생각하고 try catch 구문 작성
    const cats = Cat;
    // throw new Error("db connect error"); // catch로 넘어감
    res.status(200).send({ success: true, data: cats });
  } catch (error: any) {
    res.status(400).send({
      success: false,
      error: error.message,
    });
  }
});

// READ 특정 고양이 데이터 가져옴
route.get("/cats/:id", (req: express.Request, res: express.Response) => {
  try {
    // 더미데이터지만 db에서 데이터를 가져온다고 생각하고 try catch 구문 작성
    const { id } = req.params;
    const cat = Cat.find((cat) => {
      return cat.id === id;
    });

    // throw new Error("db connect error"); // catch로 넘어감
    res.status(200).send({ success: true, data: { cat } });
  } catch (error: any) {
    res.status(400).send({
      success: false,
      error: error.message,
    });
  }
});

// CREATE 새로운 고양이 추가
route.post("/cats", (req: express.Request, res: express.Response) => {
  try {
    const data = req.body; // undefined, express에서 json을 읽을 수 있도록 미들웨어를 추가해줘야한다.
    // app.use(express.json());

    const cats = Cat;
    cats.push(data); // create
    console.log("enter data?", cats);
    res.status(201).send({ success: true, data: { cats } });
  } catch (error: any) {
    res.status(400).send({
      success: false,
      error: error.message,
    });
  }
});

// Update 고양이 정보 전체 수정
route.put("/cats/:id", (req: express.Request, res: express.Response) => {
  try {
    const body = req.body; // undefined, express에서 json을 읽을 수 있도록 미들웨어를 추가해줘야한다.
    const { id } = req.params;
    let result;
    Cat.forEach((cat) => {
      if (cat.id === id) {
        cat = body;
        result = cat;
      }
    });

    res.status(201).send({ success: true, data: { cat: result } });
  } catch (error: any) {
    res.status(400).send({
      success: false,
      error: error.message,
    });
  }
});
// Update 특정 고양이 정보 수정
route.patch("/cats/:id", (req: express.Request, res: express.Response) => {
  try {
    const body = req.body; // undefined, express에서 json을 읽을 수 있도록 미들웨어를 추가해줘야한다.
    const { id } = req.params;
    let result;
    Cat.forEach((cat) => {
      if (cat.id === id) {
        cat = { ...cat, ...body };
        result = cat;
      }
    });

    res.status(201).send({ success: true, data: { cat: result } });
  } catch (error: any) {
    res.status(400).send({
      success: false,
      error: error.message,
    });
  }
});

// Delete 고양이 정보 삭제
route.delete("/cats/:id", (req: express.Request, res: express.Response) => {
  try {
    const { id } = req.params;
    const result = Cat.filter((cat) => cat.id !== id);

    res.status(201).send({ success: true, data: { cat: result } });
  } catch (error: any) {
    res.status(400).send({
      success: false,
      error: error.message,
    });
  }
});
export default route; // 위에서 get,post 등으로 등록한 router를 내보낸다.

route에 있는 비즈니스 로직을 분리하기 위해 service 파일을 추가해준다.

싱글톤패턴 적용 후 cats.route.ts 파일

import { Router } from "express";
import { NextFunction } from "express-serve-static-core";
import {
  createCat,
  deleteCat,
  readAllcat,
  readCat,
  updateCat,
  updatePartialCat,
} from "./cats.service";

const router = Router();

router.get("/cats", readAllcat);
router.get("/cats/:id", readCat);
router.post("/cats", createCat);
router.put("/cats/:id", updateCat);
router.patch("/cats/:id", updatePartialCat);
router.delete("/cats/:id", deleteCat);

export default router;