DB

SQL Query문 사용

마손리 2022. 12. 14. 19:06

SQL문법을 배우면서 ORM을 사용하지않고 서버를 개설 해보고 싶어서 바로 Express 서버에 DB를 연결해서 사용해보았다. (Express 서버에 DB 및 session store 연결:https://mason-lee.tistory.com/12)

 

dbModules.ts

import { conn } from "./db";

module.exports = {
  createProduct: async (name: string, pictures: string, owner_id: string) => {
    await conn.query(`INSERT INTO product (name, pictures, owner_id) VALUES ('${name}', '${pictures}', '${owner_id}')`)
    const [rows] = await conn.query(`SELECT * FROM product WHERE name = '${name}'`)
    return rows[0]
  },
  allProduct: async (owner_id: string) => {
    const [rows] = await conn.query(`SELECT * FROM product WHERE owner_id = ${owner_id}`)
    return rows
  },
  findSingleProduct: async (value: string, key:string) => {
    const [rows] = await conn.query(`SELECT * FROM product WHERE ${key} = '${value}'`)
    return rows[0]
  },
  editProduct: async (id: number, name: string, url?: string) => {
    await conn.query(`UPDATE product SET name = '${name}' ${url? `, pictures = ${url}` :""} 
    WHERE id = ${id};`)
    const [rows] = await conn.query(`SELECT * FROM product WHERE name = '${name}'`)
    return rows[0]
  },
  deleteProduct: async (id: number) => {
    await conn.query(`DELETE FROM product WHERE id = ${id}`)
  }
};

(기본적인 SQL문법만을 사용하였으며 각각의 기능들은 이전포스트(https://mason-lee.tistory.com/11)에 설명이 되었기에 생략하였습니다.)

 

위의 쿼리문은 제품의 생성, 수정, 삭제, 모든제품 조회, 특정제품 조회와 같은 기능들을 할수있도록 작성되었다.

일반 mysql이 아닌 mysql2를 사용함으로써 비동기 처리방식인 async await 사용이 가능하였고 mysql2는 array로 데이터를 반환한다는것을 알게되었다.

 

createProduct와 editProduct에서는 제품을 생성이나 수정이 완료되면 그 데이터를 불러와 확인이 가능하도록 해주었으며 editProduct의 경우 제품사진을 변경하지 않을때를 대비하여 조건문으로 작성해주었다.

editProduct의 제품이름의 경우 사용자가 수정하지 않더라도 기존의 이름이 입력되어 결과적으로는 변화가 없도록 작성하였다.

 

findSingleProduct에서 key값을 따로 받아온이유는 제품의 이름으로 검색할수도있고 id로 검색할수도 있을것 같아서 따로 지정해주었다.

 

작성된 SQL문을 불러와 사용

const db = require("../../dbModules");

interface Request{
  [key:string]: {
      [key: string]: {
          [key:string]:string|number
      }
  }
}

export const postProductApply = async (req:Request, res) => {
  try {
    const {
      body: { name },
      file: { location: pictures },
      session: {
        user: { id: owner_id },
      },
    } = req;
    
    const productExists = await db.findSingleProduct(name,"name");

    if (productExists) {
    return res.send({ ok: false, error: "같은 이름의 제품이 존재합니다. 이름을 바꿔주세요." })
    }
    const newProduct = await db.createProduct(name, pictures, owner_id);
    if (!newProduct) {
      return res.send({ ok: false, error: "데이터베이스에 접근할수 없습니다." })
    }
    return res.send({ok:true, newProduct})

  } catch (error) {
    return res.send({ok:false,error})
  }
};

 

 

REST API를 이용하여 제품생성 post request에 처음 작성한 쿼리문을 사용해 주었다.

request에 저장된 제품정보(제품이름, 제품사진의 url)와 session store에 저장된 제품 관리자의 id를 받은후 진행하였다.

 

제품을 생성하기전 이미 생성된 제품이 있는지 findSingleProduct로 확인을 해주었다. 주어진 제품명으로 검색을 할것이기에 key값으로 "name"을 입력

 

validation을 통과하면 createProduct로 제품을 생성하고 반환된값이 있을경우 response에 ok와 함께 제품의 정보를 보냈다.

 

잡담

사실 처음에는 Prisma orm처럼 만들어볼 생각이었지만... (SQL문을 배우기 전까지는 Postgre를 사용하였음)

조금더 공부한뒤에 도전해보기로...

 

(깃헙:https://github.com/Mason3144/booking-manager-backend/blob/master/src/dbModules.ts)

'DB' 카테고리의 다른 글

SQL의 Join 정리  (0) 2023.03.31
관계형 데이터 베이스 설계  (0) 2023.03.29
SQL vs NoSQL  (0) 2023.03.28
SQL Query 문법 (DDL, DML)  (0) 2022.12.14