해당 글은 이전 글들의 작업을 이어서 진행되고 있는 글입니다.
지금까지 만들었던 app.get~~ app.post~~ 이런 친구들을 라우터라고 하는데 server.js에 이 친구들이 너무 많기 때문에 용도에 따라서 파일을 분리해서 관리해보려고한다.
1. routes 폴더와 분리할 API의 파일 만들기
이번에는 연습용으로 아래의 API를 분리시켜보려고한다.
app.get('/shop/shirts', function (요청, 응답) {
응답.send('셔츠 파는 페이지입니다.');
});
app.get('/shop/pants', function (요청, 응답) {
응답.send('바지 파는 페이지입니다.');
});
2. 라우터 변수 만들기
라우터를 관리할 수 있도록 도움을 주는 함수를 이용해서 라우터 변수를 만들어보자.
var router = require('express').Router();
// npm으로 설치했던 express 라이브러리의 Router함수를 사용하겠습니다.
3. app 대신 router 변수로 API 작성하기
router.get('/shop/shirts', function(요청, 응답){
응답.send('셔츠 파는 페이지입니다.');
});
router.get('/shop/pants', function (요청, 응답) {
응답.send('바지 파는 페이지입니다.');
});
기존 코드에서 app을 router로 모두 변경해주었다.
4. 다른 곳에서 shop.js를 사용할 수 있도록 해주기
module.exports = router;
//다른 곳에서 shop.js를 사용할 수 있도록 해줌
5. 미들웨어를 이용해서 sever.js에 shop.js 파일 첨부하기
app.use('/',require('./routes/shop.js'));
// shop.js 파일을 여기에 첨부하겠습니다.
이렇게 하면 파일을 분리해도 API는 잘 작동한다.
번외1) 중복되는 URL은 js 파일을 첨부할 때 경로에 추가하면 된다.
현재 아래 코드의 URL 경로에서 /shop이 중복적으로 사용된다. 따라서 해당 부분을 삭제하고 js 파일을 첨부할 때 경로를 추가 할 수 있다.
var router = require('express').Router();
// npm으로 설치했던 express 라이브러리의 Router함수를 사용하겠습니다.
router.get('/shop/shirts', function(요청, 응답){
응답.send('셔츠 파는 페이지입니다.');
});
router.get('/shop/pants', function (요청, 응답) {
응답.send('바지 파는 페이지입니다.');
});
module.exports = router;
//다른 곳에서 shop.js를 사용할 때 내보낼 변수
[ 변경 전 코드 ]
// shop.js
var router = require('express').Router();
// npm으로 설치했던 express 라이브러리의 Router함수를 사용하겠습니다.
router.get('/shop/shirts', function(요청, 응답){
응답.send('셔츠 파는 페이지입니다.');
});
router.get('/shop/pants', function (요청, 응답) {
응답.send('바지 파는 페이지입니다.');
});
module.exports = router;
//다른 곳에서 shop.js를 사용할 때 내보낼 변수
// server.js
app.use('/',require('./routes/shop.js'));
[변경 후 코드]
// shop.js
var router = require('express').Router();
// npm으로 설치했던 express 라이브러리의 Router함수를 사용하겠습니다.
router.get('/shirts', function(요청, 응답){
응답.send('셔츠 파는 페이지입니다.');
});
router.get('/pants', function (요청, 응답) {
응답.send('바지 파는 페이지입니다.');
});
module.exports = router;
//다른 곳에서 shop.js를 사용할 때 내보낼 변수
// server.js
app.use('/shop',require('./routes/shop.js'));
이렇게 하면 장점은 중복되는 URL을 없앨 수 있다는 점과 server.js에서 해당 js 파일이 어떤 것과 관련이 있는지 한번에 파악할 수 있다.
번외2) 특정 라우터 파일에 미들웨어 적용하기
만약에 셔츠를 파는 페이지에 로그인을 했는 사람만 들어가도록 만들려면 어떻게 해야할까?
이전에 만들었던 마이페이지를 이용하면 되지 않을까?
// [방법1]
var router = require('express').Router();
// npm으로 설치했던 express 라이브러리의 Router함수를 사용하겠습니다.
router.get('/shirts', checkLogin, function(요청, 응답){
응답.send('셔츠 파는 페이지입니다.');
});
router.get('/pants', checkLogin, function (요청, 응답) {
응답.send('바지 파는 페이지입니다.');
});
function checkLogin(request, response, next){
if (request.user){
next();
} else{
response.redirect('/login')
}
}
module.exports = router;
// [방법2]
var router = require('express').Router();
// npm으로 설치했던 express 라이브러리의 Router함수를 사용하겠습니다.
app.use('/shirts', checkLogin);
router.get('/shirts', function(요청, 응답){
응답.send('셔츠 파는 페이지입니다.');
});
router.get('/pants', function (요청, 응답) {
응답.send('바지 파는 페이지입니다.');
});
function checkLogin(request, response, next){
if (request.user){
next();
} else{
response.redirect('/login')
}
}
module.exports = router;
이런식으로 함수를 추가해서 마이페이지에 적용했던 것 처럼 미들웨어를 적용하면 된다.
하지만 이 방법은 API 개수가 늘어날 때마다 추가를 해줘야한다는 단점이 있다. 따라서 우리는 아래의 방법처럼 미들웨어를 적용하는 것이 좋다.
var router = require('express').Router();
// npm으로 설치했던 express 라이브러리의 Router함수를 사용하겠습니다.
router.use(checkLogin);
router.get('/shirts', function(요청, 응답){
응답.send('셔츠 파는 페이지입니다.');
});
router.get('/pants', function (요청, 응답) {
응답.send('바지 파는 페이지입니다.');
});
function checkLogin(request, response, next){
if (request.user){
next();
} else{
response.redirect('/login')
}
}
module.exports = router;
//다른 곳에서 shop.js를 사용할 때 내보낼 변수
app.use vs app.get(~~, 미들웨어, ~~)
app.use
- 해당 파일에 있는 모든 API에 미들웨어를 적용한다.
app.get(~~. 미들웨어, ~~)
- 미들웨어가 작성된 해당 경로에만 미들웨어를 적용한다.
'Server > Node.js' 카테고리의 다른 글
채팅 기능 만들어보기 (혼자 만들어본 버전) (0) | 2023.09.13 |
---|---|
이미지 업로드 해보기 (0) | 2023.09.11 |
회원 기능을 포함한 TODOLIST 사이트 (0) | 2023.09.10 |
검색기능 만들기(3) - Search Index (0) | 2023.09.09 |
검색기능 만들기(2) - indexing 개념 (0) | 2023.09.08 |