"Most websites share a very similar (not to say identical) structure. The aim of frameworks is to provide a common structure so that developers don't have to redo it from scratch and can reuse the code provided."
"Express is fast, unopionionated, minimalist web framework for node.js."
Node.js는 런타임 환경을 제공하며, Express.js는 직접적인 웹 서비스로서의 기능을 담당한다는 사실에 유의하며 접근한다.
$ mkdir myapp
$ cd myapp
npm init -y
명령어를 사용하여 작업을 의도한 어플리케이션에 package.json
파일을 생성한다. 뒤에 붙는 -y
명령어를 통해서 디폴트 값으로 제공하는 기본 설정 값을 남겨둔다.$ npm init -y
// package.json
{
"name": "test",
"version": "1.0.0",
"description": "",
"main": "app.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
$ npm install express
// package.json
"dependencies": {
"express": "^4.18.2",
}
4-1. Express를 일시적으로만 사용하고 배포용 dependency list에 저장하고 싶지 않다면 아래의 명령어를 입력한다.
$ npm install express --no-save
4-2. dependencies가 아니라 로컬 개발환경에서 쓰고 싶은 패키지들을 관리하는 devDependencies에 해당 내용을 저장하고 싶다면 아래의 명령어를 입력한다.
$ npm install express --save-dev
- Node에서는 코드에서 수정이 일어났을 때 코드의 수정 사항이 서버에 자동으로 반영되지 않는다.
- 따라서, 코드 수정 후 서버를 계속 다시 켜주어야 하는 번거로움이 생긴다.
- 이를 보완하기 위해 'Nodemon'이라는 패키지를 이용할 수 있다.
- 직접 수동으로 종료 및 재시작하는 것이 아닌, 코드 수정 및 저장시에도 서버가 자동으로 재시작을 한다.
rs
명령어를 입력하여도 동일하게 재시작을 한다.
-g
를 붙임으로써 global 변수로 nodemon을 설치할 수도 있습니다. 아래 명령어를 통해 nodemon 패키지가 system path 전역에 설치를 완료할 수 있다. -g
를 붙이지 않고 설치하는 local 설치와의 차이점이 이곳에서 보여지는데, 바로 local 설치는 node_modules 하위 디렉토리에 한정되어 설치가 이루어진다는 점이다.$ npm install nodemon # local dependency install
$ npm install -g nodemon # global install
1-1. 필요시, 아래의 명령어를 이용하면 devDependency 로서 해당 내용을 설치 할 수 있다.
$ npm install --save-dev nodemon # local devDependency install
// pachage.json
"scripts": {
"start": "nodemon app.js"
}
nodemon은 디렉토리(또는 디렉토리)를 계속 모니터링하고 변경 사항이 있으면 스크립트를 다시 시작한다. 수동으로 서버 종료 없이 재시작하는 방법은 실행중인 터미널 창에 rs
를 입력하는 것이다.
- 현재의 웹 브라우저는 보안상의 이유로 서로 다른 출처의 http 통신을 막도록 기본적으로 세팅되어 있다.
- 하지만 현실적으로 백엔드와 프론트 서버가 서로 다른 도메인에서 운용되는 현재의 3세대 웹 서비스 환경에서, 동일한 출처에서만 리소스를 주고 받을 수 없는 실정이다. 따라서 이러한 SOP 정책을 올바르게 의도한 요청에 한해서 다소 완화시켜 서로간 통신을 가능케 해야 한다.
- 만일 해당 과정을 생략한다면 CORS 정책 위반을 이유로 서버통신이 불가하게 된다.
$ npm install cors
- 환경변수란 프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는 동적인 값들의 모임이다.
- 웹 프로그램에서의 환경변수는 시스템이 실행 파일이 놓여 있는 경로, 데이터베이스에 접속하는 계정명과 비밀번호 등의 상세 설정 내역이 기록되어 있다.
- 이러한 환경변수는 탈취를 당하면 보안에 큰 위험성을 야기하기 때문에 꼭 .gitignore 파일에 포함시켜 관리해야 한다.
npm 패키지 매니저를 이용하여 dotenv 라이브러리를 Node.js 프로젝트에 설치한다.
$ npm install dotenv
이후 .env 파일을 관리할 수 있도록 터미널 명령어를 사용하여 세 개의 파일을 만든다.
touch .gitignore
touch .env.sample
touch .env
dotenv 라이브러리는 디폴트로 현재 디렉토리에 위치한 .env 파일로 부터 환경 변수를 읽어낸다. 따라서, .env 파일을 생성하고, 그 안에 필요한 환경 변수를 key-value 의 포맷으로 나열한다.
// .env
DB_HOST=localhost
DB_USER=root
DB_PASS=myPassword
- Node.js 서버로 구성된 웹 환경에서는 기본적으로 제공되어지는 로깅(네트워크 통신 기록) 기능이 없기에, 로그(log)를 관리하기 위해서 외부의 서드파티 모듈/라이브러리를 사용할 것을 권장한다.
- 그 중 Morgan은 npm에서 사용되는 로그 관리를 위한 여러 패키지 중 하나이며 많은 Node.js 개발자들이 사용하고 있다.
- Morgan을 사용하면 http(s) 통신시 프론트-백엔드간 소통 시 필요로 하는 '기본 정보'들을 자동으로 포맷팅하여 편리하게 주고 받을 수 있게 된다.
$ npm install morgan
// .env
PORT = 3000
// app.js
const http = require("http");
const express = require("express");
const cors = require("cors");
const morgan = require("morgan");
const dotenv = require("dotenv");
app = express();
app.use(express.json());
app.use(cors());
app.use(morgan("dev"));
dotenv.config();
app.get("/ping", (req, res) => {
res.json({ message: "pong" });
});
const server = http.createServer(app);
const PORT = process.env.PORT;
const start = async () => {
server.listen(PORT, () => console.log(`server is listening on ${PORT}`));
};
start();