
๐ฏ ๋์ API์ ์นดํ ๊ณ ๋ฆฌ API๋ฅผ ์ค๊ณํ๊ณ ๊ตฌํํฉ๋๋ค.
booksTable books {
id integer [primary key]
title varchar
img integer
category_id integer
form varchar
isbn varchar
summary text
detail text
author varchar
pages integer
contents text
price integer
likes integer
pub_date date
}
๐ค ๋์ ์ด๋ฏธ์ง ๋งํฌ๋ ์ด๋ป๊ฒ ๋ฐ์๊น?
Lorem Picsum(์ํ ์ด๋ฏธ์ง๐ผ๏ธ๊ฐ ํ์ํ ๋ URL ๊ธฐ๋ฐ ์์ฒญ์ผ๋ก ๋ฌด๋ฃ ์ด๋ฏธ์ง๋ฅผ ์ ๊ณตํ๋ ์๋น์ค)์ ํ์ฉํด์ ์ด๋ฏธ์ง์ ์ฃผ์๊ฐ์
int๊ฐ์ผ๋ก ํ์ฉํ ์์ ์ ๋๋ค.
๐ Lorem Picsum ์ฌ์ดํธ
https://picsum.photos/200/300โ200x300ํฌ๊ธฐ์ ๋๋ค ์ด๋ฏธ์ง ์ ๊ณต
categoriesTable categories {
id integer [primary key]
category_name varchar
}

Method : GET
URL : /books
HTTP Status Code : 200 Ok
Request Body : x
Response Body :
[
{
"id" : ๋์ id,
"title": "๋์ ์ ๋ชฉ",
"img" : ์ด๋ฏธ์ง id,
"summary" : "์์ฝ ์ค๋ช
",
"author" : "๋์ ์๊ฐ",
"price" : ๊ฐ๊ฒฉ,
"likes" : ์ข์์ ์,
"pub_date" : "์ถ๊ฐ ๋ ์ง"
},
{
"id" : ๋์ id,
"title": "๋์ ์ ๋ชฉ",
"img" : ์ด๋ฏธ์ง id,
"summary" : "์์ฝ ์ค๋ช
",
"author" : "๋์ ์๊ฐ",
"price" : ๊ฐ๊ฒฉ,
"likes" : ์ข์์ ์,
"pub_date" : "์ถ๊ฐ ๋ ์ง"
},
...
]
TODO : ๋ฐ์ดํฐ๋ฅผ 8๊ฐ์ฉ ๋ณด์ฌ์ฃผ๊ธฐ๋ ์ถํ์ ๊ณ ๋ํํ ์์ ์
๋๋ค.Method : GET
URL : /books/:id
HTTP Status Code : 200 Ok
Request Body
{
"email": "์ฌ์ฉ์๊ฐ ์
๋ ฅํ ์ด๋ฉ์ผ",
"password" : "์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๋น๋ฐ๋ฒํธ"
}
{
"id" : ๋์ id,
"title": "๋์ ์ ๋ชฉ",
"img" : ์ด๋ฏธ์ง id,
"category" : ์นดํ
๊ณ ๋ฆฌ,
"format" : "ํฌ๋งท",
"isbn" : "isbn",
"summary" : "์์ฝ ์ค๋ช
",
"author" : "๋์ ์๊ฐ",
"pages" : ์ชฝ ์,
"index" : "๋ชฉ์ฐจ",
"price" : ๊ฐ๊ฒฉ,
"likes" : ์ข์์ ์,
"liked" : boolean,
"pub_date" : "์ถ๊ฐ ๋ ์ง"
}
Method : GET
URL : /books?categoryId=:categoryId&new={boolean}
HTTP Status Code : 200 Ok
Request Body : x
Response Body :
[
{
"id" : ๋์ id,
"title": "๋์ ์ ๋ชฉ",
"img" : ์ด๋ฏธ์ง id,
"summary" : "์์ฝ ์ค๋ช
",
"author" : "๋์ ์๊ฐ",
"price" : ๊ฐ๊ฒฉ,
"likes" : ์ข์์ ์,
"pub_date" : "์ถ๊ฐ ๋ ์ง"
},
{
"id" : ๋์ id,
"title": "๋์ ์ ๋ชฉ",
"img" : ์ด๋ฏธ์ง id,
"summary" : "์์ฝ ์ค๋ช
",
"author" : "๋์ ์๊ฐ",
"price" : ๊ฐ๊ฒฉ,
"likes" : ์ข์์ ์,
"pub_date" : "์ถ๊ฐ ๋ ์ง"
},
...
]
TODO : ๋ฐ์ดํฐ๋ฅผ 8๊ฐ์ฉ ๋ณด์ฌ์ฃผ๊ธฐ๋ ์ถํ์ ๊ณ ๋ํํ ์์ ์
๋๋ค.
์ฐธ๊ณ ์ฌํญ : new๊ฐ true์ผ ๋ ์ ๊ฐ ์กฐํ ๊ธฐ์ค์ ์ถ๊ฐ์ผ๋ก๋ถํฐ 30์ผ ์ด๋ด
Method : GET
URL : /category
HTTP Status Code : 200 Ok
Request Body : x
Response Body :
[
{
"id" : ์นดํ
๊ณ ๋ฆฌ id,
"name": "์นดํ
๊ณ ๋ฆฌ ์ด๋ฆ",
},
{
"id" : ์นดํ
๊ณ ๋ฆฌ id,
"name": "์นดํ
๊ณ ๋ฆฌ ์ด๋ฆ",
},
...
]
const conn = require('../mariadb');
const { StatusCodes } = require('http-status-codes');
const allBooks = (req, res) => {
const { categoryId } = req.query;
if (categoryId) {
const sql = 'SELECT * FROM books WHERE category_id = ?';
conn.query(sql, categoryId, (err, result) => {
if (err) {
return res.status(StatusCodes.BAD_REQUEST).end();
}
if (result.length) {
return res.status(StatusCodes.OK).json(result);
} else {
return res.status(StatusCodes.NOT_FOUND).end();
}
});
} else {
const sql = 'SELECT * FROM books';
conn.query(sql, (err, result) => {
if (err) {
return res.status(StatusCodes.BAD_REQUEST).end();
}
return res.status(StatusCodes.OK).json(result);
});
}
};
const bookDetail = (req, res) => {
const id = parseInt(req.params.id);
const sql = 'SELECT * FROM books WHERE id = ?';
conn.query(sql, id, (err, result) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
if (result[0]) {
return res.status(StatusCodes.OK).json(result);
} else {
return res.status(StatusCodes.NOT_FOUND).end();
}
});
};
module.exports = {
allBooks,
bookDetail,
};
allBooks : categoryId๊ฐ ์์ ๊ฒฝ์ฐ ํน์ ์นดํ
๊ณ ๋ฆฌ์ ๋์ ์กฐํํ๊ณ , ์์ผ๋ฉด ์ ์ฒด ์กฐํํฉ๋๋ค.
bookDetail : ํน์ ๋์์ ์์ธ ์ ๋ณด๋ฅผ ์กฐํํฉ๋๋ค.
๊ฐ์ ์๋ํฌ์ธํธ๋ฅผ ์ฌ๋ฌ ์ปจํธ๋กค๋ฌ๋ก ๋๋๊ธฐ๋ณด๋ค ํ๋์ ์ปจํธ๋กค๋ฌ์์ categoryId ์กด์ฌ ์ฌ๋ถ์ ๋ฐ๋ผ ๋๋๋ ๊ฒ์ด ๋ ๊น๋ํ๊ณ ์ ๋์๊ฐ๋ ๊ฒ์ด๋ผ๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค.
