TIL_Express

박성훈·2022년 8월 12일
0

백엔드

목록 보기
9/13
post-thumbnail

💡 Express

Node.js 환경에서 웹 서버, 또는 API 서버를 제작하기 위해 사용되는 프레임워크

npm install express

npm으로 express 프레임워크를 사용할 수 있다.

🔍 서버 생성

const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => {
	res.send('Hello world')
})

app.listen(port, () => {
	console.log(`{port} port is activating`)
})

node.js에서는 createServer를 사용하여 서버를 만들었지만, express에서는 express() 함수를 활용하여, 각 메소드 별로 응답을 보낼 수 있다.

🔍 라우팅 (Routing)

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

router.get('/lower', (req, res) => {
	res.send(req.body.toLowerCase());
})

Express에서 자체 제공하는 Router 기능은 메소드와 url로 분기점을 만드는 것을 말한다.

단순히 봤을 때는 그냥 express()를 사용해서 서버를 만드는 것과 큰 차이가 없어 보인다.
하지만, 분기가 많아질 경우에는 상황이 달라진다.

상황별로 분기를 만들어 어떤 메소드와 url이 요청으로 왔을 때, 수행할 작업을 설정할 수 있다.

만약, 항공편 예약 서버를 만든다고 했을 때,

// ./router/flightRouter.js

const { findAll, findById, update } = require('../controller/flightController');
const express = require('express');
const router = express.Router();

router.get('/', findAll);

router.get('/:uuid', findById);

router.put('/:uuid', update);

module.exports = router;

이렇게 항공편과 관련된 요청에 대한 따로 만들어놓고,

// ./app.js
const flightRouter = require('./router/flightRouter');

app.use('/flight', flightRouter);

use 메소드를 활용하여 /flight url이 들어왔을 때, 아까 만들었던 flightRouter로 가서 상황에 맞게 처리할 수 있게 해준다.

🔍 미들웨어

Express의 가장 큰 장점 중 하나는 미들웨어를 사용할 수 있다는 것이다.
여기서 미들웨어란,

요청 오브젝트(req), 응답 오브젝트 (res), 그리고 애플리케이션의 요청-응답 주기 중 그 다음의 미들웨어 함수에 대한 액세스 권한을 갖는 함수라고 Express 공식문서에 정의되어 있다.

즉, 말그대로 프로세스 중간에 관여하여 특정 역할을 수행하는 것을 말한다.

📌 use 메소드

만약, 모든 요청에 대해서 동일한 미들웨어를 적용하고 싶을 땐 어떻게 해야할까?

모든 요청에 대해 LOGGED가 출력되는 미들웨어를 적용한다고 했을 때,

const express = require('express');
const app = express();

const myLogger = (req, res, next) => {
	console.log('LOGGED');
  	next();
};

app.use(myLogger);

app.get('/', (req, res) => {
	res.send('Hello World');
});

app.listen(3000);

다음과 같이 구현할 수 있다.

미들웨어는 항상 req, res, next를 인자로 받고
이 때, next는 다음 미들웨어를 실행하는 메소드이다.


미들웨어를 사용하는 경우는 다음과 같다.

  • POST 요청 등에 포함된 body(payload)를 구조화할 때(쉽게 얻어내고자 할 때)
  • 모든 요청/응답에 CORS 헤더를 붙여야 할 때
  • 모든 요청에 대해 url이나 메서드를 확인할 때
  • 요청 헤더에 사용자 인증 정보가 담겨있는지 확인할 때

미들웨어로 Node.js에서 번거로웠던 작업들을 훨씬 편하게 할 수 있다.

🖊 body-parser

node.js에서 요청객체의 body를 가져오는 것은 쉽지않고, 번거롭다.
이 때, body-parser 미들웨어를 사용하면 쉽게 해결할 수 있다.

Express v4.16.0 이후 부터는 따로 설치할 필요없이, 내장 미들웨어인 express.json()을 사용하면 된다.

const jsonParser = express.json();

app.json('/api/users', jsonParser, function (req, res){
	res.send(req.body);
})

위의 코드에서 jsonParser의 역할은 req객체의 body에 바로 접근하여 데이터를 가져올 수 있게 해준다.
만약, jsonParser를 사용하지 않았을 경우 body에 접근할 수 없다.

📌 express.json([options])

만약, express.json() 미들웨어 사용에 에러가 발생한다면, json()의 옵션이 원인일 수 있다.

express.json()의 옵션 중 strict의 default값은 true이다.
즉, 엄격하게 검증하기 때문에 req의 body가 객체나 배열이 아닐 경우에는 에러가 발생하게 된다.

우리는 이 문제를 해결하기 위해서

express.json({strict: false})

이렇게 설정해주면 된다.

🖊 cors

node.js에서 cors설정을 응답 헤더에 전달하기 위해

const defaultCorsHeader = {
  'Access-Control-Allow-Origin': '*',
  'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
  'Access-Control-Allow-Headers': 'Content-Type, Accept',
  'Access-Control-Max-Age': 10
};

if (req.method === 'OPTIONS') {
  res.writeHead(201, defaultCorsHeader);
  res.end()
}

이렇게 긴 코드를 적어야했다.

cors미들웨어를 사용하면, 간편하게 해결할 수 있다.

npm install cors

npm으로 cors 미들웨어를 설치해주고,

const cors = requiee('cors');

app.use(cors());

이렇게 해주면, 모든 요청에 대해 CORS를 허용해준다.

만약, 특정 요청에 대해서만 CORS를 허용하고 싶다면,

const cors = require('cors');

app.get('/products/:id', cors(), function (req, res, next) {
	...
})

이렇게 하면, 해당 요청에 대해서만 CORS를 허용하게 된다.

profile
프론트엔드 학습일지

0개의 댓글

관련 채용 정보