8-3 도서/카테고리 API, picsum

airbus·2025년 3월 14일

프로그래머스

목록 보기
35/93
post-thumbnail

8-3 도서/카테고리 API, picsum

도서 테이블 ERD

이전에 작성한 API 설계를 기반으로 작성된 ERD
! 03.14 수정) MySQL 예약어와 겹치는 단어 수정

  • format -> form / description > detail / index -> contents
    (tool: dbdiagram)

전체 도서 조회 API

// 전체 도서 조회
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);
    })
}

상세 도서 조회 API

// 상세 도서 조회
const bookDetail = (req, res) => {
  
    let { id } = req.params;

    let sql = "SELECT * FROM books WHERE id=?";// 특정 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();
        })
}

카테고리별 도서 목록 조회 API

<books.js>

// 전체 도서 조회
router.get('/', allBooks);
// 개별 도서 조회
router.get('/:id', bookDetail);
// 카테고리별 도서 목록 조회
router.get('/', booksByCategory);

'전체 도서 조회'와 '카테고리별 도서 목록 조회'의 HTTP method, URI가 동일한 상황에서는 상단에 위치한 라우터가 실행됩니다.

-> postman에서 카테고리 조회 시도시 계속 전체 도서가 불러와지는 이유

|해결|
두 API를 하나로 합칩니다.

  • if else문으로 URL에 카테고리 쿼리가 있는지 확인하여 구분하는 방식으로 처리합니다.
const allBooks = (req, res) => {

    let { category_id } = req.query;

    if (category_id) { // <=== category_id가 있으면
        let sql = "SELECT * FROM books WHERE category_id=?";
        conn.query(sql, category_id,
            (err, results) => {
                if (err) {
                    console.log(err);
                    return ![](https://velog.velcdn.com/images/airbus/post/e69a2772-0446-4c26-99be-6482e786bebf/image.PNG)
res.status(StatusCodes.BAD_REQUEST).end();
                }
                if (results.length)
                    return res.status(StatusCodes.OK).json(results);
                else
                    return res.status(StatusCodes.NOT_FOUND).end();
            })

    } else { // <=== category_id가 없으면 (도서 전체 조회)

        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);
        })
    }
}

해당하는 카테고리의 목록이 출력이 되지만 숫자로 표시됩니다.

1) 카테고리(category)테이블을 생성하고

  • category_id
  • category_name
    값을 입력합니다.

2) books 테이블에 존재하는 category_id 와 category 테이블을 JOIN 시켜 name으로 조회될 수 있게 합니다.
(8-4 에서 추가작성)

picsum 링크

간단하고 다양한 이미지들을 이미지의 id값으로 사용할 수 있는 기능을 제공합니다.

0개의 댓글