ExpressJS는 앱 그 자체이고, 앱이면서 서버이다.
그리고 모든 것이 미들웨어이다. Express의 핵심이고 앱의 핵심이고 가장 중요한 것이 미들웨어다.
전체 코드 미들웨어의 동작 방식을 이해해야 구조와 설계가 보인다.
1. 미들웨어란 ?
- 기능, 구체적으로 애플리케이션으로 들어오는 HTTP 요청 위에서 동작하는 기능을 캡슐화하는 방법이다.
- 현실적으로는 요청객체, 응답객체, next() 함수의 세가지 매개변수를 받는 고차함수이다. (에러받는거는 나중에 설명)
- 미들웨어는 파이프라인 안에서 실행된다. 순서가 중요하다.
- app.use()를 사용해 파이프라인에 미들웨어를 삽입한다.
- 파이프라인의 마지막 미들웨어는 이전 라우트와 일치하지 않는 요청을 모두 받는 폴백 핸들러로 만드는 것이 일반적이다.
- 미들웨어에서 next()를 호출하지 않으면 요청은 해당 미들웨에서 종료된다.
2. 미들웨어의 원칙
- app.get, app.post 등의 라우터 핸들러는 GET, POST같은 특정 HTTP 동사만 처리하는 미들웨어이다.
- 반대로 미들웨어는 HTTP 동사 전체를 처리하는 라우트 핸들러라고 생각한다.
- 일반적인 동사에서는 app.all() 과 동등하다.
- 라우트 핸들러는 첫 번째 매개변수로 경로를 받는다. 미들웨어 역시 첫 번째 매개변수로 경로를 받을 수 있지만, 옵션이다.
- 라우트 핸들러와 미들웨어는 2~4개의 매개변수가 있는 콜백 함수이다.
- 2개 : req, res
- 3개 : req, res, next
- 4개 : err, req, res, next (오류 처리용 미들웨어)
- next()를 호출하지 않는다면 응답을 보내야한다.
- next()를 호출했다면, 응답을 보내지 않는 편이 좋다.
3. 미들웨어의 예제
- 세가지 미들웨어 예제이다.
- 첫번째 미들웨어에서 next()를 호출하여 다음으로 넘어갔다.
- 두번째 미들웨어에서 res.send를 통해 클라이언트에 응답을 했다. 여기서 종료된다.
- 그래서 세번째 미들웨어는 실행되지 않는다.
4. 복잡한 예제(이거 읽으면 라우트 마스터)
- 미들웨어의 매개변수가 4개인 경우 (예: (err, req, res, next)) 에러 핸들링 미들웨어다.
next()와 next(err) 사이의 차이점 :
- next(): 이 함수를 호출하면 제어가 다음 미들웨어 또는 라우트 핸들러로 전달. 이 경우 에러는 전달되지 않는다. 일반적인 미들웨어에서 이 함수를 호출하여 요청-응답 처리가 계속 진행되도록 한다.
- next(err): 이 함수를 호출하면 제어가 다음 에러 핸들링 미들웨어로 전달된다. err 매개변수를 통해 에러 객체가 전달되며, 이 함수를 사용하여 에러를 처리하거나 다음 에러 핸들링 미들웨어로 전달할 수 있다.
예시
1. 일반 미들웨어에서 next()를 호출하면, 제어는 다음 일반 미들웨어나 라우트 핸들러로 전달됩니다. 이 경우 에러는 발생하지 않았거나 아직 처리되지 않았습니다.
2. 에러 핸들링 미들웨어에서 next()를 호출하면, 제어는 다음 에러 핸들링 미들웨어로 전달됩니다. 이 경우 에러는 처리되지 않고 다음 에러 핸들링 미들웨어로 전달됩니다.
3. 에러 핸들링 미들웨어에서 next(err)를 호출하면, 제어는 다음 에러 핸들링 미들웨어로 전달되고, 에러 객체도 함께 전달됩니다. 이 함수를 사용하여 에러를 처리하거나 다음 에러 핸들링 미들웨어로 전달할 수 있습니다.
5. 널리 쓰이는 미들웨어
- basicauth-middleware : 기본적인 접근 인증을 제공. 가장 기본적인 보안만 포함된다. HTTPS를 사용하는데, 빠르고 쉽게 처리할 일이 있을 경우에 사용한다.
- body-parser : HTTP 요청 바디를 분석한다.
- busboy, multiparty, formidable, multer : 파일 업로드에 관한 미들웨어
- compression : 응답데이터를 gzip 또는 deflate로 압축한다. 응답을 보내는 다른 미들웨어보다 먼저 연결해야한다. 실무에서는 NGINX같은 프록시서버에서 압축을 처리하므로 잘 안쓴다.
- cookie-parser : 쿠키 처리
- cookie-session : 쿠키 기반 세션 지원
- express-session : 세션ID를 쿠키에 저장하는 세션 지원
- scurf : CSRF 공격 대비 지원, 세션을 사용하므로 express-session 뒤에 위치해야 한다.
- serve-index : 정적 파일의 디렉터리 리스트를 제공
- errorhandler : 클라이언트에 스택 추적과 오류 메시지를 제공. 실무서버에서는 사용하지 않아야 한다.
- serve-favicon :파비콘을 전송한다. 원래는 favicon.ico를 정적파일을 담은 디렉터리에 두면 되지만, 이걸 쓰면 성능이 향상된단다.
- morgan : 자동 로그를 지원한다. 모든 요청을 전부 기록한다.
- method-override : x-http-method-override 요청 헤더를 지원한다. 디버깅에 유용하며, API를 만들 때만 필요하다.
- response-time : 응답에 X-Response-Time 헤더를 추가해서 응답시간을 밀리초 단위로 제공한다. 성능 튜닝에 사용된다.
- static : 정적 파일 전송을 지원한다. 여러번 연결할 수 있다.
- vhost : 서브도메인을 관리하기 쉽게 만든다.
'더이상 하지 않는 Backend - NodeJS > Node-Express 개론(완)' 카테고리의 다른 글
[O'REILLY] Node & Express - 12장 : 실무 환경 (0) | 2023.04.05 |
---|---|
[O'REILLY] Node & Express - 11장 : 이메일 전송 (0) | 2023.04.04 |
[O'REILLY] Node & Express - 9장 : 쿠키와 세션 (0) | 2023.04.03 |
Node-Express 서버에서 CSRF 공격을 방어하는 방법 (0) | 2023.03.31 |
[O'REILLY] Node & Express - 8장 : 폼 처리 - 3 (파일 업로드) (0) | 2023.03.31 |
댓글