Backend/Sequelize

[Sequelize] Sequelize findAndCountAll ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ ์‹œ count๊ฐ€ ์˜ˆ์ƒ๋ณด๋‹ค ๋” ๋งŽ์ด ์นด์šดํŒ… ๋˜๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ

_์„ฑํ˜ธ_ 2023. 6. 29. 23:54
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ”ฅ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ

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

 

๐Ÿ“š ์ฐธ๊ณ ํ•œ ์‚ฌ์ดํŠธ

 

Model Querying - Finders | Sequelize

Finder methods are the ones that generate SELECT queries.

sequelize.org

 

Sequelize findAndCountAll returns wrong count when association models included · Issue #9481 · sequelize/sequelize

What are you doing? I have Post model. Post model has attachment(oneToMany),users(oneToMany), I'm trying to fetch posts with attachments using sequelize findAndCountAll // POST MODEL module.exports...

github.com

 

Sequelize ๊ณต์‹ Document - (1) Model Usage

ํ•ด์„๊ณผ ์„ค๋ช…์„ ๊ณ๋“ค์ธ Sequelize ๋„ํ๋จผํŠธ ์ •๋ณต, ๊ทธ 1ํŽธ

velog.io