middleware 란 무엇일까?
미들웨어 함수는 요청 객체 ( req), 응답 객체 ( res) 및 next애플리케이션의 요청-응답주기에 있는 함수에 액세스 할 수 있는 함수입니다. 이 next기능은 Express 라우터의 기능으로 호출시 현재 미들웨어에 이어 미들웨어를 실행합니다.
middleware는 client에서 서버에게 요청을 보냈을 때 이에 응답하는 메소드에 도달하기 전
서버에 요청이 왔을 때 실행되는 함수다. middleware는 app.use()
의 안에 실행되는 함수다.
좀 더 자세히 알아보자.
const express = require('express');
const app = express();
const cors = require('cors');
const port = 83;
app.use(cors());
app.use(express.json());
app.use((req, res, next) => {
console.log('middleware 입니다.');
next();
})
app.get('/', (req, res) => {
console.log('get입니다.');
res.status(200).json('환영합니다.');
}
app.use((req, res, next) => {
console.log('middleware 404입니다.');
res.status(404).json('404 Not Found');
})
app.listen(port, () => {
console.log(`Server Start! | http://localhost:${port}`);
})
이런 get요청만 받을 수 있는 간단한 서버로 알아보면
여기서 middleware는 정확히는 4개지만 알아봐야 할 middleware 함수는 2개다.
app.use((req, res, next) => {
console.log('middleware 입니다.');
next();
})
app.use((req, res, next) => {
console.log('middleware 404입니다.');
res.status(404).json('404 Not Found');
})
이 두 함수가 살펴 볼 middleware이다.
우선 첫번째 함수를 살펴보자
app.use()
에 있는 함수는 middleware 함수라고 볼 수 있다.
const app = express();
의 선언에서 app은 Express의 기능을 가진 서버와 같다.
app의 메소드는 express에서 나온 것이다.
app.use()
안에 함수를 넣으면 express 에 함수를 등록시키게 된다.
서버에 어떠한 요청이 왔을때 자동적으로 요청 메소드에 도착하기 전에
이 express에 등록한 middleware이 먼저 실행되고 나서 요청의 해당 메소드로 전달하게 된다.
여기서는 "middleWare입니다."의 콘솔을 찍고나서 next()가 호출되고 호출되고서
다음 app.use()가 app.get() 이전에 없다면 next()는 app.get()을 가리키게 된다.
만약 app.use()가 app.get() 이전에 있다면 next()는 app.use()를 가리키게 된다.
체인처럼 이어갈 수 있다.
middleware를 요청 메소드 이전에서 호출 될 수 있기 때문에 이때 실행해야 할 로직이 있다면
middleware를 사용하면 편리하다.
middleware를 요청 메소드 이전에 사용한다면 반드시 요청 메소드로 next()로 전달해줘야 한다.
그렇지 않으면 메소드로 전달하지 못해서 클라이언트는 요청이 보내지고 있다는 무한로딩이 되는
화면을 보게 될 것이다.
"middleware입니다."를 콘솔창에 찍는 middleware가 app.get() 아래로 간다면 어떻게 될까?
그렇게 되면 middleware보다 app.get()이 먼저 실행되어 "middleware 입니다" 콘솔은 찍히지 않는다.
get에서 응답을 보낸 시점으로 서버는 할일을 끝냈기 때문이다. 더이상 코드가 진행되지 않는다.
두번째 함수
app.use((req, res, next) => {
console.log('middleware 404입니다.');
res.status(404).json('404 Not Found');
})
이 함수는 middleware를 이용해서 404 에러처리를 하는 함수다.
여기서는 next를 인자로 가지고 있지만 자체적으로 응답을 보내고 있기 때문에 따로
메소드에 next로 전달하지 않아도 된다.
404에러는 express에서 관리하기 때문에 위치는 어디에 넣어도 좋지만
get메서드 다음에 위치하는게 전체적인 로직이 진행하는데 수월하다.
get메서드 다음에 위치해도 어차피 get 요청 메서드로 받을 수 없기때문에
다음으로 코드가 넘어가면 그때 그 요청을 404의 에러로 내보내게 되는 것이다.
이렇게 middleware를 이용해 요청 메소드 이전 이후에 호출할 함수를 지정할 수 있다.
그래서 middleware의 위치가 정말 중요하다.
요청이 올때마다 반복해서 작업해야 할 로직이 있다면 middleware로 등록하고 사용하면 된다.