구현한 부분 (FK & join)
- 개별 도서 조회
- 전체 도서 & 카테고리별 도서 리스트
- 카테고리 조회
books와 category 부분의 ERD
FK: books의 category_id는 category의 id를 참조하는 FK이다.
관계: 하나의 category.id에 여러개의 books.id를 가질 수 있다.
FK설정 - 1. workbench
FK설정 - 코드
ALTER TABLE `Bookshop`.`books`
ADD INDEX `category_id_idx` (`category_id` ASC) VISIBLE;
;
ALTER TABLE `Bookshop`.`books`
ADD CONSTRAINT `category_id`
FOREIGN KEY (`category_id`)
REFERENCES `Bookshop`.`category` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
참고
- category_id_idx는 books 테이블의 category_id 열에 대한 인덱스 이름
- INDEX는 데이터베이스에서 데이터에 빠르게 액세스할 수 있도록 도와주는 구조.
- category_id 열에 대한 인덱스를 추가하면 해당 열을 기반으로 검색 및 정렬이 빨라질 수 있음. VISIBLE는 인덱스가 사용 가능하다는 의미.
- ON DELETE NO ACTION은 참조된 행이 삭제될 때 어떻게 처리할지 정의
- 여기서는 삭제 시 아무 작업도 수행하지 않음을 나타냄. 즉, books 테이블의 행이 삭제되어도 category 테이블의 행에는 영향을 미치지 않음
- ON UPDATE NO ACTION은 외래 키가 참조하는 값이 업데이트될 때 어떻게 처리할지 정의
- 여기서는 업데이트 시 아무 작업도 수행하지 않음을 나타냄. 즉, books 테이블의 category_id가 업데이트되어도 category 테이블의 id에는 영향을 미치지않음
1. 개별 도서 조회
category 테이블에서 카테고리 명을 받아와야하기 때문에 sql문에서 join을 이용한다.
SELECT * FROM books LEFT JOIN category ON books.category_id=category.id WHERE books.id= ?
//개별 도서 조회
const book = (req, res) => {
const { id } = req.params;
let sql = `SELECT * FROM books LEFT JOIN category ON books.category_id=category.id WHERE books.id= ?`;
conn.query(sql, id, (err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
if (results.length > 0) {
return res.status(StatusCodes.OK).json(results);
} else {
return res.status(StatusCodes.NOT_FOUND).end();
}
});
};
2. 전체 도서 리스트 && 카테고리별 도서 리스트
- localhost:8080/books?category_id=1; => category_id 쿼리가 있는 경우는 해당 카테고리 도서리스트를 반환
- localhost:8080/books => 전체 도서 리스트 반환
더보기
const allBooks = (req, res) => {
const { category_id } = req.query;
let sql = "SELECT * FROM books";
let values = [];
if (category_id) {
sql += " WHERE category_id= ?";
values = [category_id];
}
conn.query(sql, values, (err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
if (results.length > 0) {
return res.status(StatusCodes.OK).json(results);
} else {
return res.status(StatusCodes.NOT_FOUND).end();
}
});
};
더 고안할 부분
- 좋아요 수 join
- 페이지네이션
더미 image 사용
책에 대한 이미지가 없으므로 아래 사이트에서 이미지를 활용했다.
Lorem Picsum
Lorem Ipsum... but for photos
picsum.photos
'타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js) > TIL' 카테고리의 다른 글
데브코스 8주차 Day4 - 좋아요 수/여부 조회(서브쿼리), 좋아요 기능 추가 (1) | 2024.01.07 |
---|---|
데브코스 8주차 Day3 - 도서 기간 내 검색, 페이징 구현 (0) | 2024.01.05 |
데브코스 8주차 day1 - http-status-code 모듈, 폴더구조, 암호화, user 컨트롤러 구현 (0) | 2024.01.05 |
웹 풀사이클 26일차 - API 설계 (0) | 2023.12.30 |
웹풀사이클 25일차 - (0) | 2023.12.30 |