티스토리 뷰

개발공부/🟩 Node.js

[NodeJS] Express와 MongoDB로 웹서비스 만들기 - 1 (2)

2022. 8. 2. 18:37

 

 

Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

 

 

 

 Async Request Handler 

 

▶ request handler의 오류처리 방법

 

-  promise().catch(next)

-  async function, try ~ catch, next

 

 

 

 

▶ async request handler

 

async의 비동기 처리는 매우 편리하지만 매번 try - catch 구문을 작성하는 것은 귀찮고 실수하기 쉬움

→  request handler를 async function으로 작성하면서 try ~ catch, next를 자동으로 할 수 있도록 구성한 아이디어

const asyncHandler = (requestHandler) => {
    return async (req, res, next) => {
        try {
        	await requestHandler(req, res);
        } catch (err) {			// 3. 여기서 catch되서
        	next(err);		// 4. 오류처리 미들웨어로 전달됨
        }
    }
}

---
router.get('/', asyncHandler(async (req, res) => {	// 1. requestHandler에서 
	const posts = await Posts.find({});
	if (posts.length < 1) { 
		throw new Error('Not Found');		// 2. 오류가 발생하면
	}
	res.render('posts/list', { posts });
});

 

-  asyncHandler 는 requestHandler를 매개변수로 갖는 함수형 미들웨어

:  전달된 requestHandler는 try ~ catch로 감싸져 asyncHandler내에서 실행되고, throw 되는 에러는 자동으로 오류처리 미들웨어로 전달되도록 구성됨

 

 

 

 

 

 

 

 Pagination 

 

▶ Pagination 이란?

 

데이터가 많아지면 한 페이지의 목록에 모든 데이터를 표현하기 어려움

→  Pagination은 데이터를 균일한 수로 나누어 페이지로 분리하는 것

 

(ex. 10개씩 나누어 1페이지에는 1~10번까지, 2페이지엔 11~20번까지 보여주기)

 

 

 

Express.js + Mongoose의 Pagination

router.get(... => {
    const page = Number(req.query.page || 1)
    const perPage = Number(req.query.perPage || 10)
...

-  page  :  현재 페이지

-  perPage  :  페이지 당 게시글 수

 

"/posts?page=1&perPage=10"  →  일반적으로 url query 를 사용해 전달

( !  query는 문자열로 전달되기 때문에 Number 로 형변환이 필요)

 

 

router.get(... => {
    ...   
    const total = await Post.countDocument({});	// 총 게시글 수 count
    
    const posts = await Post.find({}).sort({ createdAt: -1 })	// 데이터 생성시간 역순으로 정렬 (최신순 정렬)
    	.skip(perPage * (page - 1))	// perPage가 10이면 -> 1page는 skip 0개(data0~9), 2page는 skip 10개(data10~19), ...
    	.limit(perPage);
        
    const totalPage = Math.ceil(total / perPage);
    ...

-  MongoDB 의 limit과 skip을 사용하여 pagination 구현 가능

-  limit  :  검색 결과 수 제한 (한 페이지에 보일 자료의 개수 제한)

-  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 태그로 굵게 표시

 

 

 

 

 

 

 

 PM2 Process Manager 

 

▶ PM2 란?

 

:  Node.js 작업을 관리해주는 Process Manager

 

node 명령어로 실행 시 오류 발생이나 실행상태 관리를 할 수 없음

→  pm2 는 작업 관리를 위한 다양한 유용한 기능을 제공

 

 

 

▶ PM2를 사용하는 이유

 

-  안정적인 프로세스 실행  :  오류발생 시 자동 재실행

-  빠른 개발환경  :  소스 코드 변경 시 자동 재실행

-  배포 시 편리한 관리  :  pm2 에 모든 프로세스를 한 번에 관리

 

 

 

▶ PM2 사용 방법

 

1)  명령어를 이용하여 pm2 설정파일 예제를 만들 수 있음

pm2 init simple  혹은  pm2 init  

 

2)  예제를 수정하여 설정파일을 생성한 후

 pm2 start  명령어를 실행하면 어플리케이션을 pm2 데몬으로 실행

 

3)  개발 시 watch 옵션 사용하여 파일 변경 시 서버 자동 재실행 구성

module.exports = {
    apps : [{
        name: 'simple-board',
        script: './bin/www',
        watch: '.',
        ignore_watch: 'views',
    }],
};
---
$ pm2 start

 

 

 

 

 


이 글은 엘리스 AI트랙 5기 강의를 들으며 정리한 내용입니다.

반응형
프로필사진
개발자 삐롱히

프론트엔드 개발자 삐롱히의 개발 & 공부 기록 블로그