Express
Express는 nodeJS를 활용하여 REST 서버를 구현하게 해주는 프레임워크에 해당한다.
사용 방법
가장 단순하게 html을 통해 서버 렌더링을 하는 코드는 다음과 같다.
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.render("렌더링 할 html의 경로")
});
app.listen(port, () => {
console.log(`server is listening at port:${port}`);
});
우선 다음코드는 Express application을 생성한다.
const express = require('express')
const app = express()
express에서는 다양한 미들웨어 함수를 제공하고 있다.
이 때 미들웨어란 클라이언트와 서버 사이에서 목적에 맞게 처리를 진행하는 장치를 의미한다.
즉, 미들웨어 함수란 클라이언트와 서버 사이에서 목적에 맞는 기능을 하는 함수
를 말한다.
미들웨어 함수는 요청 오브젝트
인 req와 응답 오브젝트
인 res, 그리고 애플리케이션의 요청-응답 주기 중 그 다음의 미들웨어 함수
에 대한 액세스 권한을 갖는 함수이다.
미들웨어 함수는 다음과 같은 태스크를 수행할 수 있다.
- 모든 코드를 실행한다.
- 요청 및 응답 오브젝트에 대한 변경을 실행한다.
- 요청-응답 주기를 종료한다
- 스택 내의 그 다음 미들웨어 함수를 호출한다.
만약 현재의 미들웨어 함수가 '요청-응답 주기를 종료한다' 에 해당하지 않는 경우 next()를 호출하여 그 다음 미들웨어 함수에 제어를 전달하며, 그렇지 않은 경우 해당 요청이 정지된 채로 방치되게 된다. 그림으로 표현하면 다음과 같다.
즉, 미들웨어는 두 가지 선택지를 가지고 있는데 하나는 response를 만들어 호출을 종료하고 요청에 대한 응답을 돌려보내는 것이고 하나는 next()를 통해 다음 미들웨어에게 제어 흐름을 넘겨주는 것이다.
Express는 다음과 같은 유형의 미들웨어를 사용할 수 있다.
- 애플리케이션 레벨 미들웨어
- 라우터 레벨 미들웨어
- 오류 처리 미들웨어
- 기본 제공 미들웨어
- 써드파티 미들웨어
앞서 정의한 app 객체의 use()함수를 사용하면 미들웨어를 앱 오브젝트의 인스턴스에 바인드 할 수 있다.
var app = express();
app.use(function (req, res, next) {
console.log('Time:', Date.now());
next();
});
위 코드에서 함수는 앱이 요청을 수신할 때 마다 실행된다.
다음과 같은 예시에서는 /user/:id 경로에 마운트되는 미들웨어 함수를 보여준다.
```javascript
app.use('/user/:id', function (req, res, next) {
console.log('Request Type:', req.method);
next();
});
다음 예시는 /user/:id 경로에 대한 GET 요청을 처리하는 미들웨어 하위 스택이 표현되어 있다.
app.get('/user/:id', function (req, res, next) {
console.log('ID:', req.params.id);
next();
}, function (req, res, next) {
res.send('User Info');
});
// handler for the /user/:id path, which prints the user ID
app.get('/user/:id', function (req, res, next) {
res.end(req.params.id);
});
라우터 미들웨어 스택의 나머지 미들웨어 함수들을 건너 뛰려면 next('route')를 호출하여 제어를 그 다음 라우트로 전달하면 된다.
단, next('route')는 app.METHOD() 또는 router.METHOD() 함수를 이용해 로드된 미들웨어 함수에서만 작동한다.
app.get('/user/:id', function (req, res, next) {
// if the user ID is 0, skip to the next route
if (req.params.id == 0) next('route');
// otherwise pass the control to the next middleware function in this stack
else next(); //
}, function (req, res, next) {
// render a regular page
res.render('regular');
});
// handler for the /user/:id path, which renders a special page
app.get('/user/:id', function (req, res, next) {
res.render('special');
});
이러한 미들웨어를 사용하는 이유는 다음과 같다.
- 요청 및 응답 객체 수정: 미들웨어 함수는 요청 객체나 응답 객체를 수정하거나 확장할 수 있다. 예를 들어, 요청 객체에 추가 적인 정보를 추가할 수 있다.
- 라우팅 결정 : 특정 경로나 조건에 따라 요청을 다른 핸들러 함수로 라우팅할 수 있다.
- 요청 데이터 처리: 요청의 body를 파싱하거나 쿼리 매개변수(주로 URL을 통해 제공되는 매개변수)를 추출하는 등의 작업이 가능하다.
'JavaScript' 카테고리의 다른 글
(JavaScript) Fetch API (0) | 2023.09.07 |
---|---|
MySQL 개념 (1) | 2023.09.04 |
Firebase 사용 방법 (0) | 2023.08.12 |
React 공부하기 - Redux란? (0) | 2023.08.11 |
JavaScript의 코드스타일 (0) | 2023.08.07 |