본문 바로가기
타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js)/TIL

데브코스 8주차 Day2 - FK, book/category - Controller , 데이터 join

by 슈크림 붕어빵 2024. 1. 5.

구현한 부분 (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. 전체 도서 리스트 && 카테고리별 도서 리스트

  1. localhost:8080/books?category_id=1; => category_id 쿼리가 있는 경우는 해당 카테고리 도서리스트를 반환
  2. 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 사용

책에 대한 이미지가 없으므로 아래 사이트에서 이미지를 활용했다.

https://picsum.photos/images

 

Lorem Picsum

Lorem Ipsum... but for photos

picsum.photos