
π― λμ APIμ νμ΄μ§ μ²λ¦¬λ₯Ό μ μ©μν΅λλ€.
SELECT DATE_SUB(κΈ°μ€_λ μ§, INTERVAL μ«μ λ¨μ);
SELECT DATE_ADD(κΈ°μ€_λ μ§, INTERVAL μ«μ λ¨μ);
SELECT * FROM ν
μ΄λΈλͺ
WHERE μΉΌλΌλͺ
BETWEEN μμμΌ AND μ’
λ£μΌ;
SELECT * FROM ν
μ΄λΈλͺ
LIMIT κ°μ OFFSET (νμ΄μ§_λ²νΈ - 1) * κ°μ;
SELECT * FROM ν
μ΄λΈλͺ
LIMIT (νμ΄μ§_λ²νΈ - 1) * κ°μ, κ°μ;

π μμ ν λΆλΆμ μ£Όν©μ κΈμ¨λ‘ λνλ λλ€.
Method : GET
URL : /books?limit=κ°μ¤tPage=νμ΄μ§λ²νΈ
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" : "μΆκ° λ μ§"
},
...
]
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&news={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" : "μΆκ° λ μ§"
},
...
]
newsκ° trueμΌ λ μ κ° μ‘°ν κΈ°μ€μ μΆκ°μΌλ‘λΆν° 1λ¬ μ΄λ΄const conn = require('../mariadb');
const { StatusCodes } = require('http-status-codes');
const allBooks = (req, res) => {
const { news, limit, currentPage, categoryId } = req.query;
const offset = limit * (currentPage - 1);
let sql = 'SELECT * FROM books';
let values = [];
if (categoryId && news) {
sql +=
' WHERE category_id = ? AND pub_date BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND NOW()';
values.push(categoryId);
} else if (categoryId) {
sql += ' WHERE category_id = ?';
values.push(categoryId);
} else if (news) {
sql +=
' WHERE pub_date BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND NOW()';
}
sql += ' LIMIT ? OFFSET ?';
values.push(parseInt(limit), offset);
conn.query(sql, values, (err, result) => {
if (err) {
console.log(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();
}
});
};
const bookDetail = (req, res) => {
const id = parseInt(req.params.id);
const sql =
'SELECT * FROM books LEFT JOIN categories ON books.category_id = categories.id WHERE books.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, news μ¬λΆμ λ°λΌ νν°λ§μ κ±°μΉ©λλ€.
limit(ν λ²μ κ°μ Έμ€λ μ±
κ°μ)μ currentPage(νμ¬ νμ΄μ§ λ²νΈ)λ‘ νμ΄μ§μ μ²λ¦¬ν©λλ€.
π€ μ
offsetμlimit * (currentPage - 1)μΌκΉ?
offsetμ μ‘°νν λ°μ΄ν°μ μμ μμΉλ₯Ό μλ―ΈνκΈ° λλ¬Έμ λλ€.0λΆν° μμνλ©°, μ§μ νlimitλ§νΌ λ°μ΄ν°λ₯Ό λΆλ¬μ€κ² λ©λλ€.
currentPageoffset = limit * (currentPage - 1)μ‘°ν λ²μ ( LIMIT 10 OFFSET X)1 (첫 νμ΄μ§) 10 * (1 - 1) = 01~10λ² λ°μ΄ν°2 (λ λ²μ§Έ νμ΄μ§) 10 * (2 - 1) = 1011~20λ² λ°μ΄ν°3 (μΈ λ²μ§Έ νμ΄μ§) 10 * (3 - 1) = 2021~30λ² λ°μ΄ν°4 (λ€ λ²μ§Έ νμ΄μ§) 10 * (4 - 1) = 3031~40λ² λ°μ΄ν°
β οΈ sql μΆκ° μ μ£Όμν μ
sql +=λ₯Ό νμ©νμ¬ SQL λ€μ 쑰건문μ μΆκ°ν λ μμ 곡백μ μΆκ°ν΄μΌ SQL λ¬Έλ² μ€λ₯κ° λ°μνμ§ μμ΅λλ€.μμ :
sql += ' LIMIT ? OFFSET ?'
bookDetail : μ±
μ μμΈ μ‘°νν©λλ€.
books ν
μ΄λΈκ³Ό categories ν
μ΄λΈμ LEFT JOIN νμ¬, μ±
μ΄ μν μΉ΄ν
κ³ λ¦¬ μ 보λ₯Ό ν¨κ» κ°μ Έμ΅λλ€.μ΄μ μ νμ΄μ§λ€μ΄μ
μ μ§μ λ§λ€μμ λλ μ§μ κ³μ°κΉμ§ vanilla javascriptλ‘ μμ±μ νμλλ°, λ°±μλλ₯Ό νμ©νλ λμ± μμνλ€λ κ²μ λκΌμ΅λλ€.