| 싱글톤 패턴, 서비스 패턴
싱글톤 패턴
싱글톤 패턴은 객체의 인스턴스를 한개만 생성되게 하는 패턴이다
이러한 패턴은 주로 프로그램 내에서 하나로 공유를 해야하는 객체가 존재할 때 해당 객체를 싱글톤으로 구현하여 모든 유저 또는 프로그램들이 해당 객체를 공유하며 사용하도록 할 때 사용된다
그러면 메모리 낭비를 방지할 수 있고,
이미 생성된 인스턴스를 활용하는 것이기때문에 속도 측면에도 이점이 있으며
전역적으로 사용하는 인스턴스이기 때문에 다른 여러 클래스에서 데이터를 공유할 수 있다
우선전체구조를 보자
이 구조는 NESTJS 에서 많이 사용하는 패턴이다
cats.route.ts
라우터에 있던 비즈니스로직들은
service 로 분리시켜놓았기때문에 간단해진것을 볼 수 있다
일종의 mvc 패턴으로 치면 controller역할을 하는 것이다.
import { Cat, CatType } from "./cats.model";
import { Router } from "express";
import {createCat, deleteCat, patchCat, readAllcat, readCat, updateCat} from'./cats.service'
const router = Router();
//* READ 고양이 전체 데이터 다 조회
router.get("/cats", readAllcat);
//* READ 특정 고양이 데이터 조회
router.get("/cats/:id", readCat);
//* CREATE 새로운 고양이 추가 api
router.post("/cats", createCat);
//* UPDATE 고양이 데이터 업데이트 -> PUT(Body)
router.put("/cats/:id", updateCat);
//* UPDATE 고야잉 데이터 부분적으로 업데이트 -> PATCH
router.patch("/cats/:id", patchCat);
//* DELETE 고양이 데이터 삭제 -> DELETE
router.delete("/cats/:id", deleteCat);
export default router;
cats.service.ts
아래와 같이 라우터의 두번째 인자에 있던 함수들, 즉 비즈니스 로직들을
모아 놨다
import{Request, Response} from 'express';
import { Cat, CatType } from "./cats.model";
//* READ 고양이 전체 데이터 다 조회
export const readAllcat = (req:Request, res:Response) => {
try {
const cats = Cat;
// throw new Error("db connect error");
res.status(200).send({
success: true,
data: {
cats,
},
});
} catch (error) {
res.status(400).send({
success: false,
error: error.message,
});
}
};
//* READ 특정 고양이 데이터 조회
export const readCat = (req:Request, res:Response) => {
try {
const params = req.params;
console.log(params);
const cat = Cat.find((cat) => {
return cat.id === params.id;
});
res.status(200).send({
success: true,
data: {
cat,
},
});
} catch (error) {
res.status(400).send({
success: false,
error: error.message,
});
}
};
//* CREATE 새로운 고양이 추가 api
export const createCat = (req:Request, res:Response) => {
try {
const data = req.body;
console.log(data);
Cat.push(data); // create
res.status(200).send({
success: true,
data: {},
});
} catch (error) {
res.status(400).send({
success: false,
error: error.message,
});
}
};
//* UPDATE 고양이 데이터 업데이트 -> PUT(Body)
export const updateCat = (req:Request, res:Response) => {
try {
const params = req.params;
const body = req.body;
let result;
console.log(params);
console.log(body);
Cat.forEach((cat) => {
if (cat.id === params.id) {
cat = body;
result = cat;
}
});
res.status(200).send({
success: true,
data: {
cat: result,
},
});
} catch (error) {
res.status(400).send({
success: false,
error: error.message,
});
}
};
//* UPDATE 고야잉 데이터 부분적으로 업데이트 -> PATCH
export const patchCat = (req:Request, res:Response) => {
try {
const params = req.params;
const body = req.body;
let result;
console.log(params);
console.log(body);
Cat.forEach((cat) => {
if (cat.id === params.id) {
cat = { ...cat, ...body }; //cat에 body를 덮어씌움 (구조분해할당)
result = cat;
}
});
res.status(200).send({
success: true,
data: {
cat: result,
},
});
} catch (error) {
res.status(400).send({
success: false,
error: error.message,
});
}
};
//* DELETE 고양이 데이터 삭제 -> DELETE
export const deleteCat = (req:Request, res:Response)=> {
try {
const params = req.params;
const newCat = Cat.filter((cat)=>cat.id !== params.id);
// filter는 조건에 일치하는 것들만 모아서 새로운 배열을 만듬
res.status(200).send({
success: true,
data: newCat,
});
} catch (error) {
res.status(400).send({
success: false,
error: error.message,
});
}
};
app.ts는 싱글톤 패턴을 이용하여
객체를 생성하면 서버만 딱 실행될수 있도록 하였다
// ** Create Read */
import * as express from "express";
import catRouter from "./cats/cats.route";
class Server{
public app : express.Application;
constructor(){
const app: express.Application = express();
this.app = app;
}
private setRoute(){
this.app.use(catRouter);
}
private setMiddleware(){
//* logging middleware
this.app.use((req, res, next) => {
console.log(req.rawHeaders[5]);
console.log("this is logging middleware");
next();
});
//* json middleware
this.app.use(express.json());
this.setRoute();
//* 404 middleware
this.app.use((req, res, next) => {
console.log("this is error 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();
}
init();
반응형
'웹 개발 > 🟩 Node.js' 카테고리의 다른 글
NestJS | 유용한 VSCde 셋업 (0) | 2024.02.13 |
---|---|
NestJS | 개발환경 셋팅 (0) | 2024.02.13 |
Express | Update Delete API 개발 (0) | 2023.06.18 |
Express | route분리, 모듈화 (0) | 2023.06.18 |
Express | Create Read API 개발 (0) | 2023.06.18 |