이번 포스팅에서는 express.Router()를 사용해 라우터를 분리하는 방법에 대해 알아보도록 하자.
< 목차 >
- express.Router()
- 라우터 분리하기
< express.Router() >
Node.js에서 express를 사용해 게시판 서버를 만든다고 가정해보자. 기본적인 기능만을 갖고 있는 게시판 서버를 만드는 작업에도 메인 서버 파일에는 다음과 같이 수많은 라우터들이 들어가게 될 것이다.
// server.js 파일
const express = require('express');
const app = express();
app.get('/board/list', (req, res)=>{
})
app.get('/board/write', (req, res)=>{
})
app.post('/board/write', (req, res)=>{
})
app.get('/board/view', (req, res)=>{
})
app.get('/board/update', (req, res)=>{
})
app.post('/board/update', (req, res)=>{
})
app.get('/board/delete', (req, res)=>{
})
app.listen(3000, ()=>{
console.log('server onload')
})
게시판에서 CRUD(Create Read Update Delete) 기능 하나만을 구현하는데도 이처럼 많은 라우터들을 작성해줘야만 한다. 여기에 로그인 기능까지 추가한다면?? 게시판 기능과 로그인 기능에 그치지 않고 더 다양한 기능들이 들어간 서버를 만들고 싶다면?? 아마 메인 서버 파일에 라우터들이 빼곡하게 자리잡게 될 것이다. 추후에 코드를 수정할 일이 생기거나 유지, 보수를 해야하는 상황 하에서 이러한 코드 디자인 방식은 많은 문제들을 일으키게 된다.
코드 디자인 패턴 중의 하나로 MVC 패턴이란 것이 있다. M : model , V : view , C : controller 의 약자로 각각 데이터를 담는 부분, 화면을 표현해주는 부분, 데이터를 컨트롤 하는 부분을 일컫는다. 어떠한 기능을 구현하는 애플리케이션을 만들 때 애플리케이션의 구성요소를 역할별로 나눠서 코드를 디자인하는 방식인 것이다. 라우터를 분리해서 관리하는 것 역시 이와 비슷한 맥락이라고 보면 된다. 게시판 기능을 구현하는 파일 따로, 로그인 기능을 구현하는 파일 따로 각각 나눠서 관리한다면 수정을 하거나 유지, 보수를 하는 작업이 한결 수월해질 것은 두말할 필요도 없기 때문이다. 즉, 서버의 규모가 커지면 커질수록 각각의 역할별로 파일을 분리해서 관리하는 방식은 불가피해지게 되고 이와 비슷한 맥락에서 라우터의 역할별로 라우터들을 분리하고 관리할 수 있게 해주는 것이 바로 express.Router() 이다.
< 라우터 분리하기 >
위의 코드를 활용해서 라우터를 분리하는 작업을 해보도록 하자. 메인 서버 파일을 server.js , 라우터들이 담긴 파일을 router.js 파일이라 했을 때 각각의 파일은 다음과 같이 만들어 주면 된다.
// server.js 파일
const express = require('express')
const boardRouter = require('./router.js')
// require 함수의 인자값으로는 router.js 파일의 경로를 작성
const app = express()
app.use('/board', boardRouter)
app.listen(3000, ()=>{
console.log('server onload')
})
// router.js 파일
const express = require('express')
const router = express.Router()
router.get('/list', (req, res)=>{
})
router.get('/write', (req, res)=>{
})
router.post('/write', (req, res)=>{
})
router.get('/view', (req, res)=>{
})
router.get('/update', (req, res)=>{
})
router.post('/update', (req, res)=>{
})
router.get('/delete', (req, res)=>{
})
module.exports = router;
라우터를 담을 파일을 따로 하나 만들어서 메인 서버 파일에 있는 라우터들을 해당 파일로 옮겨주는 작업이라고 생각하면 어렵게 느껴지지는 않을 것이다. 이 때 라우터들이 담긴 router.js 파일 안에서 express.Router()를 사용한다는 것만 유의하도록 하자. express.Router() 를 통해 express 안에 있는 Router() 라는 함수를 실행시키고 그 결과물을 router라는 변수에 담아 사용하면 된다. const app = express() 를 이용해 express() 함수를 app이라는 변수에 담아서 사용했던 것과 비슷한 맥락이다. 기존에 app.get , app.post 와 같이 작성되었던 라우터들을 이제 router.get , router.post 와 같은 형태로 바꿔준 후 "/board" 부분을 제거한 경로를 인자값으로 넣어준다. 마지막으로 module.exports 를 통해 router를 내보내주기만 하면 된다. 여기서 router는 server.js 파일 안에 있는 라우터에 들어갈 인자값을 생성해주는 일종의 함수라고 생각하면 된다. router.get은 라우터를 실행시킨다는 의미가 아니라 get 요청을 처리할 수 있는 라우터를 만들어준다는 개념이다.
router.js에서의 작업이 끝났으면 이제 메인 서버 파일인 server.js 파일에서 require 함수를 사용해 router.js 파일을 모듈과 같이 불러와서 사용하기만 하면 된다. 위의 코드에서는 boardRouter라는 변수에 불러온 모듈을 담았다. 그리고 app.use('/board', boardRouter) 와 같은 방식으로 boardRouter를 사용하면 된다.
작동 방식은 다음과 같다. "/board/list" 경로로 get 방식의 요청이 들어오면 server.js 파일에 있는 app.use('/board', boardRouter) 에 의해 '/board' 경로로 들어오는 모든 요청들에 대해 boardRouter라는 미들웨어가 처리를 해주게 된다. boardRouter 미들웨어를 살펴보면 그 안에서 router.js 파일에 있는 router가 router.get('/list', (req, res)=>{ })으로 get 요청을 처리할 수 있는 라우터를 만들어 놓은 것을 알 수 있다.
자세한 원리보다는 라우터를 분리하는 방법 자체에 초점을 맞춰서 express.Router()의 사용법을 익혀두도록 하자.
'Node > Express' 카테고리의 다른 글
Node.js - express (11) express.json() (0) | 2022.02.15 |
---|---|
Node.js - express (10) express-session 사용하기 (2) | 2022.02.12 |
Node.js - express (8) 라우터와 미들웨어 (router & middleware) (0) | 2022.02.10 |
Node.js - express (7) 세션(session) (2) | 2022.02.09 |
Node.js - express (6) cookieParser 함수 만들기 (1) | 2022.02.07 |