Node Express는 Node.js 환경에서 동작하는 웹 애플리케이션 프레임워크이며, Node.js 기반 웹 및 모바일 앱 개발을 지원하는 편리한 기능을 지원합니다.
npm i -g express-generator
express-generator는 쉽게 노드 프로젝트를 생성하는데 유용한 패키지입니다. 프로젝트에 필요한 기본적인 pakage.json과 폴더 및 파일 구조 등을 잡아줍니다.
-g : 글로벌 위치express 프로젝트명 --view=ejs
새로운 express 프로젝트를 생성하고, 해당 프로젝트에서 템플릿 엔진으로 ejs를 사용하하여 mvc 패턴의 개발환경을 구성합니다.
cd 프로젝트명 , npm i , npm start
생성된 프로젝트 폴더로 이동해서 package.json에 명시된 모듈을 설치해주고, 설치가 완료되면 현재 프로젝트를 실행해줍니다.
// packge.json
"scripts": {
"start": "node ./bin/www"
}nodemon 설치 및 명령어 수정
npm i -g nodemon 명령으로 nodemon을 설치하고, package.json의 start명령어 부분의 node 부분을 nodemon으로 수정해줍니다.

noderoutingapp 이름으로 만들어진 express 프로젝트입니다.

기본적인 라우팅 정의입니다.
var express = require('express');
var app = express();
app.get('/', function(req, res) {
res.send('hello world');
});
⛳️ http://localhost:3000/sample 주소에 접속하면 views/sample/nara.ejs 파일이 렌더되도록 하기.
// routes/sample.js
var express = require('express');
var router = express.Router();
router.get('/', function (req, res, next) {
res.render('sample/nara.ejs', { nara: '백나라' });
});
module.exports = router;
// views/sample/nara.ejs
<!doctype html>
<html>
<head>
<title><%= nara %></title>
</head>
<body>
<h1><%= nara %></h1>
<p>HI! <%= nara %></p>
</body>
</html>
<%= 변수명 %> 의 형태로 필요한 위치에 변수를 삽입해줍니다.var sampleRouter = require('./routes/sample');
app.use('/sample', sampleRouter);

동작 흐름
public 폴더의 루트 위치에 index.html 파일을 만들어보다 문득 궁금증이 생겼습니다.
브라우저에서 도메인의 루트 위치에 접속했을 때 public에 추가한 index.html이 렌더되는 것을 확인했습니다.
“ 왜 views 템플릿의 index.ejs가 렌더되지 않는걸까? “
기본적으로 index.js 파일이 routes폴더에 구성되어있고, 주소체계가 루트로 돼있어서 views의 index.ejs가 렌더되어야 할 것 같은데, 내가 추가해놓은 정적파일이 렌더되는 이유는 무엇인지 알아보았습니다.
해결 과정
우선, 정적파일이 아닌 라우터에 의한 동적파일이 렌더되도록 하려면 어떻게 해야하는지를 찾아보았습니다.
stackoverflow에 나오는 대부분의 대답은 미들웨어 위치를 옮기라는 내용이었습니다.
d아직 미들웨어에 대한 개념이 없기 때문에 미들웨어에 대해 살짝 알아보자면, 미들웨어는 서버가 요청을 받은 후 응답이 클라이언트에 전송되기 전에 작동하는 기능입니다.
express 프로젝트 환경을 구성하면 app.js에 기본적으로 정의되어있는 미들웨어들이 있는데,
app.set('views', path.join(__dirname, 'views')); // 정적 파일 설정에 대한 미들웨어
app.use('/', indexRouter); // 라우터에 대한 미들웨어
순서를 살펴보면 정적파일에 대한 설정이 먼저 정의되어 있고, 라우터에 대한 미들웨어가 나중에 정의되어있는 걸 알 수 있습니다. 미들웨어는 체인으로 배열되어 있으며 순서대로 호출됩니다.
요청이 들어오면 미들웨어가 순서대로 실행되는데, 정적 파일에 대한 미들웨어가 실행되었고 마침 적합한 index.html 정적파일이 존재했기 때문에 index.html파일을 response하면서 응답이 종료가 되어 다음 미들웨어는 실행되지 않는 것 입니다.
동일한 상황에서 정적파일이 아닌 라우팅에 의한 동적파일이 렌더되도록 하려면 정적파일에 대한 미들웨어 정의를 라우터 미들웨어 다음 순서로 옮기면 됩니다.
하지만 정적 파일 미들웨어는 정적 파일 요청에 대한 처리를 담당하므로, 정적 파일이 있는 경우 불필요한 라우팅 로직을 실행하지 않고 빠르게 응답을 생성할 수 있기 때문에 정적파일 미들웨어를 먼저 등록하는것이 권장된다고 합니다.
< 참고한 글 >