Note ≣ ⎮ app.set과의 차이
app.set으로 익스프레스에서 데이터를 저장할 수 있다는 것을 배웠습니다. app.get 또는 req.app.get으로 어디서든지 데이터를 가져올 수 있습니다. 하지만 app.set을 사용하지 않고 res.locals 객체에 데이터를 넣어서 다음 미들웨어로 전달하는 이유가 있습니다. app.set은 익스프레스에서 전역적으로 사용되므로 하나의 요청 안에서만 유지되어야 하는 값을 넣기에는 부적절합니다. app.set은 앱 전체의 설정을 공유할 때 사용하면 됩니다.
res.locals 객체는 하나의 요청 안에서만 유지되므로 res.locals 객체를 통해 요청에 종속되는 데이터를 전달하는 것이 좋습니다.
미들웨어를 사용할 때 유용한 패턴 한 가지를 소개합니다. 미들웨어 안에 미들웨어를 넣는 방식입니다. 다음 예제의 두 방식은 같은 기능을 합니다.
app.use(morgan('dev')); // 또는 app.use((req, res, next) => { morgan('dev')(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); } });
앞으로 예제에서 위와 같은 패턴을 사용하는 경우를 볼 수 있습니다.