elice/WIL

[week_06] asyncHandler, Pagination, PM2 Process Manager

๊ฑด๋ง๋”” 2022. 2. 18. 18:25

1. asyncHandler

  • request handler๋ฅผ async function์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉด์„œ try ~ catch, next๋ฅผ ์ž๋™์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ•œ ์•„์ด๋””์–ด
  • requestHandler๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ–๋Š” ํ•จ์ˆ˜ํ˜• ๋ฏธ๋“ค์›จ์–ด
  • ์ „๋‹ฌ๋œ requestHandler๋Š” try ~ catch๋กœ ๊ฐ์‹ธ์ ธ asyncHandler ๋‚ด์—์„œ ์‹คํ–‰
  • throw๋˜๋Š” ์—๋Ÿฌ๋Š” ์ž๋™์œผ๋กœ ์˜ค๋ฅ˜์ฒ˜๋ฆฌ ๋ฏธ๋“ค์›จ์–ด๋กœ ์ „๋‹ฌ๋˜๋„๋ก ๊ตฌ์„ฑ๋จ
const asyncHandler = (requestHandler) => {
	return async(req, res, next) => {
    	try {
        	await requestHandler(req, res);
        } catch(err) {
        	next(err);
        }
    }
}


// ---------------------------------------


router.get('/', asyncHandler(async (req, res) => {
	const posts = await Posts.find({});
    if(posts.length < 1) {
    	throw new Error('Not Found');
    }
    res.render('posts/list', {posts});
});

 

2. Pagination

  • ๋ฐ์ดํ„ฐ๋ฅผ ๊ท ์ผํ•œ ์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด ํŽ˜์ด์ง€๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ
rouger.get(... => {
	// ํ˜„์žฌ ํŽ˜์ด์ง€
	const page = Number(req.query.page || 1)
    // ํŽ˜์ด์ง€ ๋‹น ๊ฒŒ์‹œ๊ธ€ ์ˆ˜
    const perPage = Number(req.query.perPage || 10)
})
  • ์ผ๋ฐ˜์ ์œผ๋กœ url query๋ฅผ ์‚ฌ์šฉํ•ด ์ „๋‹ฌ ๐Ÿ‘‰ /posts?page=1&perPage=10
  • MongoDB์˜ limit๊ณผ skip์„ ์‚ฌ์šฉํ•˜์—ฌ pagination ๊ตฌํ˜„ ๊ฐ€๋Šฅ
router.get(... => {
	...
    const total = await Post.countDocument({});
    const posts = await Post.find({})
    	.sort({createdAt: -1})
        .skip(perPage * (page -1))
        .limit(perPage);
    const totalPage = Math.ceil(total / perPage);
    ...
})
  • limit = ๊ฒ€์ƒ‰ ์ˆ˜ ์ œํ•œ (perPage)
  • skip = ๊ฒ€์ƒ‰ ์‹œ ํฌํ•จํ•˜์ง€ ์•Š์„ ๋ฐ์ดํ„ฐ ์ˆ˜
  • pagination ์‹œ์—๋Š” ๋ฐ์ดํ„ฐ์˜ ์ˆœ์„œ๊ฐ€ ์œ ์ง€๋  ์ˆ˜ ์žˆ๋„๋ก sort๋ฅผ ์‚ฌ์šฉ
  • ๊ฒŒ์‹œ๊ธ€ ์ˆ˜ / ํŽ˜์ด์ง€ ๋‹น ๊ฒŒ์‹œ๊ธ€ ์ˆ˜ = ์ด ํŽ˜์ด์ง€ ์ˆ˜
mixin pagination(path)
  p
    - for (let i = 1; i <= totalPage; i++)
    a(href=`${path}?page=${i}&perPage=${perPage}`)
      if i == page
        b= i
      else
        = i
      = " "
      
      
 // --------
 include pagination
 tr
   td
     +pagination("/posts")
  • pagination์„ mixin์œผ๋กœ ์„ ์–ธ
  • pagination์ด ํ•„์š”ํ•œ ํŽ˜์ด์ง€์—์„œ ํ•ด๋‹น ํ…œํ”Œ๋ฆฟ์„ includeํ•œ ํ›„, +pagination์œผ๋กœ mixin์„ ์‚ฌ์šฉํ•จ
  • ํ˜„์žฌ ํŽ˜์ด์ง€๋Š” bํƒœ๊ทธ๋กœ ๊ตต๊ฒŒ ํ‘œ์‹œ

 

3. PM2 Process Manager

  • Node.js์˜ ์ž‘์—…์„ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” Process Manager
  • ์ž‘์—… ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๋‹ค์–‘ํ•˜๊ณ  ์œ ์šฉํ•œ ๊ธฐ๋Šฅ ์ œ๊ณต
  • ์•ˆ์ •์ ์ธ ํ”„๋กœ์„ธ์Šค ์‹คํ–‰, ๋น ๋ฅธ ๊ฐœ๋ฐœํ™˜๊ฒฝ, ๋ฐฐํฌ ์‹œ ํŽธ๋ฆฌํ•œ ๊ด€๋ฆฌ ๋“ฑ์˜ ์žฅ์ 
module.exports = {
	apps : [{
    	name: 'simple-board', // ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค ์ด๋ฆ„ ์„ค์ •
        script: './bin/www', // ์‹คํ–‰๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ, =npm start
        watch: '.', // ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ „๋ถ€ ๋ฐ”๋ผ๋ณด๊ฒ ๋‹ค
        ignore_watch: 'views', // views ๋””๋ ‰ํ„ฐ๋ฆฌ ์•ˆ์˜ ๋ถ€๋ถ„๋“ค์€ ๋ณ€๊ฒฝ ๋˜์–ด๋„ ํ”„๋กœ์ ํŠธ ์žฌ์‹คํ–‰ x
    }],
};
$ pm2 start
  • $ pm2 init simple ํ˜น์€ pm2 init ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ pm2 ์„ค์ •ํŒŒ์ผ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  • ์˜ˆ์ œ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ์„ค์ •ํŒŒ์ผ ์ƒ์„ฑํ›„ pm2 start ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ pm2 ๋ฐ๋ชฌ์œผ๋กœ ์‹คํ–‰
  • ๊ฐœ๋ฐœ ์‹œ watch ์˜ต์…˜ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ ๋ณ€๊ฒฝ ์‹œ ์„œ๋ฒ„ ์ž๋™ ์žฌ์‹คํ–‰ ๊ตฌ์„ฑ