Routing 모듈화

tintwo·2022년 12월 2일

이번엔 라우팅 처리하는 부분을 모듈화

Routing (라우팅) 이란?

특정 엔드 포인트에 대한 클라이언트 요청에 서버가 응답하는 방법을 결정 하는 것.
즉 화면이 전환될 때 안내를 한다고 생각하면 된다.

** 엔드포인트
URI(경로) 와 HTTP 요청 메서드(GET, POST, PUT, DELETE 등) 으로 구분된 클라이언트 요청을 말한다.

export와 require

기존에는 app.js에서 요청 처리하는 부분을 모두 관리 했다면, 이젠 따로 router에서 요청을 관리하도록 해보자.

router 처리를 별도로 하고 관리하기 위해 일단 router이라는 폴더를 만들고, 그 안에 main.js를 작성했다.

node 에서는 외부 라이브러리를 export 하거나 require로 가져올 수 있다.

var express = require('express')
// express도 선언 해줘야 한다.
var app = express()
var router = express.Router()
// 라우터 객체 선언


router.get('/', function(req, res) {
  console.log('## module -main.js- loaded ')
  res.sendfile(__dirname + '/public/main.html')
});

module.exports = router;
// export를 해줘야 app.js에서 사용이 가능 하다.

내보내기를 해줬으니 app.js에서 받아서 사용하자.

var express = require('express')
var app = express()
var bodyParser = require('body-parser')
var mysql = require('mysql')
var main = require('./Router/main')
// 아까 위에서 export한 main.js의 경로를 잡아준다.

var connection = mysql.createConnection({
  host     : 'localhost',
  // port     : 3306 생략 가능
  user     : 'root',
  password : '****',
  database : '****'
});

connection.connect();

app.listen(3000, function() {
  console.log("start! express server on port 3000 ");
});

app.use(express.static('public'))
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({extended:true}))
app.set('view engine', 'ejs')
app.use('/main', main)
// "/main" 으로 요청이 들어오면 main이라는 router가 처리하도록 사용 설정을 해준다. 

require과, app.use를 해주고 이제 실행 해보자.

경로 문제로 오류가 났다.

var express = require('express')
var app = express()
var router = express.Router()
var path = require('path')
// 상대경로를 쉽게 지정하기 위해 path 사용 


router.get('/', function(req, res) {
  console.log('## module -main.js- loaded ')
  res.sendfile(path.join(__dirname, '../public/main.html'))
});

module.exports = router;

정상적으로 잘 작동 된다.

웹 사이트를 하나 만든다고 했을 때 카테고리 별로 요청 처리 모듈을 나눠놓으면 관리가
더 쉬울 것 같다는 생각이 든다.

app.js에 모두 박아 넣는것 보다는 훨씬

이제 email 쪽도 처리 해보자.

email.js를 router 폴더 안에 만들고 app.js의 email에 관한 처리 부분들을 옮겨 주고

export를 해준 후, 위와 같이 app.js에서 require와 app.use를 해준다. (생략)

var express = require('express')
var app = express()
var router = express.Router()
var path = require('path')

app.post('/form', function(req, res){ // << router.post
  // res.send('post response')
  console.log(req.body.email)
  // res.send('<h1>welcome ' + req.body.email + '</h2>')
  res.render('email.ejs', {'email' : req.body.email})
  // 객체를 넘겨준다. 
});

app.post('/ajax', function(req,res){ // << router.use
  console.log('#### request.body : ', req.body)
  var resData= {}
  var email = req.body.email

  var query = connection.query('select name from user where email= "' + email + '"', function(err, rows){
    if(err) throw err;

    if(rows[0]){
      console.log('#### name:', rows[0].name)
      resData.result = 'OK';
      resData.username = rows[0].name;
      resData.email = rows[0].email
      console.log('#### resData = ', resData)
    }else{ // null 처리
      console.log('#### none: ', rows[0])
      resData.result = 'none';
      resData.username = '';
    }
    res.json(resData)
  })
})

module.exports = router;

왜 안될까 자세히 봤는데

위 코드에서 app.post를 해두고 자꾸 다른곳을 찾아보고 있었다..

router.use로 바꿔준다.

비동기 처리도 시도 해보자.

이런 오류가 난다.

커넥션을 찾을 수 없다는걸 보고 db를 다시 켜보았으나 같은 에러가 뜨는데 생각해보니

email.js 에는 db연결에 대한 객체 설정을 해주지 않아서 그런거였다.

db 조회해서 이메일과 일치하는 이름을 잘 가져오고 있다.

전과 다르게 app.js에서 모든 요청을 처리하지 않고 처리하는 라우터들을 모듈화 해보았다.

email.js에는 body parser 같은건 선언해주지 않았지만 app.js에서 설정을 해두면

사용할 수 있게 된다.

profile
study records of beginner developer

0개의 댓글