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()의 필요한 데이터를 동적으로 할당합니다.