[NestJS] express의 CRUD, 라우터의 분리방법 및 싱글톤 패턴

단비·2023년 3월 17일
0

인강

목록 보기
12/15
  • 데이터 전체 조회 (READ)
    app.get("/cats", (req,res)=>{
        try{
            const cats = Cat
            // throw new Error("db connect error")
    				// 위 throw문 활성화 시 catch문 실행
            res.status(200).send({
                success: true,
                data: {
                    cats, // 전체 데이터 반환
                }
            })
        } catch(error){
            res.status(400).send({
                success: false,
                error: error.message // 에러메시지 반환
            })
        }
    })
    • 특정 데이터 조회
      • 주소에 파라미터값을 동적으로 입력받을 수 있음(:를 사용하여)

        app.get("/cats/:id", (req,res)=>{
            try{
                const params = req.params; // 전달받은 파라미터값을 params에 저장
                const cat = Cat.find((cat) => { // 객체에서 해당 id와 동일한 id를 찾음
                    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 - POST)
    • express 에서 json body 내용을 읽으려면 미들웨어를 추가해줘야함(기본으론 지원 안됨)

      //* json middleware
      app.use(express.json())
      
      app.post("/cats", (req, res) => {
          try{
              const data = req.body // 전달받은 body값을 data에 저장
              Cat.push(data) // 데이터 삽입
              res.status(200).send({
                  success: true,
                  data: { data }
              })
          } catch(error){
              res.status(400).send({
                  success: false,
                  error: error.message
              })
          }
      })
  • 데이터 수정 (UPDATE - PUT)
    • 데이터 일부 수정이 아닌 덮어쓰기의 경우 put을 사용

      router.put("/cats/:id", (req, res) =>{
          try{
              const params = req.params
              const body = req.body
              let result
              Cat.forEach((cat)=>{ // 반복문을 돌며 하나하나 꺼내옴
                  if(cat.id === params.id){ // 수정하려는 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)

      • 구조 분해 할당을 이용
        - 배열이나 객체의 속성을 해체하여 그 값을 개별 변수에 담을 수 있게 하는 JavaScript 표현식
        - request의 body를 나중에 삽입하여, 동일한 key값에 대한 덮어쓰기를 구현

        router.patch("/cats/:id", (req, res) =>{
            try{
                const params = req.params
                const body = req.body
                let result
                Cat.forEach((cat)=>{
                    if(cat.id === params.id){
                        cat = { ...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)
    router.delete("/cats/:id", (req, res) =>{
        try{
            const params = req.params
    				// filter를 이용해 동일하지 않은 데이터만 출력(실질적인 삭제가 아닌 출력만 필요할 경우)
            const newCat = Cat.filter((cat) => cat.id !== params.id)
            res.status(200).send({
                success: true,
                data: newCat
            })
        } catch(error){
            res.status(400).send({
                success: false,
                error: error.message
            })
        }
    })

  • 라우터 분리 방법
    • app.ts

      import catRouter from "./cats/cats.route"
      
      app.use(catRouter) // 미들웨어 끼워넣기
    • 분리된 라우터
      - express에서 라우터를 import

      import { Router } from "express";
      
      const router = Router()
      // 기능구현

  • 서비스와 라우터의 분리
    • 라우터
      import { createCat, deleteCat, readAllcat, readCat, updateCat, updatePartialCat } from './cats.service';
      
      const router = Router()
      
      //* READ 고양이 전체 데이터 조회
      router.get("/cats", readAllcat)
      ~
      
      export default router
    • 서비스
      import { Request, Response } from "express"
      import { Cat, CatType } from './cats.model'
      
      //* READ 고양이 전체 데이터 조회
      export const readAllcat = (req: Request, res: Response)=>{
          // 실행 로직
      }
      ~

  • 싱글톤 패턴
    • 하나의 인스턴스만 생성하여 사용하는 것

      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) // 라우터에 선언된 액션을 import하여 가져옴
          }
      
          private setMiddleware(){
              //* logging middleware
              this.app.use((req, res, next) => {
                  console.log(req.rawHeaders[1])
                  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() 
profile
tistory로 이전! https://sweet-rain-kim.tistory.com/

0개의 댓글