ERD books
//전체조회 + 개별 조회 + 카테고리
Table books{
id integer [primary key]
title varchar
form varchar
isbn varchar
summary varchar
detail longtext
author varchar
pages integer
contents longtext
price integer
pub_date date
}
도서 등록 api가 없기 때문에 > DB에 insert 작업 해주어야 한다.
작성한 sql 문은 vscode에 `data.sql` 파일 안에서 관리해주는 것이 좋다.
전체 도서 조회
전체도서 목록에서는 도서의 상세정보를 요청하고, 필요한 데이터만 선별하여 프론트에서 구현하기.
`통으로 정보 보내줌`
+ 추후에 한번에 이미지 경로 보내기
//(요약된)전체 도서 조회
const allBooks = (req, res) => {
let sql = "SELECT * FROM books";
conn.query(sql, (err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
return res.status(StatusCodes.OK).json(results);
});
};
개별 도서 조회
좋아요는 제외하고 구현
//개별 도서 조회
const bookDetail = (req, res) => {
let { id } = req.params;
let sql = "SELECT * FROM books WHERE id = ?";
conn.query(sql, id, (err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
if (results[0]) return res.status(StatusCodes.OK).json(results[0]);
else return res.status(StatusCodes.NOT_FOUND).end();
});
};
이미지 경로 추가
로렘 픽섬 Lorem Picsum
더미 이미지 넣기 좋은 사이트
이미지 id 만 알면 사용가능 > img 컬럼에 int 값으로 지정
카테고리별 도서 목록 조회
` /books?categoryId={categoryId}`
let { category_id } = req.query;
let sql = "SELECT * FROM books WHERE category_id = ?";
conn.query(sql, category_id, (err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
if (results.length) return res.status(StatusCodes.OK).json(results[0]);
else return res.status(StatusCodes.NOT_FOUND).end();
});
api ULR이 전체도서와 같아서, 하나만 컨트롤러로 작동하는 문제점 발생!
> 하나의 컨트롤러로 합체
const allBooks = (req, res) => {
let { category_id } = req.query;
if (category_id) {
let sql = "SELECT * FROM books WHERE category_id = ?";
conn.query(sql, category_id, (err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
if (results.length) return res.status(StatusCodes.OK).json(results[0]);
else return res.status(StatusCodes.NOT_FOUND).end();
});
} else {
let sql = "SELECT * FROM books";
conn.query(sql, (err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
return res.status(StatusCodes.OK).json(results);
});
}
};
category 테이블
카테고리 id 와 이름을 매핑해주는 category 테이블 있어야 한다.
> join 해서 날릴때 name도 함께 전송
app.js 에 카테고리 경로 추가하고,
category.js
const express = require("express");
const { allCategory } = require("../controller/CategoryController");
const router = express.Router();
router.use(express.json());
//전체 카테고비 조회
router.get("/", allCategory);
module.exports = router;
CategoryController.js
const conn = require("../mariadb"); //db module
const { StatusCodes } = require("http-status-codes"); //status codes module
const allCategory = (req, res) => {
//카테고리 전체 목록 리스트
let sql = "SELECT * FROM category";
conn.query(sql, (err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
return res.status(StatusCodes.OK).json(results);
});
};
module.exports = { allCategory };
프론트에서 api 두번 호출하지 않도록, `books.category_id = cetegory.id` 조인 걸어서 name 값 으로 전송하기
☑️ 배운 점
카테고리 별 도서 목록 조회, 전체 목록 조회 URL 겹칠때, 해결법