본문 바로가기
더이상 하지 않는 Backend - NodeJS/Node-Express 개론(완)

[O'REILLY] Node & Express - 10장 : 미들웨어

by VictorMeredith 2023. 4. 3.

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 : 서브도메인을 관리하기 쉽게 만든다.

 

댓글