๐ฅ ๋ฐ์ํ ๋ฌธ์
getBoards ํจ์๋ ์นดํ ๊ณ ๋ฆฌ์ ํด๋นํ๋ ๊ฒ์๊ธ ์ ์ฒด๋ฅผ ํ์ด์ง ์ฒ๋ฆฌํ๊ธฐ ์ํ ํจ์๋ค. (๊ฐ๋ ์ฑ์ ์ํด ๊ด๋ จ ์๋ ์ฝ๋ ์ผ๋ถ ์๋ต)
/* ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ์ํ ํจ์๋ค(์ฐธ๊ณ ์ฉ)
const getPagination = (page, size) => {
const limit = size ? +size : 10; // ๊ฐ์ ธ์ฌ ๋ฐ์ดํฐ ์
const offset = page ? page * limit : 0; // ๊ฐ์ ธ์ฌ ๋ฐ์ดํฐ์ ์ด๊ธฐ ์์น๊ฐ
return { limit, offset };
};
const getPagingData = (data, page, limit) => {
// count: where ์ , ์ฐ๊ฒฐ ๊ด๊ณ ๋ฑ์ ์กฐ๊ฑด์ ๋ถํฉํ๋ ๋ ์ฝ๋์ ์ ์ฒด ๊ฐ์
// rows: where ์ , ์ฐ๊ฒฐ ๊ด๊ณ ๋ฑ์ ์กฐ๊ฑด์ ๋ถํฉํ๋ ๋ ์ฝ๋ค๋ค์ limit, offset ๋ฒ์ ๋ด์์ ๋ด์๋ธ ๊ฐ์ฒด ๋ฐฐ์ด
const { count: totalItems, rows: objArr } = data;
const currentPage = page ? +page : 0;
const totalPages = Math.ceil(totalItems / limit);
return { totalItems, objArr, totalPages, currentPage };
};
*/
async getBoards(category, page, size) {
const { limit, offset } = getPagination(page, size);
// findAndCountAll - ๋ณต์์ ์์๋ฅผ ๊ฒ์ํ๊ณ , ํด๋นํ๋ ๋ฐ์ดํฐ(rows)์ ๊ทธ ๊ฐฏ์(count)๋ฅผ ๋ฐํ
let boards = await Board.findAndCountAll({
include: [
{
// board ํ
์ด๋ธ๊ณผ hashtag ํ
์ด๋ธ์ ๊ด๊ณ N:M
model: Hashtag,
attributes: ['title'],
through: {
attributes: [],
},
},
],
where: {
category,
},
order: [['createdAt', 'DESC']],
offset,
limit,
});
boards = getPagingData(boards, page, limit);
return boards;
},
Sequelize์ findAndCountAll ๋ฉ์๋๋ count(where ์ , ์ฐ๊ฒฐ ๊ด๊ณ ๋ฑ์ ์กฐ๊ฑด์ ๋ถํฉํ๋ ๋ ์ฝ๋์ ์ ์ฒด ๊ฐ์)๋ฅผ ๋ฐํํ๋ค. ํ์ง๋ง postman์ ํตํด ๋ด๊ฐ ์์ฑํ api์ ์์ฒญํด๋ณธ ๊ฒฐ๊ณผ ์ค์ DB์์๋ ์กฐ๊ฑด์ ๋ถํฉํ๋ ๋ ์ฝ๋๊ฐ 10๊ฐ๋ฟ์ธ๋ฐ ๋ฐํ๋ count๋์ค์ ๋ณด๋ค ๋ ๋ง์ด ์นด์ดํ ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋คโ๏ธ
์์ธ ๋ถ์
- ์ฝ๋์์ผ๋ก๋ ๋ฌธ์ ๊ฐ ์์ด ๋ณด์ฌ ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ํ ๋ค๋ฅธ api์ ์์ฒญํด๋ณธ ๊ฒฐ๊ณผ count๊ฐ ์ ๋ฐํ๋๋ค. ์ ์ด๊ฒ๋ง..?
- ๊ฒ์์ ํด๋ณด๋ ์ฐ๊ด ๋ชจ๋ธ์ด ํฌํจ๋ ๊ฒฝ์ฐ ์ด๋ฌํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค๋ ๊ฒ์ ์ฌ๋ฌ ๊ธ์์ ๋ฐ๊ฒฌํ๋ค.
- include ์ต์ ์ ์ ๊ฑฐํ๋ ๋ด๊ฐ ์์ฑํ api ๋ํ ์์๋๋ก count๊ฐ ์ ๋ฐํ๋๋ค. ์ด๋์ด.. ๋ฒ์ธ..
๐งฏ ํด๊ฒฐ ๋ฐฉ๋ฒ
include ์ต์ ์ ์ ๊ฑฐํด๋ ๋์ง๋ง ๊ฒ์๊ธ์ ๊ด๋ จ๋ ํด์ํ๊ทธ ์ ๋ณด๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ ์กฐ์ธ์ ์ ๊ฑฐํ์ง ์๊ณ distinct: true๋ฅผ ์ถ๊ฐํจ์ผ๋ก์จ ์ด๋ฒ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๋ค.
async getBoards(category, page, size) {
const { limit, offset } = getPagination(page, size);
let boards = await Board.findAndCountAll({
include: [
{
model: Hashtag,
attributes: ['title'],
through: {
attributes: [],
},
},
],
where: {
category,
},
order: [['createdAt', 'DESC']],
offset,
limit,
// distinct: true๋ฅผ ์ถ๊ฐํ๋ฉด ์ฐ๊ด ๋ชจ๋ธ์ ํฌํจํ๋๋ผ๋ ์ํฅ์ ๋ฐ์ง ์๊ณ count๊ฐ ์ ๋ฐํ๋๋ค.
distinct: true,
});
boards = getPagingData(boards, page, limit);
return boards;
},