nodejs

인프런 node.js 웹개발로 알아보는 백엔드

동영상 강좌를 통해 node.js를 학습하며 정리하는 포스팅입니다.

1. mysql 연동

터미널에서 npm install mysql --save 명령어 입력

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
//DB setting
var mysql = require('mysql')
//mysql 연결정보 구성
var connection = mysql.createConnection({
    host : 'localhost',
    port : 3306,
    user : '유저네임',
    database : '데이터베이스명'
})
connection.connect();

2. mysql 구현

mysql 연동 후 간단한 ajax 기능을 구현해보겠습니다. 위와 같이 mysql을 연동 후 connection 객체를 활용하여 기능을 구현할 수 있습니다. 다음 아래의 코드는 input에 이메일을 입력후 해당 버튼을 입력하면 값이 DB에 있는지 조회를 하는 기능입니다

form.html

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
sendAjax("http://localhost:3000/email/ajax", inputData);

function sendAjax(url, data) {
            var data = {'email' : data};
            data = JSON.stringify(data);
            //URL로 보내기(method, url, data)
            var xhr = new XMLHttpRequest();
            xhr.open('POST', url);
            xhr.setRequestHeader("Content-Type", "application/json");
            xhr.send(data);
            xhr.addEventListener('load', function() {
                var result = JSON.parse(xhr.responseText);
                var resultDiv = document.querySelector('.result');
                console.log(result);

                if(result.result === 'ok') resultDiv.innerHTML = '<h1>ID : ' + result.name + '님 환영합니다.'
                else resultDiv.innerHTML = "your email is not found";
            });
        }

/email/ajax의 URL 경로를 요청하면 해당 함수가 실행되며 inputData라는 입력받은 이메일(매개변수)를 보냅니다. http 요청을 핸들링할 수 있는 xhr변수를 사용해 url, content-type등을 설정하여 데이터를 보냅니다. 이후 발생한 이벤트는 리스너를 활용해 해당 응답값(xhr.responseText)을 활용하여 데이터를 어떤 방식으로 보여줄지를 정합니다.

실제 요청에 의한 서버쪽 코드는 다음과 같습니다.

email.js

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
app.post('/ajax', function(req, res) {
    //sendAjax에 의한 호출
    console.log("ajax : " + r
                eq.body.email);
    // var responseData = {'result' : 'OK', 'email' : req.body.email};
    
    //check Validate 
    var email = req.body.email;
    var responseData = {};

    var query = connection.query("select * from USER where email='"+email+"'", function(err, rows) {
        if(err) throw err;
        if(rows[0]) {
            console.log(rows[0]);
            responseData.result = "ok";
            responseData.name = rows[0].name;
        } else {
            responseData.result = "none";
            responseData.name = "";
        }
        res.json(responseData);
    })
})

위의 코드는 입력한 이메일을 조회하여 있으면 result를 0 없으면 none으로 체크하여 if(result.result === 'ok') 해당 조건을 통해 화면에 결과값을 보여주는 기능을 확인할 수 있습니다.

3. Rounting 모듈화

javascript언어를 node.js를 통해 서버를 활성화시킬때 사용하는 app.js라는 파일은 실제 많은 요청의 url을 작성할 수 밖에 없는데 이는 기능이 세분화되고 점차 서비스의 규모가 커지게 된다면 url 라우팅을 다른 파일로 따로 분리하여 관리하는 것이 효과적입니다.

router라는 폴더를 생성하여 각 url 및 기능별로 분리시킵니다.

스크린샷 2019-11-03 오전 1 57 26

이후 router 모듈을 불러와 사용할 수 있도록 세팅을 합니다.

main.js

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
//라우터 모듈 불러오기
var router = express.Router()

//get으로 받기
router.get('/', function(req, res) {
    console.log("/main")
    res.sendFile(path.join(__dirname, "../public/main.html"))
});

//외부 라이브러리를 module로 가져올 수 있다.
// router exports 설정
module.exports = router;

app.js

1
2
3
var router = require('./router/index')
//라우터 사용 
app.use(router)

실제 url에서 / 요청이 들어온다면 app.js는 router를 확인합니다. 해당 경로를 확인하여 './router/index' 에 요청을 보냅니다. 다시 index.js안에 코드는 다음과 같습니다.

1
2
3
4
5
6
7
8
9
var router = express.Router()
var main = require('./main/main')
var email = require('./email/email')
var join = require('./join/join')

router.get('/', function(req, res) {
    console.log("/index.js path loaded")
    res.sendFile(path.join(__dirname, "../public/main.html"))
});

/으로 들어온 요청은 main.html 로 응답하게 됩니다.

이를 통해 알 수 있는 점은 router를 이용해 클라이언트의 요청을 기능별로 분리하여 깔끔하게 사용할 수 있으며 중복된 코드를 방지할 수 있다는 것입니다.