2월 18일 자 학습 내용 정리입니다.
✅ Middleware
미들웨어(Middleware)는 HTTP 요청과 응답 사이에서 단계별 동작을 수행해주는 함수이다.
Express.js의 미들웨어는 HTTP 요청이 들어온 순간부터 시작되며 미들웨어는 HTTP 요청과 응답 객체를 처리하거나 다음 미들웨어를 실행할 수 있다.
HTTP 응답이 마무리될 때까지 미들웨어 동작 사이클이 실행된다.
✅ 미들웨어 작성
기본적으로 req, res, next를 가진 함수를 작성하면 해당 함수는 미들웨어로 동작할 수 있다.
이때 req, res는 각각 HTTP 요청과 응답을 처리하는 객체이고 next는 다음 미들웨어를 실행하는 함수이다.
const middleware = (req, res, next) => {
...
next();
}
미들웨어는 req, res 객체를 통해 HTTP 요청과 응답을 처리하거나 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);
예를 들어 API 별로 사용자의 권한을 다르게 제한하고 싶은 경우 사용자의 권한을 제한하는 미들웨어 하나를 작성하고 사용자의 권한을 미들웨어에 넘기면서 체크하도록 한다.
✅ 미들웨어 사용
미들웨어는 적용되는 위치에 따라 어플리케이션 미들웨어, 라우터 미들웨어, 오류처리 미들웨어 등으로 나뉜다.
따라서 필요한 동작 방식에 따라 미들웨어를 적용할 위치를 결정한다.
✔️ 어플리케이션 미들웨어
// 1
app.use((req, res, next) => {
console.log(`Request ${req.path}`);
next();
});
// 2
app.use(auth);
// 3
app.get('/', (req, res, next) => {
res.send('Hello Express');
});
use나 http method 함수를 사용해 미들웨어를 연결할 수 있다.
미들웨어를 모든 요청에 공통적으로 적용하기 위한 방법이며 HTTP 요청이 들어온 순간부터 적용된 순서대로 동작한다.
✔️ 라우터 미들웨어
// 3
router.use(auth);
// 4
router.get('/', (req, res, next) => {
res.send('Hello Router');
});
// 1
app.use((req, res, next) => {
console.log(`Request ${req.path}`);
next();
});
// 2
app.use('/admin', router);
router 객체에 미들웨어가 적용되는 것 외에는 어플리케이션 미들웨어와 동일하다.
라우터 미들웨어는 특정 경로의 라우팅에만 미들웨어를 적용하기 위한 방법으로 app 객체에 라우터가 적용된 이후 순서대로 동작한다.
✔️ 오류처리 미들웨어
// 1
app.use((req, res, next) => {
if (!isAdmin(req)) {
next(new Error('Not Authorized'));
return;
}
next();
});
app.get('/', (req, res, next) => {
res.send('Hello Express');
});
// 2(에러 넘겼을 시)
app.use((err, req, res, next) => {
res.send('Error Occurred');
});
일반적으로 가장 마지막에 위치하는 미들웨어이다.
다른 미들웨어들과 달리 err, req, res, next의 네 가지 인자를 가지며 앞선 미들웨어에서 next함수에 인자가 전달되면 실행된다.
이 경우 다른 미들웨어들을 건너뛰고 오류처리 미들웨어가 바로 실행된다.
✔️ 미들웨어 서브스택
app.use(middleware1, middlware2, ...);
app.use('/admin', auth, adminRouter);
app.get('/', logger, (req, res, next) => {
res.send('Hello Express');
});
use나 http method 함수에 여러 개의 미들웨어를 동시에 적용할 수 있다.
주로 한 개의 경로에 특정해 미들웨어를 적용하기위해 사용되며 전달된 인자의 순서로 동작한다.
✅ JSON
JSON(JavaScript Object Notation)은 자바스크립트에서 객체를 표현하는 표현식으로 시작했다.
웹 API는 기본적으로 데이터를 문자열로 전송하는데 이때 객체를 웹 API를 통해 문자열로 전달하기 위해 JSON이 사용되었다.
JSON은 데이터를 표현하는 방법이 단순하고 이해하기 쉽다.
JSON에서 Object는 { "key" : value }로 표현한다.
value는 문자열, 숫자, JSON 객체 등 어떤 값이라도 사용할 수 있다.
JSON에서 Array는 [item1, item2,...]로 표현한다.
item에는 문자열, 숫자, JSON 객체 등 어떤 값이라도 사용할 수 있다.
express.js는 기본적으로 HTTP body에 전달되는 JSON 데이터를 처리하지 못한다.
따라서 express에서 기본적으로 제공해 주는 express.json() 미들웨어를 사용해 JSON 데이터를 읽고 처리한다.
const express = require('express');
const app = express();
app.use(express.json());
'엘리스 AI 트랙 4기 > elice AI track' 카테고리의 다른 글
[5주차] Mongoose ODM - (1) (0) | 2022.02.19 |
---|---|
[5주차] NoSQL과 MongoDB (0) | 2022.02.19 |
[5주차] Express.js (0) | 2022.02.18 |
[5주차] 웹과 웹 프레임워크 (0) | 2022.02.18 |
[5주차] Node.js 모듈 (0) | 2022.02.16 |
댓글