본문 바로가기
서버 개발

Express란 무엇일까?

by 현댕5697 2021. 4. 20.
반응형

🎇 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

 

Node.js 프로그래밍 | T아카데미 온라인강의

Node.js를 이용해서 모바일 서비스에 필요한 서버 작성하는 방법을 다룹니다. 비동기 I/O와 이벤트 기반의 자바 스크립트와 Node.js 아키텍처 구조, Node.js 코어..

tacademy.skplanet.com

 

반응형

'서버 개발' 카테고리의 다른 글

개발 방법론에 대해 알아보자  (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

댓글