본문 바로가기

ComputerScience/NodeJs

node - 6 Express로 웹 서버 만들기

728x90
 

더북(TheBook): Node.js 교과서 개정 2판

 

thebook.io

* 위 내용을 정리하였음

- 익스프레스는 npm에서 제공하는 웹 서버 프레임워크이다.

- 익스프레스를 사용하면 더 이상 if문으로 요청 메서드와 주소를 구별하지 않아도 된다.

6.1 익스프레스 프로젝트 시작하기

- package.json을 만들고 express와 nodemon을 설치한다.

- scripts에 "start" : "nodemon app"을 적어준다. nodemon app을 하면 app.js를 nodemon으로 실행한다는 뜻이다. 서버 코드에 수정 사항이 생길 때마다 nodemon 모듈로 서버를 자동으로 재시작한다.

{
  "name": "learn-express",
  "version": "0.0.1",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "nodemon app"
  },
  "author": "jsdysw",
  "license": "ISC",
  "dependencies": {
    "express": "4.17.2"
  },
  "devDependencies": {
    "nodemon": "2.0.15"
  }
}

- 서버 역할을 할 app.js를 만든다.

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

const app = express();
app.set('port', process.env.PORT || 3000);

app.get('/', (req, res) => {
  // res.send('Hello, Express');
  res.sendFile(path.join(__dirname, '/index.html'));
});

app.listen(app.get('port'), () => {
  console.log(app.get('port'), '번 포트에서 대기 중');
});

- 익스프레스 내부에 http 모듈이 내장되어 있으므로 서버의 역할을 할 수 있다.

app.set('port', 포트)로 서버가 실행될 포트를 설정

 

- app.get(주소, 라우터)는 주소에 대한 GET 요청이 올 때 어떤 동작을 할지 적는 부분이다.

req는 요청에 관한 정보가 들어 있는 객체이고, res는 응답에 관한 정보가 들어 있는 객체이다. 현재 GET / 요청 시 응답으로 Hello, Express를 전송한다.

- 익스프레스에서는 res.write res.end 대신 res.send를 사용한다.

 

- sendFile로 index.html파일을 보내줄수도 있다.

- 파일의 경로를 path 모듈을 사용해서 지정한다.

 

- listen을 하는 부분은 포트를 연결하고 서버를 실행한다. 포트는 app.get('port')로 가져왔다.

6.2 자주 사용하는 미들웨어

- 미들웨어는 요청과 응답 중간에 위치하여 요청, 응답을 조작하거나 나쁜 요청을 걸러내기도 한다. app.use(미들웨어)꼴로 사용한다.

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

const app = express();
app.set('port', process.env.PORT || 3000);

app.use((req, res, next) => {
  console.log('모든 요청에 다 실행됩니다.');
  next();
});

app.get('/', (req, res, next) => {
  console.log('GET / 요청에서만 실행됩니다.');
  next();
}, (req, res) => {
  throw new Error('에러는 에러 처리 미들웨어로 갑니다.')
});

app.use((err, req, res, next) => {
  console.error(err);
  res.status(500).send(err.message);
});

app.listen(app.get('port'), () => {
  console.log(app.get('port'), '번 포트에서 대기 중');
});

 

- app.use에 매개변수가 req, res, next인 함수(미들웨어)를 넣으면 된다.

- 주소를 첫 번째 인수로 넣어주지 않는다면 미들웨어는 모든 요청에서 실행되고, 주소를 넣는다면 해당하는 요청에서만 실행된다.

app.use(미들웨어) 모든 요청에서 미들웨어 실행
app.use('/abc', 미들웨어) abc로 시작하는 요청에서 미들웨어 실행
app.post('/abc', 미들웨어) abc로 시작하는 POST 요청에서 미들웨어 실행

- 미들웨어는 위에서부터 아래로 순서대로 실행되면서 요청과 응답 사이에 특별한 기능을 추가할 수 있다.

- next : 다음 미들웨어로 넘어가는 함수입니다. next를 실행하지 않으면 다음 미들웨어가 실행되지 않습니다.

 

- 위 예시의 app.get()처럼 두개의 미들웨어를 넣을 수도 있다.

- /요청이 들어오면 log를 띄우고 다음 미들웨어를 실행하도록 하는 미들웨어1, 에러를 던지는 미들웨어2 가 있다.

- 여기서 발생한 에러는 아래 에러 처리 미들웨어로 전달된다. (반드시 매개변수가 err, req, res, next로 네 개)

- 에러처리 미들웨어에서 res.status로 HTTP 상태코드를 지정하도록 했다.

- 에러처리 미들웨어는 반드시 맨 아래 위치하도록 하자.

- 이렇게 미들웨어로 요청, 응답에 다양한 기능을 추가할 수 있다.

npm i morgan cookie-parser express-session dotenv

- 위 패키지를 설치하고 app.js를 아래처럼 수정한다.

const express = require('express');
const morgan = require('morgan');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const dotenv = require('dotenv');
const path = require('path');

dotenv.config();
const app = express();
app.set('port', process.env.PORT || 3000);

app.use(morgan('dev'));
app.use('/', express.static(path.join(__dirname, 'public')));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(session({
  resave: false,
  saveUninitialized: false,
  secret: process.env.COOKIE_SECRET,
  cookie: {
    httpOnly: true,
    secure: false,
  },
  name: 'session-cookie',
}));

app.use((req, res, next) => {
  console.log('모든 요청에 다 실행됩니다.');
  next();
});

app.listen(app.get('port'), () => {
  console.log(app.get('port'), '번 포트에서 대기 중');
});

- 아래내용의 .env파일을 만든다.

COOKIE_SECRET=cookiesecret

- 설치한 패키지들을 require한 후 app.use에 연결한다.

- 미들웨어 내부에 req, res, next 들이 다 들어있다.

 

- dotenv는 미들웨어는 아니고 .env를 읽어서 process.env로 만들어준다.

- 보안과 설정 편의를 위해 process.env를 별도의 파일로 관리한다.

- .env파일에 비밀 키를 적어두고 dotenv 패키지로 비밀 키를 로딩해서 사용한다.

- 소스코드가 유출되어도 .env만 잘 지키면 된다.

- 다음 글에서 각각의 미들웨어를 살펴보자.

728x90
반응형