[NodeJS] 미들웨어 동작 원리

nakkim·2022년 4월 12일
0

미들웨어 동작 원리

Express는 자체적인 최소한의 기능을 갖춘 라우팅 및 미들웨어 웹 프레임워크이며, Express 애플리케이션은 기본적으로 일련의 미들웨어 함수 호출입니다.

미들웨어 함수는 요청(req), 응답(res), 다음 미들웨어 함수에 대한 액세스 권한(next)를 갖는다.

미들웨어는 요청과 응답의 중간에 위치하여 미들웨어라고 부른다.

라우터와 컨트롤러 또한 미들웨어의 일종이다.

미들웨어의 기능

  • 모든 코드를 실행
  • 요청 및 응답 오브젝트에 대한 변경
  • 요청-응답 주기를 종료
  • 스택 내의 다음 미들웨어 함수 호출

미들웨어 함수가 요청-응답 주기를 종료하지 않으면 next()를 호출하여 다음 미들웨어로 제어를 전달해야 한다.

→ 그렇지 않으면 해당 요청은 대기 상태로 방치됨

미들웨어 사용 예시

// 모든 요청에 대해 미들웨어 적용
app.use(middleware);

// '/url'로 시작하는 주소의 GET 요청에 대해 미들웨어 적용
app.get('/url', middleware, controller);
app.use((req, res, next) => {
	// ...
	next();
});

app.get('/url', (req, res, next) => {
	// ...
	next();
}, controller);
app.use((err, req, res, next) => {
	...
});

미들웨어는 위에서부터 순서대로 실행되면서 요청과 응답 사이에 여러 기능을 추가할 수 있다.

next라는 매개변수는 다음 미들웨어로 넘어가는 함수이다.

모든 미들웨어가 next()를 호출하는 것이 아니기 때문에, 미들웨어 작성 순서에 따라 특정 미들웨어 다음에 작성된 것들은 실행되지 않을 수 있다.

에러 처리 미들웨어는 (err, req, res, next)로 네 개다.

기본적으로 익스프레스가 에러를 처리하지만 실무에서는 직접 에러 처리 미들웨어를 연결하는 것이 좋다.

특별한 경우가 아니면 에러 처리 미들웨어는 가장 아래에 위치하도록 한다.

next 함수에 인수를 넣을 수도 있다.

  • next('route') - 다음 라우터의 미들웨어로 이동
  • route 외의 인수를 넣으면 에러 처리 미들웨어로 이동
    • 이 때의 인수는 에러 처리 미들웨어의 err 매개변수

미들웨어 간에 데이터를 전달하는 방법도 있다. (request-ip의 clientIp)

app.use((req, res, next) => {
	req.data = '데이터'; // 꼭 data일 필요는 x, 다른 미들웨어와 겹치지 않도록 조심
	next();
});
app.use(requestIp.mw());
app.use((req, res, next) => {
	console.log(req.data, clientIp); // 데이터 ${clientIp}
	next();
});

미들웨어 안에 미들웨어를 넣는 것이 가능하다.

app.use(미들웨어);

app.use((req, res, next) => {
	미들웨어(req, res, next);
});

// 예시
app.use((req, res, next) => {
	if (process.env.NODE_ENV === 'production')
		morgan('combined')(req, res, next);
	} else {
		morgan('dev')(req, res, next);
	}
});

Express 애플리케이션의 미들웨어 유형

  • 애플리케이션 레벨 미들웨어
  • 라우터 레벨 미들웨어
  • 오류 처리 미들웨어
  • 기본 제공 미들웨어(4.x 이후는 express.static이 유일)
  • 써드파티 미들웨어(morgan, cookie-parser 등)

유형별 설명은 아래 링크!

https://expressjs.com/ko/guide/using-middleware.html

profile
nakkim.hashnode.dev로 이사합니다

0개의 댓글