반응형
🎇 Express
Express는 HTTP 요청, 응답을 쉽게 하도록 도와주는 웹 프레임워크이다.
1. 서버 생성, 시작
var express = require('express');
var app = express();
app.listen(3000);
2. 라우팅
요청을 요청 처리 미들웨어로 분배해준다.
1) HTTP method 별로 라우팅
app.get('/', (req, res)=>{
// get request handling
});
app.post('/', (req, res)=>{
// post request handling
});
2) url 경로 별로 라우팅
app.get('/user', (req, res)=>{
// /user url에 대한 handling
});
app.get('/items', (req, res)=>{
// /items url에 대한 handling
});
3) 동적 파라미터
app.get('/user/:id', (req, res)=>{
let id = req.params.id;
})
app.post('/movies/:movieID/:actor', (req, res)=>{
let movieID = req.params.movieID;
let actor = req.params.actor;
})
4) 경로에 정규식 사용
- ? : 문자 생략 가능
- + : 한 번 이상 반복됨
- * : 임의의 문자
// /abcd, /acd 가능 : b 생략 가능
app.get('/ab?cd', (req, res)=>{})
// /abcd, /abbbbcd, /abbcd : b 여러 개 존재 가능
app.get('/ab+cd', (req, res)=>{})
// /abcd, /abhcd, /ab14recd, /abrrrrcd : ab와 cd 사이에 임의의 문자열 존재 가능
app.get('/ab*cd', (req, res)=>{})
// /abcde, /abe : cd 생략 가능
app.get('/ab(cd)?e', (req, res)=>{})
5) 라우터 객체(라우터 수준의 미들웨어 생성)
import express from 'express';
const app = express()
const router = express.Router();
router.get('/hello', (req, res)=>{})
- 라우팅을 통해 특정 경로에 대한 요청을 처리해주는 기능만 분리하여 파일별로 만들 수 있다.
예를 들어 /users/data 경로에 대한 요청을 받으면
app.use('/users', require('./usersRouter'));
을 통해 라우팅하고, 'usersRouter' 파일 안에서
router.get('/data', (req, res)=>{
// '/data' 경로에 대한 get handling
})
위와 같은 코드를 작성해주면 된다.
3. 요청 / 응답
- req.query : 쿼리 문자열
- req.path : 요청 url 중 경로
- req.params : url의 파라미터
- req.cookie : 요청 메세지 내의 쿠키 분석(쿠키 parser 필요!)
- req.body: 요청 메세지 내의 바디 분석(바디 parser 필요!)
- res.json() : json 응답 메세지 전송
- res.redirect() : redirection 응답 전송
- res.render() : 템플릿으로 렌더링
- res.send() : json, html, buffer 전송 및 메세지 header에 Content-Type 자동 설정
- res.sendStatus() : 상태 코드, 상태 메세지 전송
- res.status() : 상태 코드 설정. 응답 method 종료 안함.
- res.download() : 파일 다운로드
⚙ 미들웨어
- 하나의 요청이 오게 되면 그 요청을 분석하는 작은 모듈.
- 요청과 응답을 처리하는 함수 형태이다.
→ 즉, Express app은 여러 개의 미들웨어가 합쳐져서 만들어진다.
1. 요청
- 하나의 미들웨어에서 요청 분석, 응답 마무리를 담당
- 여러 미들웨어를 거쳐서 요청 분석 및 응답 마무리.
2. 사용법
// app.use(path, middleware)
app.use((req, res)=>{
res.send('hello');
})
- path가 생략되어 있을 경우 '/'로 간주한다.
app.get(path, middleware);
app.post(path, middleware);
app.put(path, middleware);
app.delete(path, middleware);
- method 별로 미들웨어 설정이 가능하다.
app.use((req, res, next)=>{
next(); // 다음 미들웨어 동작하도록 next를 호출한다
})
- 미들웨어 안에 미들웨어를 호출함으로써, 여러 개의 미들웨어를 거치도록 할 수 있다.
3. Express 미들웨어의 용도
- 어플리케이션 수준의 미들웨어 : 앞에서 예시로 든 코드들이 이 용도로 express를 사용한 것이다.
- 라우터 수준의 미들웨어
- 에러 처리
- 빌트인
- 써드 파티
4. 미들웨어 동작 순서
파비콘 처리 → 로깅 → 정적 파일 처리 → 서비스 미들웨어 → 에러 처리
🛠 에러 처리 미들웨어
일관된 에러처리가 가능하다
1) 에러를 처리하는 미들웨어
app.use((err, req, res, next)=>{
res.status(500).send('에러 발생');
})
2) 에러를 미들웨어로 전달하는 미들웨어
app.use((req, res, next)=>{
const error = new Error('error message');
error.code = 100;
return next(error);
})
3) 환경 별 에러 처리
- 개발 환경을 설정해야 한다
if(app.get('env') === 'development'){
app.use((err, req, res, next)=>{
res.end(err.stack)
})
}
else{
app.use((err, req, res, next)=>{
res.status(err.code || 500);
res.end('잠시 후 다시 시도해주세요')
})
}
📚 써드파티 미들웨어
써드파티 미들웨어란 express에 기본적으로 내장된 미들웨어가 아닌 npm(or yarn)을 통해 별도로 설치해야 하는 미들웨어를 말한다.
1. 파비콘 미들웨어
- "npm install serve-favicon" 또는 "yarn add serve-favicon"을 cmd창에 입력하여 설치한다.
//favicon(path, options), path: favicon 경로
var express = require('express');
var favicon = require('serve-favicon');
var app = express();
app.use(favicon('dirname'+'/public/favicon.ico'));
2. 로그 남기기
1) morgan
- "npm install morgan" 또는 "yarn add morgan"을 cmd 창에 입력하여 설치한다.
// margan(format, options)
// format : combined, common, dev, short, tiny
var morgan = require('morgan');
app.use(morgan('dev'));
2) winston
- "npm install winston" 또는 "yarn add winston"을 cmd 창에 입력하여 설치한다.
- 다양한 형태로 로그를 남길 수 있다.
- email, sms 알림 서비스를 이용할 수 있다.
var windson = require('winston');
winston.add(winston.transports.File, {filename:'service.log'});
winston.info('info message');
winston.warn('warn message');
winston.error('error message');
winston.log('info', 'info message');
winston.log('error', 'error message')
winston.remove(winston.transports.Console);
- 로거 생성 : 에러를 파일에 기록
var logger = new winston.Logger({
transports:[
new winston.transports.Console(),
new winston.transports.File({
name: 'error-logger',
filename: 'service-error.log',
level: 'error'
})
]
});
logger.error('Error message');
logger.info('Info message');
logger.warn('Warn message');
- transports는 별도로 설치해줘서 사용할 수 있다. (ex: sms 알림)
3. body parser
- 기존의 request가 오면 body를 parsing하기 위해 buffer, chunck를 사용했던 과정을 간단하게 만들어 준다.
- "npm install body-parser" 또는 "yarn add body-parser"을 cmd 창에 입력하여 설치한다.
- json, raw, text, url-encoded 등을 지원한다.
- 멀티 파트(파일 등)는 지원하지 않기 때문에 이를 위해서는 또 다른 써드파티 미들웨어를 설치해야 한다.
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.listen(3000);
app.use(bodyParser.urlencoded({extend:false}));
app.use(bodyParser.json());
app.post('/', (req, res)=>{
let title = req.body.title;
let message = req.body.message;
res.send(
{data:{
title: title,
message: message
}}
);
});
* 본 게시물은 Tacademy 영상을 참고하여 작성되었습니다.
tacademy.skplanet.com/live/player/onlineLectureDetail.action?seq=71
반응형
'서버 개발' 카테고리의 다른 글
개발 방법론에 대해 알아보자 (0) | 2021.05.16 |
---|---|
OAuth로 구글 로그인을 구현해보자 (0) | 2021.05.08 |
MongoDB 연결하기 (0) | 2021.04.21 |
JSON과 XML에 대해 알아보자 (0) | 2021.04.19 |
Node.js 이해하기 (0) | 2021.04.19 |
댓글