[Node.js] express 미들웨어의 종류

유진·2023년 9월 27일

Node.js

목록 보기
6/8

🎯미들웨어(Middleware) 정의

Express.js 안에서 요청과 응답 사이에 단계별 동작을 수행해주는 함수이다.



미들웨어(Middleware) 특징

  • middleware는 request, response 사이클 안에서 routing handler 함수가 가지고 있는 request 객체, response 객체, next 함수에 대한 접근이 가능한 함수다.
  • 미들웨어는 어떠한 코드도 실행 가능하다.
  • request, response 객체 수정이 가능하고 request response 사이클을 끝낼 수 있다.
  • 다음 미들웨어를 호출할 수 있다.
  • Client의 요청으로 Express 앱 내부에서 request response 사이클이 진행될 때마다 반드시 실행되어야 하는 코드들을 정의하기에 적합하다
  • middleware는 global 단위(모든 PATH), PATH 단위로 유연하게 등록이 가능하다.
  • 등록 순서에 따라 실행되기 때문에 주의해야한다.
  • 미들웨어의 유연성 덕분에 Express는 서드파티 미들웨어들이 매우 많다.


Route Handler

  • Route Handler도 미들웨어의 한 종류
  • Route Handler는 라우팅 함수(get, post, put, delete 등)에 적용된 미들웨어
  • 일반적인 미들웨어와는 다르게 path parameter를 사용할 수 있음


미들웨어 작성법

  • req, res, next를 매개변수로 가지는 함수를 작성
    • req는 HTTP 요청을 처리하는 객체
    • res는 HTTP 응답을 처리하는 객체
    • next는 다음 미들웨어를 실행하는 함수
      next() 함수가 호출되지 않으면 미들웨어 사이클이 멈추기 때문에 주의!
  • middleware 는 적용되는 위치에 따라서 어플리케이션 미들웨어, 라우터 미들웨어, 오류처리 미들웨어로 분류 가능
  • 필요한 동작 방식에 따라 미들웨어를 적용할 위치를 결정


어플리케이션 미들웨어

app.use((req, res, next) => {
	console.log(`Request ${req.path}`);
	next();	//1
});

app.use(auth);	//2

app.get('/', (req, res, next) => {
	res.send('Hello Express');	//3
});
  • use 나 http method 함수를 사용하여 미들웨어를 연결할 수 있음
  • 미들웨어를 모든 요청에 공통적으로 적용하기 위한 방법
  • HTTP 요청이 들어온 순간부터 적용된 순서대로 동작 함

라우터 미들웨어

router.use(auth);					//3

router.get('/', (req, res, next) => {
	res.send('Hello Router');		//4
});

app.use((req, res, next) => {
	console.log(`Request ${req.path}`);
	next();							//1
});

app.use('/admin', router);			//2
  • router 객체에 미들웨어가 적용되는 것 외에는 어플리케이션 미들웨어와 사용 방법은 동일
  • 특정 경로의 라우팅에만 미들웨어를 적용하기 위한 방법
  • app 객체에 라우터가 적용된 이후로 순서대로 동작함

미들웨어 서브 스택

app.use(middleware1, middlware2, ...);

app.use('/admin', auth, adminRouter);

app.get('/', logger, (req, res, next) => {
	res.send('Hello Express');
});
  • use 나 http method 함수에 여러 개의 미들웨어를 동시에 적용할 수 있음
  • 주로 한 개의 경로에 특정해서 미들웨어를 적용하기 위해 사용
  • 전달된 인자의 순서 순으로 동작

오류처리 미들웨어

app.use((req, res, next) => {
	if (!isAdmin(req)) {
		next(new Error('Not Authorized'));
		return;
	}
	next();
});

app.get('/', (req, res, next) => {
	res.send('Hello Express');
});

app.use((err, req, res, next) => {
	res.send('Error Occurred');
});
  • 오류처리 미들웨어는 일반적으로 가장 마지막에 위치하는 미들웨어
  • 다른 미들웨어들과는 달리 err, req, res, next 네 가지 인자를 가지며, 앞선 미들웨어에서 next 함수에 인자가 전달되면 실행됨
  • 이전에 적용된 미들웨어 중 next에 인자를 넘기는 경우 중간 미들웨어들은 뛰어넘고 오류처리 미들웨어가 바로 실행됨

함수형 미들웨어

const auth = (memberType) => {
	return (req, res, next) => {
		if (!checkMember(req, memberType)) {
			next(new Error(`member not ${memberType}`));
			return;
		}
		next();
	}
}


app.use('/admin', auth('admin'), adminRouter);

app.use('/users', auth('member'), userRouter);
  • auth 함수는 미들웨어 함수를 반환하는 함수
  • auth 함수 실행 시 미들웨어의 동작이 결정되는 방식으로 작성됨
  • 일반적으로 동일한 로직에 설정값만 다르게 미들웨어를 사용하고 싶을 경우에 활용됨


profile
도라에몽 암기빵

0개의 댓글