본문 바로가기
Server/Node.js

라우터 폴더와 파일 만들어서 API 관리하기

by print_soo 2023. 9. 10.

해당 글은 이전 글들의 작업을 이어서 진행되고 있는 글입니다.

 

지금까지 만들었던 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(~~. 미들웨어, ~~)

  • 미들웨어가 작성된 해당 경로에만 미들웨어를 적용한다.