2015년 1월 13일 화요일

[node 웹페이지 만들기] 4. Mysql 연결하기

  • 값이 서로 넘어가는 방법을 알아보았고, mysql 모듈을 사용하는 방법을 알아내었으니 회원가입을 하여 db에 저장하는 방법을 해보려고 합니다.
  • db에 연결하는 방법은 단순히 connection을 이용하는 방법이 있지만, 실제서버에서는 안정적인 connection pooling기법을 사용하고 있습니다.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
var pool  = mysql.createPool({
  connectionLimit : 150,
  host     : 'localhost',
  user     : 'root',
  password : '1234',
  database : 'node'
});

...
...
...
//members
router.post('/members', function(req,res){
 // console.log(req.body);
 var attr = req.body;
 delete(attr.id_ch);
 delete(attr.pass_ch);
 delete(attr.email_ch);
 delete(attr.tel1);
 delete(attr.m_tel2);
 delete(attr.m_tel3);
 delete(attr.m_pass_ch);

 var queryString = 'Insert into member Set ?';
 pool.getConnection(function(err,connection){
  connection.query(queryString,req.body, function(err, result) {
   if (err) throw err;
   console.log("insert member!");
  });
  connection.release();
  res.render('members',req.body);
 });
});

  • pooling 예제에서했던것들을 중간에 넣어 사용하면 끗!
  • join(회원가입)에서 members로 페이지를 넘기면 db에관한 처리후(24~30라인) members.ejs를 불러와 페이지를 로드(31번라인)합니다.
  • 제 예제에서는 member에 들어가는 값들에는 불필요한 값들(16~22번라인)의 값들을 제거하고 26번줄의 req.body를 넣어줌으로서 값에 대한 맵핑을 손쉽게 처리하였습니다.


  • 으로 값을 넣어 가입을 눌러
  • DB에 값이 저장되었습을 확인하였습니다.

[node mysql] node-mysql -> transaction


  • node mysql에서는 트랜젝션을 제공한다.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
connection.beginTransaction(function(err) {
  var post  = { m_tel: '010-1234-5678', m_id: 'GilDong2', m_pass: 'password1', m_name: '이순신',
                m_date: '2000-01-01', m_gender: '남', m_email: 'GilDong@Hong.com' };

  if (err) { throw err; }
  connection.query('INSERT INTO member SET ?', post, function(err, result) {
    console.log(result);
    if (err) {
      connection.rollback(function() {
        console.log("1.error");
        throw err;
      });
    }

    //실행된 결과가 0일경우
    connection.query('update member set m_gender = ? where m_name = ?', ['여','강감찬'], function(err, result) {
      console.log(result);
      if (!result.affectedRows) {
        connection.rollback(function() {
          console.log("2.error");
        });
      }
      connection.commit(function(err) {
        if (err) {
          connection.rollback(function() {
            throw err;
          });
        }
        console.log('success!');
      });
    });
  });
});


  • 주요코드는 beginTransaction(), rollback(), commit() 이다.
  • beginTransaction으로 감싼 부분이 트렉젝션이 적용된다.
  • 쓰기에 따라서, 8번라인처럼 err가 발생했을경우, 또는 17번라인처럼 해당쿼리의 결과에 따른 경우에 따라서 rollback을 실행시키면된다. 만약 중간에 rollback이 실행된다면 이전의 처리는 모든게 무효화 될것이다.
  • Transaction의 마지막 부분에 있어서 commit을 해줌으로서 모든 결과를 완료한다.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
{ fieldCount: 0,
  affectedRows: 1,
  insertId: 0,
  serverStatus: 3,
  warningCount: 0,
  message: '',
  protocol41: true,
  changedRows: 0 }
{ fieldCount: 0,
  affectedRows: 0,
  insertId: 0,
  serverStatus: 35,
  warningCount: 0,
  message: '(Rows matched: 0  Changed: 0  Warnings: 0',
  protocol41: true,
  changedRows: 0 }
2.error
success!


  • 위 코드의 결과이다. 결과값에서의 위쪽 쿼리에서의 처리된 row가 1, 아래의 쿼리에서의 처리된 row는 0으로서 본문코드의 18번에 해당되어 Rollback이  진행되었다.
    • result의 affrectedRows는 처리된 레코드의 수를 반환한다.
    • 2error 발생 확인.
  • 먼저 처리한쿼리(insert)의 결과는 1이므로 적용이 됬어야하지만, 트렌젝션으로 묶여있는 아래쿼리에서 롤백이 일어나 insert됬던 결과가 무효화 되었음을 확인하였다.
    • 기존에 1레코드 있었음