본문 바로가기

백엔드

[Node.js] 4. Express 라우터

Router

코드를 계속해서 작성하다 보면 server 파일의 코드 양이 많아지고 지저분해지면서 개발자는 자연스럽게 이를 리팩토링하고 싶어진다. 이를 위해 Express의 라우터 객체를 이용하여 프로젝트 구조를 깔끔하게 정리할 수 있다.

 

초기의 코드

const express = require("express");
const mysql = require("mysql");
const dbConfig = require("./config/database.js");
const connection = mysql.createConnection(dbConfig);
const bodyParser = require("body-parser");

const server = express();

server.use(bodyParser.json())

server.get("/location",(req,res)=>{
    connection.query('SELECT * FROM location', (error, rows)=>{
        if(error) throw error;
        console.log('Location info is: ', rows);
        res.send(rows);
    });
});


server.get("/location/:token",(req,res)=>{
    connection.query('SELECT * FROM location WHERE token=\''+req.params.token+'\'', (error, rows)=>{
        if(error) throw error;
        console.log('Location info is: ', rows);
        res.send(rows)
    });
});

//?를 사용하면 query 함수에서 전달받은 params를 매핑해줌
server.post("/location",(req,res)=>{
    var sql = 'INSERT INTO location VALUES (?,?,?)';
    var params = [req.body.token,req.body.latitude, req.body.longitude];
    connection.query(sql, params, (error, rows)=>{
        if(error) throw error;
        console.log('Location info is: ', rows);
        res.send(rows);
    });
})



server.put("/location/:token",(req,res)=>{
    var sql = 'UPDATE location SET latitude='+req.body.latitude+', longitude='+req.body.longitude+' WHERE token=\''+req.params.token+"\'";
    connection.query(sql, (error, rows)=>{
        if(error) throw error;
        console.log('Location info is: ', rows);
        res.send(rows);
    });
})


server.delete("/location/:token",(req,res)=>{
    var sql = 'DELETE FROM location WHERE token=\''+req.params.token+'\'';
    connection.query(sql, (error, rows)=>{
        if(error) throw error;
        console.log('Location info is: ', rows);
        res.send(rows);
    });
});

server.listen(3000, ()=>{
    console.log("the server is running")
});

 위를 보면  코드의 양도 많다 보니 무엇을 하는지 정확히 파악하기가 어렵고, 후에 코드를 수정할 경우에도 많이 피곤할 것이다. 이를 Express에서 제공하는 라우터를 통해 해결한다.

 

리팩토링

먼저 프로젝트 폴더에 routes 폴더를 생성하고 해당 폴더 내에 location.js 파일을 생성한다. 이 파일을 라우터 객체를 반환하는 모듈로 활용된다. 그리고 location.js의 코드를 다음과 같이 작성한다.

 

location.js

const express = require('express');
const router = express.Router();
const mysql = require("mysql");
const dbConfig = require('../config/database.js');
const connection = mysql.createConnection(dbConfig);
const bodyParser = require('body-parser');

connection.connect();

router.use(bodyParser.json());

router.get('/',(req,res)=>{
    connection.query('SELECT * FROM location', (error, rows)=>{
        if(error) throw error;
        console.log('Location info is: ', rows);
        res.send(rows);
    });
});


router.get("/:token",(req,res)=>{
    connection.query('SELECT * FROM location WHERE token=\''+req.params.token+'\'', (error, rows)=>{
        if(error) throw error;
        console.log('Location info is: ', rows);
        res.send(rows)
    });
});

//?를 사용하면 query 함수에서 전달받은 params를 매핑해줌
router.post("/",(req,res)=>{
    var sql = 'INSERT INTO location VALUES (?,?,?)';
    var params = [req.body.token,req.body.latitude, req.body.longitude];
    connection.query(sql, params, (error, rows)=>{
        if(error) throw error;
        console.log('Location info is: ', rows);
        res.send(rows);
    });
})


//url로 id를 전달해주고 body에 바꾸고 싶은 필드를 적으면 업데이트됨
router.put("/:token",(req,res)=>{
    var sql = 'UPDATE location SET latitude='+req.body.latitude+', longitude='+req.body.longitude+' WHERE token=\''+req.params.token+"\'";
    connection.query(sql, (error, rows)=>{
        if(error) throw error;
        console.log('Location info is: ', rows);
        res.send(rows);
    });
})

router.delete("/:token",(req,res)=>{
    var sql = 'DELETE FROM location WHERE token=\''+req.params.token+'\'';
    connection.query(sql, (error, rows)=>{
        if(error) throw error;
        console.log('Location info is: ', rows);
        res.send(rows);
    });
})

module.exports = router;

바뀐점은 그냥 express 서버 객체에서 HTTP Method를 수행하는 것이 아니라, 라우터 객체를 생성하여 라우터객체.HTTP Method의 형태로 사용하면 된다. 그리고 또 주목해야 할 점은 받은 경로명이 기존과 달라졌다. 이는 server.js 파일을 수정하고 설명한다.

 

server.js

const express = require("express");
const app = express();
const location = require('./routes/location');

app.use('/location', location);
    

app.listen(3000, () => {
    console.log("the server is running")
});

코드가 훨씬 간결해졌다. 모듈을 받아오고 app.use('/location', location);만 수행했을 뿐이다. 여기서 주목할 점은 좌측 파라미터인 '/location'이다. 이는 라우터의 root 경로로 사용된다. 자 다시 위 코드중 GET 메소드를 사용하는 코드를 보면,

router.get('/',(req,res)=>{
    connection.query('SELECT * FROM location', (error, rows)=>{
        if(error) throw error;
        console.log('Location info is: ', rows);
        res.send(rows);
    });
});

 여기서는 경로명이 '/'이다. 하지만 server.js에서 라우터의 경로를 '/location'으로 설정했으므로, 우리가 GET으로 요청을 하기 위해서는 http://localhost:3000/location을 요청하면 위 코드가 수행된다. 이 개념만 유의한다면 사용하기에 어려움이 없을 것이다.