티스토리 뷰

백엔드/Node

Next() 메소드는 무엇이지?

홍수성찬 2021. 8. 9. 20:13

Node JS를 공부하면서 Next() 메소드를 사용하는 경우를 자주 보았다.

그리고 클론 프로젝트를 하면서 따라서 Next() 메소드를 사용했었다. 이 메소드가 무엇인지 모른 채로.

 

그리고 코드를 다시 보면서 Next() 메소드는 무엇이길래 쓰이는 거지? 궁금함이 생겼다.

그래서 구글 검색을 통해서 알아보기로 했다.

 

Node JS의 Express 공식 문서는 Next() 메소드를 미들웨어 함수로 보내진다고 작성되어 있다.

"그래서 이게 뭐냐고! 이게 무슨 역할을 하냐고!"

 

그래서 이를 잘 해석해준 블로그를 찾기로 했다.

한 블로그에서 공식 문서에서 이해하기 어려운 글을 쉽게 해석해서 올렸다.

https://kamang-it.tistory.com/entry/NodeJSExpress%EB%8F%84%EB%8C%80%EC%B2%B4-next%EB%A9%94%EC%86%8C%EB%93%9C%EC%9D%98-%EC%A0%95%EC%B2%B4%EB%8A%94-%EB%AD%98%EA%B9%8C

 

[NodeJS][Express]도대체 next메소드의 정체는 뭘까?

nodejs의 express를 사용하다보면 router를 사용하는 경우가 많다. 이 때 콜백 함수를 사용한다. 아래를 보자. router.get('/', function (req, res, next) { console.log('step2'); res.send('respond with a re..

kamang-it.tistory.com

 

이 블로그에서 Next() 메소드에 대해 쉽게 설명하자면 아래와 같다.

현재 라우터에서 판단하지 않고 다음 라우터로 넘기겠다!

그러나 위의 해석을 봐도 정확히 이해하기 어려웠다. 그래서 예시 코드를 보면서 이해가 필요했다.

 

var express = require('express');
var router = express.Router();

router.get('/', function(req, res, next) {
    console.log('oneStep');
    next();
});

module.exports = router;

위 로직 코드는 매우 간단하다. 코드에서 보이듯이 res를 사용해서 결과를 내보내지 않고 next를 사용해서 판단을 유보시킨다.

 

만약에 next를 사용하지 않고 res를 사용했다면 어떻게 로직을 작성했을까?

var express = require('express');
var router = express.Router();

router.get('/', function (req, res, next) {
    console.log('twoStep');
    res.send('respond with a resource');
});

module.exports = router;

위 코드처럼 res로 "respond with a resource"를 내보냈을 것이다.

 

next로 작성한 코드를 oneStep.js 이라고 하고 res로 작성한 코드를 twoStep.js 이라고 하자.

그리고 두 개의 파일을 실행하고 결과를 확인하면 아래와 같다.

 

var oneStep = require('./oneStep');
var twoStep = require('./twoStep');

app.use('/users', oneStep, twoStep);

 

위 코드를 실행하면 oneStep이 실행이 되고 twoStep이 실행이 된다. 이렇게 next를 사용하면 현재 판단하지 않고 다음 router로 떠넘긴다.

 

next에 파라미터를 넣는 순간 에러를 보이게 된다. 다만, next('router')에만 에러를 보이지 않는 특수한 경우가 있다.

 

정리를 하자면

next는 다음 라우터로 전이를 수행하게 하는 역할이다. 즉, 현재 라우터에서 응답을 하지 않고 바로 그 다음에 정의된 라우터로 행동을 떠넘기는 것이다.

 

더욱 쉬운 예로 확인을 하자면

router.get('/', function(req, res, next) {
	console.log('다른 라우터로 떠넘기기!');
    next();
});

router.get('/', function(req, res, next) {
	res.send('떠넘겨졌다!');
});

위 코드를 실행하면 떠넘겨졌다!가 출력이 된다.