백엔드 실습(6)

wltjd1688·2025년 3월 13일

풀사이클

목록 보기
33/74

이번에는 book과 category의 연관관계를 연결하고, join의 사용방법과 신간, 카테고리, 페이징을 설정하는 방법에 대해서 배웠다.

먼저 이전사간에 못한 books과 category 연관관계를 index를 통해 연결한다.

이제 join을 사용하면 books의 category_id와 category의 id를 한 테이블로 붙여서 볼 수 있다.

이렇게 만든 코드는 나중에 책의 개별 조회에서 category_id에 따른 name을 나타낼 때 사용할 거 같다.

as
데이터베이스에서 컬럼의 이름을 변경해줄때 as 사용하면 이름을 바꿀 수 있다는 것이다. 이렇게 바꾸게되면 아스카를 못써서 그냥 컬럼명 자체를 바꿔주는게 더 좋을 수도있다.

이렇게 바뀐 테이블들을 토대로 erd에 반영해줘야 한다.

도서 목록 조회 API 조인 구현

앞에서 join으로 테이블을 붙였으니 이제 개별 도서목록에서 사용할 일만 남았다. 근데 아래와 같이 사용할 수는 없기에 수정해 준다.

SELECT * FROM books WHERE id=1 LEFT JOIN category ON books.category_id = category.id;

=>

SELECT * FROM books LEFT JOIN category ON books.category_id = category.id  WHERE id=1;

아래부분 처럼 뒤에 WHERE을 추가해야줘야 밑의 사진처럼 category_name이 보인다.

SQL 시간 범위 구하기 (DATE_ADD, SUB)

데이터베이스에서 기준시간을 통해 앞뒤로 이동한 시간을 찾을 수 있다.

  • 시간 더하기
    DATE_ADD(기준날짜, INTERVAL __)

  • 시간 뺴기
    DATE_SUB(기준날짜, INTERVAL __)

  • 시간 범위를 설정해서 SELECT

    SELECT * FROM books WHERE pub_date BETWEEN DATE_SUB(NOW(), INTERVAL 2 YEAR) AND NOW();

카테고리별, 신간, 도서 목록 조회

위의 시간을 조절해주는 명령어를 통해 도서에서 1달 전부터 현재까지 출시된 도서를 신간으로 보여줄 수 있다.

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

    let sql = "SELECT * FROM books";
    let values = [];
    if (category_id && news) {
        sql += "WHERE category_id = ? AND pub_date BETWEEN DATE_SUB(NOW(), INTERVAL 1 Month) AND NOW();";
        values = [category_id, news];
    } else if(category_id) {
        sql += "WHERE category_id = ?";
        values = [category_id];
    } else if (news) {
        sql += "WHERE pub_date BETWEEN DATE_SUB(NOW(), INTERVAL 1 Month) AND NOW();";
        values = [news]
    }

    db.query(sql, values, (err, results)=>{
        if (err){
            console.log(err);
            return res.status(StatusCodes.BAD_REQUEST).end();
        }

        if(results.length)
            return res.status(StatusCodes.OK).json(results);
        else
            return res.status(StatusCodes.NOT_FOUND).end();
    });
}

도서 목록 조회 페이징 구현하기

데이터베이스 페이징(pagein)
즉, 프론트에 얼마정도의 페이지를 보여줄지를 정할 수 있는 api를 작성해줄 것이다.

SELECT * FROM books LIMIT 4 OFFSET 8;SELECT * FROM books LIMIT 8,4;

위의 명령어는 몇개(Limit)를 어디서(OFFSET)부터 보여줄 지 정할 수 있는 명령어 이다. 이걸 사용해서 프론트로부터 n개 보여줄꺼고, m페이지 를 보여줄꺼야 에 맞는 데이터만 보여줄 수 있다.

  • 전체 도서 조회(페이징) GET /books?limit=(당 도서수)&currentPage = (현재 page)
        sql += " LIMIT ?,?"
        values.push(offset, parseInt(limit))
        console.log(sql,values)

신간 안내 구현

다음은 1페이지에 4개의 데이터중 카테고리id가 0이고, 신간인 걸 보여달라는 요청에 대한 api와 데이터이다.

profile
일단 해!!!!

0개의 댓글