express는 app.js 파일 안에 모든 것을 적을 수 있다.
하지만 이것은 단점이 된다.
구조 파악도 어렵고 복잡하기 때문에 유지 보수도 어렵다.
그래서 express.Router()라는 함수를 이용해서 라우터끼리만 표지판처럼 모아놓고
그 표지판으로 향하는 데이터를 따로 관리하는 Controller 폴더로 별도로 만들어서 메서드 별로 관리 한다. 즉, Router, Controller를 분리해서 관리하는 것이 복잡하지 않다.
먼저, app.js에서는 미들웨어를 이용해 특정 라우터를 실행하게 할 수 있다.
// app.js
app.use("/flight", flightRouter);
app.use("/book", bookRouter);
app.use("/airport", airportRouter);
이 라우터로 요청이 들어올 시, 뒤에 있는 함수가 실행된다. 여기서는 파일 이름으로 작성되어있다. 이것은 모듈로 마운팅이 될 것이다.
//flightRouter.js
const { findAll, findById, update } = require('../controller/flightController');
const express = require('express');
const router = express.Router();
router.get('/', findAll);
router.get('/:uuid', findById);
router.put('/:uuid', update);
module.exports = router;
express.Router 클래스를 이용해서 모듈식 마운팅 가능한 핸들러를 작성한다.
인스턴스 router로 경로를 정의하고 라우터 모듈을 마운트한다.
위 예시를 이어보자면,
두 번째 인자로 각 라우터에 해당하는 함수들이 있는데 이것은 파일형 모듈에서 가져온 메서드들이다.
이러한 메서드들도 router 파일 안에 모두 넣게 되면 복잡하기 때문에, Controller의 기능을 하는 메서드들만 모아놓는다.
const fs = require("fs");
module.exports = {
findAll: (req, res) => {
...
},
findById: (req, res) => {
...
},
update: (req, res) => {
...
},
};
Node.js에서 각 파일은 모듈로 간주되며, 'module' 객체는 현재 모듈을 나타내는 특수한 객체다.
'module' 객체의 'exports' 속성은 모듈에서 내보낼 대상을 정의하고, 다른 모듈에서 사용할 수 있도록 한다.
'module.exports'에 값을 할당함으로써 해당 값을 모듈의 공개 인터페이스로 노출시킬 수 있다. 다른 모듈은 'require' 함수를 사용하여 모듈을 가져와 내보낸 값을 액세스 할 수 있다.