Node.js web application framework
Express-generator를 사용하면 express 프레임 워크에 필요한 package.json과 기본 폴더 구조까지 쉽게 구성이 가능합니다.
하지만 이번 글에서는 직접 폴더와 파일들을 생성하고 연결하면서 구조를 익혀보겠습니다.
package.json 파일 생성
npm init
또는 yarn init
명령어를 사용하여 package.json을 먼저 생성해줍니다.
scripts: 부분에 start 속성을 반드시 작성해야합니다.
{
"name": "express",
"version": "1.0.0",
"description": "express 서버 생성",
"main": "index.js",
"author": "kangdari",
"license": "MIT",
"scripts": {
"start" : "nodemon server"
}
}
nodemon 모듈을 사용하여 서버를 자동 재시작하도록 하겠습니다.
개발용으로 설치했습니다.
$ yarn add global nodemon
$ yarn add nodemon --dev
이제 필요한 패키지를 설치합니다.
$ yarn add express cookie-parser express-session morgan
import express from 'express';
import cookieParser from 'cookie-parser';
import morgan from 'morgan';
import path from 'path';
import session from 'express-session';
import AuthRouter from './routes/auth.js'; // ES Module, 라우터 설정
// ESM 오류 해결을 위해 __dirname, __filename 직접 변수 작성
import { fileURLToPath } from 'url';
import { dirname } from 'path';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const app = express();
const port = process.env.PORT || 4000; // 포트 번호 설정
app.use(morgan('dev')); // 로그 기록을 남기는 모듈
// 정적 파일 사용을 위한 설정
app.use(express.static(path.join(__dirname, 'public')));
// bodyParser
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser('secret'));
app.use(session({ // 세션 유지
resave: false,
saveUninitialized: false,
secret: 'secret',
cookie: {
httpOnly: true,
secure: false,
},
}));
// Arrow Func은 오류가 발생...
app.get('/', function (req, res) {
res.send('hello world')
})
// auth 라우터
app.use('/auth', AuthRouter);
app.use((req, res, next) => {
const err = new Error('Not Found');
err.status = 404;
next(err);
});
app.use((err, req, res, next) => {
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
res.status(err.status || 500);
res.render('error');
})
app.listen(port, () => {
console.log(`${port}번 포트에서 실행 중...`);
})
Node.js v12부터 ES Module이 정식으로 지원되기 때문에 적용하고 import/export 문법을 사용해보았습니다.
package.json에 "type": "module"
를 추가해줍니다.
cookiePaser와 express-session의 비밀키는 직접 하드 코딩하지않고 별도로 관리해주어야합니다.이를 위한 패키지가 dotenv입니다.
$ yarn add dotenv
패키지를 설치하고 .env
파일을 생성하여 내용을 작성해줍니다.
COOKIE_SECRET = secret
PORT = 4000
dotenv가 .env 파일을 읽어 process.env 객체에 넣어줍니다.
server.js에서 dotenv를 호출하여 process.env.COOKIE_SECRET과 같이 사용합니다.
import dotenv from 'dotenv';
dotenv.config();
...
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(session({ // 세션 유지
...
secret: process.env.COOKIE_SECRET,