API 로직 코드는 같은데 SQL쿼리문만 다르다면 .. ?

Songss·2024년 12월 13일

DBMS

목록 보기
12/20

[카테고리별 신간조회][카테고리별 조회] [전체조회]가 if…else로 나눠져 있을때 , 더욱 깔끔하게 분기처리하기

리팩토링 하기 전

const conn = require("../db");
const { StatusCodes } = require("http-status-codes");

const allBooks = (req, res) => {
  let { category_id, newBook } = req.query;

  if (category_id && newBook) {
    // 카테고리별 신간 조회

    let sql = `SELECT * FROM books WHERE category_id = ? `;

    conn.query(sql, category_id, (err, results) => {
      if (err) {
        console.error(err);
        return res
          .status(StatusCodes.BAD_GATEWAY)
          .json({ error: "데이터베이스 오류입니다." });
      }
      if (results.length) {
        return res.status(StatusCodes.OK).json(results);
      } else {
        return res.status(StatusCodes.NOT_FOUND).end();
      }
    });
  } else if (category_id) {
    // 카테고리별 조회
    let sql = `SELECT * FROM books WHERE category_id = ? `;

    conn.query(sql, category_id, (err, results) => {
      if (err) {
        console.error(err);
        return res
          .status(StatusCodes.BAD_GATEWAY)
          .json({ error: "데이터베이스 오류입니다." });
      }
      if (results.length) {
        return res.status(StatusCodes.OK).json(results);
      } else {
        return res.status(StatusCodes.NOT_FOUND).end();
      }
    });
  } else {
    // 도서 전체 조회
    let sql = `SELECT * FROM books`;
    conn.query(sql, (err, results) => {
      if (err) {
        console.error(err);
        return res
          .status(StatusCodes.BAD_GATEWAY)
          .json({ error: "데이터베이스 오류입니다." });
      }
      if (results && results.length) {
        return res.status(StatusCodes.OK).json(results);
      }
    });
  }
};

module.exports = { allBooks, bookDetail };

리팩토링 하기전에는 allBooks 함수 표현식에
1. if(category_id && newBook)문
2. if(category_id)문
3. else()문
으로 조건식을 만들고 각 조건문 블록에 conn.queryI()문 중복 존재하는 걸 확인 할 수 있습니다.

리팩토링 후

const conn = require("../db");
const { StatusCodes } = require("http-status-codes");

// (카테고리별 , 신간 여부) 전체 도서 목록 조회
const allBooks = (req, res) => {
  let { category_id, newBook } = req.query;

  let sql = `SELECT * FROM books `;
  let values = [];

  if (category_id && newBook) {
    // category별 신간
    sql += `WHERE category_id = ? AND pub_date BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 month) AND NOW()`;
    values = [category_id, newBook];
  } else if (category_id) {
    // category별
    sql += `WHERE category_id = ? `;
    values = [category_id];
  } else if (newBook) {
    // 신간
    sql +=
      "WHERE pub_date BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 month) AND NOW()";
    values = [newBook];
  }

  conn.query(sql, values, (err, results) => {
    if (err) {
      console.error(err);
      return res
        .status(StatusCodes.BAD_GATEWAY)
        .json({ error: "데이터베이스 오류입니다." });
    }
    if (results.length) {
      return res.status(StatusCodes.OK).json(results);
    } else {
      return res.status(StatusCodes.NOT_FOUND).end();
    }
  });
};

module.exports = { allBooks, bookDetail };

1.conn.query()문을 1개로 통합하되
2. 기존의 3개의 조건문을 전역 블록에서 처리 후
3. values 변수를 사용하여 conn.query()의 필요한 데이터를 동적으로 할당합니다.

0개의 댓글