npm init
명령어로 package.json 파일을 생성한다.npm init
{
"name": "project",
"version": "1.0.0",
"main": "index.js",
"description": "",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
}
npm install express
명령어를 사용해 Express를 설치한다.npm install express
이렇게 express 패키지가 설치되면 node_modules라는 폴더가 자동으로 생성된다. express라는 Node.js 패키지 하나만 설치했는데 node_modules 폴더를 열어보면 굉장히 다양한 폴더와 파일이 생성된 것을 확인할 수 있다. 이렇게 다양한 파일이 생성된 이유는 express 패키지 내부에서 참조하고 있는 다른 모든 패키지가 설치되기 때문이다.
대다수의 Node.js 패키지는 모든 프로그래밍 코드를 자체 개발하는 것이 아니라 특정 기능에 대해서는 이미 개발된 다른 패키지를 사용해서 개발하므로 패키지 간에는 연관성이 존재한다. 그래서 npm install 명령어로 패키지를 설치하는 순간, 연관된 모든 패키지가 같이 설치된다.
node index.js
명령어를 통해 웹 서버를 실행시킬 수 있다.node [실행시킬 파일명]
const express = require('express') // express 모듈 불러오기
const app = express() // 서버 생성
const port = 8080
// 클라이언트에서 HTTP 요청 메서드 중 GET을 이용해서 'host:port'로 요청을 보내면 실행되는 라우트
app.get('/', (req, res) => {
res.send('Hello World!')
})
// app.listen 함수를 사용해서 서버 실행
// 클라이언트는 'host:port'로 노드 서버에 요청을 보낼 수 있다.
app.listen(port, () => {
console.log(`서버가 실행됩니다. http://localhost:${port}`);
});
http://localhost:8080
을 입력하고 실행하면 아래와 같이 브라우저 창에 'Hello World'가 나오는 것을 확인할 수 있다.애플리케이션을 개발할 때는 쿼리문과 라우터를 계속해서 추가하거나 변경하게 된다. 이때마다 서버를 재시작하는 것은 굉장히 불편하고 비효율적일 것이다.
nodemon은 node monitor의 약자로, 특정 디렉토리 혹은 파일을 감시하고 있다가 변경사항이 발생하면 Node.js 애플리케이션을 재시작하는 모듈이다. nodemon은 npm install --save-dev nodemon
으로 설치할 수 있다.
npm install --save-dev nodemon
nodemon이 설치되고 나면 Node.js를 실행시킬 때 변경 사항을 감시하고 싶은 파일을 지정할 수 있다. nodemon으로 지정된 파일은 변경 사항이 발생해도 Node.js를 다시 실행시킬 필요 없이 자동으로 반영된다.
Node.js 애플리케이션을 실행할 때 node 명령어 대신 nodemon 명령어를 사용하면 애플리케이션이 실행되고, 동일한 디렉토리에 있는 파일에 변경 사항이 발생하면 Node.js 애플리케이션을 재실행한다.
nodemon index.js
{
"name": "project",
"version": "1.0.0",
"main": "index.js",
"description": "",
"scripts": {
"dev": "nodemon index.js", // npm run dev 명령어를 실행하면 index.js 파일을 감시한다.
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.19.2"
},
"devDependencies": {
"nodemon": "^3.1.4"
}
}
nodemon --watch [감시 대상] [재실행 파일]
nodemon --watch mysql index.js
CORS(Cross-Origin Resource Sharing)는 추가 HTTP 헤더를 사용해서 도메인 또는 포트가 다른 서버의 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 체제를 말한다. 일반적으로 Node.js로 웹 서버를 별도로 구성하는 경우 클라이언트와 도메인 또는 포트가 별도의 서버로 구동한다. 이러한 겨우 클라이언트의 요청은 브라우저 보안 문제로 인해 정상적인 접근을 할 수 없다.
CORS 도메인과 포트를 지정해서 권한이 있는 클라이언트만 접근할 수 있도록 접근 권한을 부여하고 관리할 수 있는 미들웨어다. npm install cors
명령어로 설치할 수 있다.
npm install cors
미들웨어(Middleware)
- 미들웨어 함수는 요청 객체, 응답 객체 그리고 애플리케이션의 요청-응답 주기에서 다음 함수에 접근할 수 있는 함수를 말한다. 다시 말해, 미들웨어 모듈이란, 요청(request)과 응답(response)의 중간(middle)에서 목적에 맞는 특정 기능을 하는 함수다.
브라우저에서 Origin이란 URL 구조의 프로토콜, 호스트, 포트를 합친 것을 말한다. 그래서 Cross-Origin이란 서로 다른 Origin(출처), 즉 프로토콜, 도메인 혹은 포트 중 하나라도 다르면 다른 Origin(출처)로 인식하고, CORS 설정을 하지 않으면 접근할 수 없도록 하는 것이다.
예를 들어, 프론트엔드에서 프로젝트를 로컬에서 실행하면 3000번 포트로 실행되는데 서버는 8080포트를 사용하고 있을 경우 포트가 다르므로 서로 다른 출처로 인식하기 때문에 cors 에러가 발생한다.
const express = require('express');
const cors = require('cors');
const app = express();
const port = 8080;
const corsOptions = {
origin: 'http://example.com', // 허용할 도메인 설정
optionsSuccessStatus: 200
}
app.use(cors(corsOptions)); // cors를 모든 라우터에 적용
app.get('/products/:id', (req, res, next) => {
res.json({msg: 'This is CORS-enabled for all origins'});
});
app.listen(port, () => {
console.log(`서버가 실행됩니다. http://localhost:${port}`);
});
const express = require('express');
const cors = require('cors');
const app = express();
const port = 8080;
const corsOptions = {
origin: 'http://example.com', // 허용할 도메인 설정
optionsSuccessStatus: 200
}
// 특정 라우터에만 cors 적용
app.get('/products/:id', cors(corsOptions), (req, res, next) => {
res.json({msg: 'This is CORS-enabled only example.com'});
});
app.listen(port, () => {
console.log(`서버가 실행됩니다. http://localhost:${port}`);
});