티스토리 뷰
실제 사이트를 개발하실 땐 app.get() app.post() 이런 코드가 100개 200개가 넘어갑니다.
그럼 다른 파일로 관리하고 싶은 욕구가 저절로 샘솟는데 그건 어떻게 하는지 알아봅시다.
연습용으로 URL route 2개를 만들었습니다.
app.get('/shop/shirts', function(요청, 응답){
응답.send('셔츠 파는 페이지입니다.');
});
app.get('/shop/pants', function(요청, 응답){
응답.send('바지 파는 페이지입니다.');
});
이제 이 route들을 다른 파일에서 관리해보도록 합시다.
route 보관용 폴더와 파일을 하나 만들어줍니다.
server.js와 나란한 곳에 routes라는 폴더를 만들고 그 안에 shop.js라는 파일을 만들어줍니다.
이제 shop.js 라는 파일에 저 코드들을 다 복붙할 것입니다.
왜 shop.js냐고요? 지금 route 경로들 보시면 다 shop으로 시작하니까 제 맘대로 이름지었습니다.
근데 그냥 복붙하면 끝이 아니라 Node express가 권장하는 스페셜한 방법으로 해보도록 합시다.
shop.js에 다음 코드를 따라 작성합니다.
(shop.js)
var router = require('express').Router();
router.get('/shop/shirts', function(요청, 응답){
응답.send('셔츠 파는 페이지입니다.');
});
router.get('/shop/pants', function(요청, 응답){
응답.send('바지 파는 페이지입니다.');
});
module.exports = router;
뭘 적은거냐면 express라는 라이브러리가 제공하는 Router() 기능을 가져다 쓰고 있는 것입니다.
그냥 라우트들을 관리할 수 있게 도와주는 일종의 함수이며
이 함수의 도움을 받으면 이전에 app.get()하던 형식 똑같이 그대로 shop.js파일에도 작성 가능합니다.
방금 만든 것 처럼 URL route들을 이리저리 안내해주는 파일을 라우터라고 칭하며
그리고 파일 최하단에서 작성한 라우터를 module.exports 라는 문법을 이용해 배출해줍니다.
그럼 이제 이 라우터를 server.js에 적용하는 일만 남았습니다.
module.exports가 뭡니까
문법설명들어갑니다.
일단 Node.js 환경에서 JS파일들을 불러와서 쓸 수 있는데 그 문법이 바로 require() 이것과 module.exports 이것입니다.
module.exports = 변수명;
JS파일 하단에 이렇게 쓰시면 다른곳에서 쓸 수 있게 변수를 내뿜어줄 수 있습니다.
함수도 가능합니다.
require('./파일경로');
이렇게 쓰시면 다른 파일을 불러올 수 있습니다. 그 불러온 파일이 내뿜은 변수를 가져다 쓸 수 있습니다.
(혹은 파일경로 대신 npm으로 설치한 라이브러리 명을 써도 됩니다)
근데 파일경로는 항상 ./ 부터 시작합니다. 이 쩜슬래시 기호는 현재경로라는 뜻입니다.
자바스크립트 신문법인 import / export 문법으로 바꿔서 쓸 수 도 있습니다. 그건 알아서 하십시오.
server.js에 라우터를 적용합시다
(server.js)
app.use('/', require('./routes/shop.js') );
app.use()는 미들웨어를 사용하고 싶을 때 쓰는 함수였습니다.
요청과 응답 사이에 실행되는 코드가 바로 미들웨어라고 배웠었죠?
app.use()를 사용해서 전역 미들웨어의 형식으로 라우터를 넣어주시면 라우터를 적용할 수 있습니다.
(express가 그렇게 쓰래요)
근데 예전에 했던 app.use() 코드랑 살짝 다른 측면이 있습니다.
app.use('/') 이런 식으로 URL 경로를 넣어줬습니다.
이게 뭐냐면 미들웨어를 조건부로 실행하고 싶을 때 쓰는 문법입니다.
누군가 /post 경로로 요청하면 실행할 미들웨어는 app.use('/post', 미들웨어명)
누군가 /list 경로로 요청하면 실행할 미들웨어는 app.use('/list', 미들웨어명)
이렇게 사용할 수 있습니다.
그래서 / 경로로 접속하면 shop.js라는 라우터를 적용하겠습니다~라고 방금 적으신겁니다.
(require는 아까 배웠던 다른 JS파일 첨부하기 문법이죠? 첨부하면 이제 router라는 변수를 가져와서 미들웨어처럼 실행해줍니다)
아무튼 위의 예제처럼 작성하면 고객이 /shop/shirts 그리고 /shop/pants로 접속시
shop.js라는 라우터가 라우팅을 해주게 되며, 실제 테스트해보시면 응답메세지가 잘 뜹니다.
URL route들 다른 파일로 관리하기 끝!
URL을 단축시킬 수도 있습니다.
이런 식으로 코드를 수정해도 잘 된다는 소리입니다.
(server.js)
app.use('/shop', require('./routes/shop.js') );
(shop.js)
var router = require('express').Router();
router.get('/shirts', function(요청, 응답){
응답.send('셔츠 파는 페이지입니다.');
});
router.get('/pants', function(요청, 응답){
응답.send('바지 파는 페이지입니다.');
});
module.exports = router;
server.js와 shop.js의 URL 경로를 저렇게 3곳을 바꿨습니다. 이래도 잘 됩니다.
server.js 에서는 "누군가 /shop 경로로 접속하면 shop.js 라우터를 사용해주세요"
shop.js 에서는 "/shop이후 /shirts로 접속하면 셔츠파는 페이지라고 응답해주세요"
라고 작성한 것입니다.
이렇게 하면 장점은..
1. 이건 /shop에 관련된 route들이구나~! 라고 보기가 쉬워집니다.
2. /shop과 관련된 route들에만 미들웨어를 적용하고 싶을 때도 매우 편리해집니다.
연습삼아 분리해보기
밑과같은 api가 있다 어떻게 분리해야 할까?
(server.js)
app.get('/board/sub/sports', function(요청, 응답){
응답.send('스포츠 게시판');
});
app.get('/board/sub/game', function(요청, 응답){
응답.send('게임 게시판');
});
왼쪽과 같이 됬다면 알맞게 파일을 생성하였고 category.js라고 이름을 지정하였고 안의 내용은 이러하다
var router = require('express').Router()
router.get('/sports',(req,res)=>{
res.send('스포츠 게시판')
})
router.get('/game',(req,res)=>{
res.send('게임 게시판')
})
module.exports = router
/shop과 관련된 route들에 미들웨어를 적용하고 싶다면
그러니까 /shop과 관련된 페이지들을 방문하기 전 로그인했는지 검사를 해주고 싶으면 어떡하죠?
예전에 로그인 배울 때 로그인했니라는 함수를 만들거나 기존에 사용하던 로그인체크 함수를 라우터js에 가져와 붙여넣기한다.
app.get('/mypage', 로그인했니, function(요청, 응답){
응답.send('마이페이지인데요');
});
▲ 로그인함수를 적용시킨 mypage api
그럼 /shop 관련된 라우트들에도 위의 예제처럼 똑같이 미들웨어를 적용하실 수 있습니다.
(shop.js)
var router = require('express').Router();
function 로그인했니(요청, 응답, next) {
if (요청.user) { next() }
else { 응답.send('로그인 안하셨는데요?') }
}
router.get('/shirts', 로그인했니, function(요청, 응답){
응답.send('셔츠 파는 페이지입니다.');
});
router.get('/pants', function(요청, 응답){
응답.send('바지 파는 페이지입니다.');
});
module.exports = router;
▲ 이렇게 똑같이 하면 이제 로그인한 사람만 /shop/shirts 페이지를 접속할 수 있습니다. 확인해보십쇼.
혹은 라우터 파일 내에 있는 전체 route에 다 적용하고 싶으면 이렇게 쓰시면 됩니다.
(shop.js)
var router = require('express').Router();
router.use(로그인했니);
function 로그인했니(요청, 응답, next) {
if (요청.user) { next() }
else { 응답.send('로그인 안하셨는데요?') }
}
router.get('/shirts', function(요청, 응답){
응답.send('셔츠 파는 페이지입니다.');
});
router.get('/pants', function(요청, 응답){
응답.send('바지 파는 페이지입니다.');
});
module.exports = router;
▲ 이렇게 router.use(로그인했니); 라고 적어주시면 밑에나온 모든 라우트들에 미들웨어를 적용해줄 수 있습니다.
혹은 router.use('/shirts', 로그인했니); 이렇게 하시면 /shirts에 접속할 때만 로그인했니라는 미들웨어를 적용할 수 있습니다.
'Node.js' 카테고리의 다른 글
Node.js + MongoDB 이미지 업로드하기 폴더에저장(multer,path[lib]) (0) | 2023.05.23 |
---|---|
Node.js + MongoDB Google Cloud로 사이트 배포하기($300 무료 크레딧) (0) | 2023.05.23 |
Node.js + MongoDB 회원가입, 게시판 작성자만 삭제가능 기능만들기 (1) | 2023.05.22 |
Node.js +_MongoDB 검색3(colection.aggregate(), $regex) (0) | 2023.05.22 |
Node.js + MongoDB 검색2(MongoDB index만들기) (0) | 2023.05.22 |