🌊 Express 프레임워크
경량화 웹 개발 프레임 워크. 노드를 이용한 웹 서비스나, 웹 어플리케이션 개발에 가장 널리 쓰이는 확장 모듈이다.
express는 기본 모듈 중 하나인 http 모듈을 이용하여 웹 서버를 구축하거나 API서버를 제작하기 위해 사용되는 프레임워크 입니다.
Node.js HTTP 모듈로 작성한 서버와 다른 점
- 미들웨어를 추가할 수 있다.
- 라우터를 제공한다.
MERN stack
- MongoDB : NoSQL데이터 베이스로, JSON형식으로 데이터를 저장한다.
- Express : Node.js를 기반으로 하는 웹 프레임워크로, 웹 어플리케이션의 구조와 로직을 구성한다
- React : 페이스북에서 개발한 프론트엔드 라이브러리로, 웹 어플리케이션의 사용자 인터페이스(UI)를 만든다.
- Node.js : 자바스크립트 런타임 환경으로, 서버 사이드 어플리케이션을 만들 수 있다.
MERN stack은 위 네 가지를 조합한 웹 개발 스택입니다. 하나의 언어와 프레임워크만으로 전체 웹 어플리케이션을 개발할 수 있어 개발 생상성을 높일 수 있으며 React를 사용해 SPA를 구현할 수 있어 사용자 경험(UX)를 향상 시킬 수 있습니다.
설치 방법
1. Express 설치
npm install express # npm 사용시
yarn add express # yarn 사용시
2. 간단한 웹 서버 만들기
: port를 3000에서 지정하여 localhost:3000에서 해당 서버를 확인할 수 있다.
클라이언트가 Get 방식으로 루트 URL(http://localhost:3000/)에 요청을 보내면 서버는 index.html을 화면에 그려준다.
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
res.sendFile(__dirname, '/index.html')
})
app.get('/hello', (req, res) => {
res.send('Hello World!')
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
라우팅
: 라우팅은 URI(또는 경로) 및 특정한 HTTP 요청 메소드(GET, POST 등)인 특정 엔드포인트에 대한 클라이언트 요청에 애플리케이션이 응답하는 방법을 결정하는 것을 말한다. 각 라우트는 하나 이상의 핸들러 함수를 가질 수 있으며, 이러한 함수는 라우트가 일치할 때 실행 된다. - 공식문서 -
즉, 메서드와 URI(/lower
, /upper
등)로 분기점을 만드는 것을 라우팅(Routing)이라 한다.
app.METHOD(PATH, HANDLER)
- app은 express의 인스턴스
- METHOD는 HTTP 요청 메소드(GET, POST 등)
- PATH는 서버에서의 경로
- HANDLER는 라우트가 일치할 때 실행되는 함수
app.post('/', function (req, res) {
# method : post, 경로 : '/', Handler: function~ 함수
res.send('Got a POST request');
});
미들웨어
미들웨어는 요청과 응답의 중간에 위치하여 미들웨어라고 부른다.
미들웨어는 요청과 응답을 조작하여 필요한 기능을 추가하거나, 문제가 발견된 나쁜 요청을 걸러낸다.
미들웨어는 express의 가장 큰 장점이다.
app.get('/', (req, res) => { // 이 함수는 express 전용 미들웨어 함수이다.
})
- 미들웨어는 req, res, next가 매개변수인 함수
- 미들웨어 함수는 여러 번 인자로 사용 가능
- req: 요청, res: 응답 조작 가능, next(): 다음 미들웨어로 넘어감
- 에러 처리 미들웨어는 매개변수가 err, req, res, next로 4개
미들웨어를 사용하는 상황
- POST 요청 등에 포함된 body(payload)를 구조화할 때 (쉽게 얻어내고자 할 때)
- 모든 요청/응답에 CORS 헤더를 붙여야 할 때
- 모든 요청에 대해 url이나 메서드를 확인할 때
- 요청 헤더에 사용자 인증 정보가 담겨있는 지 확인할 때
- 에러처리 할 때
1. POST 요청 등에 포함된 body(payload)를 구조화할 때 (쉽게 얻어내고자 할 때)
const jsonParser = express.json() // Express v4.16.0부터 사용 가능한 내장 미들웨어
app.post('경로', jsonParser, function(req, res) {
// HTTP 모듈 사용 방식에서는 Buffer를 조합해서 다소 복잡한 방식으로 body를 얻는다.
})
2. 모든 요청/응답에 CORS 헤더를 붙일 때
cors 미들웨어
를 사용한다.
npm install cors
const cors = require('cors');
/** 모든 요청에 대해 CORS 허용 */
app.use((cors()); // () 잊지 말 것!
/** 특정 요청에 대해 CORS 허용 */
app.get('/produdcts/:id', cors(), function(req, res, next) {
res.json({msg: 'Cors-enabled'}
})
3. 모든 요청/응답에 url이나 메서드를 확인할 때
app.get('/', function(req, res, next) {
next()
})
이 라우팅의 파라미터의 순서에 유의해야한다. next
는 다음 미들웨어를 실행하는 역할을 한다. 특정한 endpoint가 아닌 모든 요청에 동일한 미들웨어를 적용할 땐 함수를 변수에 할당한 후 메서드 app.use
를 사용한다.
app.use(함수명);
4. 요청 헤더에 사용자 인증 정보가 담겨있는 지 확인할 때
app.use((req, res, next) => {
// 토큰이 있는지 확인, 없으면 받아줄 수 없음.
if(req.headers.token){
req.isLoggedIn = true;
next();
} else {
res.status(400).send('invalid user') // 에러코드
}
})
5. 에러처리
app.use(function(err, req, res, next){
console.error(err.stack)
res.status(500).send('Something broke!')
}
코딩애플, 코드스테이츠 자료, 인파님 블로그, Express 공식문서를 참고하였습니다.
'🐣 STUDY > HTTP, WEB' 카테고리의 다른 글
[기술면접] (1) | 2023.04.10 |
---|---|
🌱 [Web Server/Node.js] Express - req.query, req.params (1) | 2023.04.05 |
🌱 [Web Server] Node.js HTTP모듈 서버 만들기 (2) | 2023.04.04 |
🌱 [Web Server] CORS, SOP (2) | 2023.04.04 |
🌱 [HTTP/네트워크] REST API (12) | 2023.03.29 |