[connectDB.json] >> connectDB.js 파일에서 사용할 DB 정보

connectDB.json 파일

 

[connectDB.js] >> 여러 router에서 사용할 db 모듈 

connectDB.js 파일

 

index.js

 

[NODEJS ROUTER]부분

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/* GET home page. */
router.get('/:page'function(req, res) {
  if(req.session.adminID){
    var sql = "SELECT *, INV.INV_QTY FROM md_mtrl AS M INNER JOIN MA_INVENT AS INV ON M.MTRL_CD = INV.MTRL_CD WHERE USE_YN = 'Y'";
    db.query(sql, function(error, rows){
      if(!error){
        if(rows.length>0){
 
          // 페이지당 게시물 수
          var page_size = 2;
          // 페이지의 개수 : 화면 하단 페이지 숫자 버튼 개수
          var page_list_size = 2;
          // limit 변수
          var no = '';
          //전체 게시물의 숫자 : 쿼리문 결과수
          var totalPageCount = rows.length;
          if(totalPageCount < 0){
            totalPageCount = 0;
          }
          //현제 페이지
          var curPage = req.params.page;
          
          var totalPage = Math.ceil(totalPageCount / page_size);// 전체 페이지수
          var totalSet = Math.ceil(totalPage / page_list_size); //전체 세트수
          var curSet = Math.ceil(curPage / page_list_size) // 현재 셋트 번호
          var startPage = ((curSet - 1* page_list_size) + 1 //현재 세트내 출력될 시작 페이지
          var endPage = (startPage + page_list_size) - 1//현재 세트내 출력될 마지막 페이지
          
          //현재페이지가 0 보다 작으면
          if (curPage < 0){
            no = 0;
          }else{
            //0보다 크면 limit 함수에 들어갈 첫번째 인자 값 구하기
            no = (curPage - 1* page_size;
          }
 
          var page_date = {
            "curPage": curPage,
            "page_list_size": page_list_size,
            "page_size": page_size,
            "totalPage": totalPage,
            "totalSet": totalSet,
            "curSet": curSet,
            "startPage": startPage,
            "endPage": endPage
          };
 
          // 추가 쿼리문
          sql += " LIMIT "+no+","+page_size+"";
          console.log("쿼리문 : "+sql)
          db.query(sql, function(error, rows){
            if(!error){
              res.render('mtrl_list',{rows : rows, pasing : page_date});
            }
          });
        }else{
          res.render('mtrl_list',{rows:[]});
        }
      }else{
        res.render('mtrl_list',{rows:[]});
      }
    });
    
  }else{
    res.redirect('/');
  }
});
cs
 

[HTML]부분

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
<%
    var endPage = pasing.endPage;
    var startPage = pasing.startPage;
    var totalSet = pasing.totalSet;
    var totalPage = pasing.totalPage;
    var page_list_size = pasing.page_list_size;
    var page_size = pasing.page_size;
    var curPage = pasing.curPage;
%>
 
<div class="paging">
    <%  if(curSet > 1){ %>
        <span><a href="/mtrl_list/<%= (startPage - 1) %>" class="prev"></a></span>
    <%  } %>
 
    <%  for(var i = startPage; i <= endPage; i++){ 
            if(i > totalPage){break;}
            if(i == curPage){
    %>
            <span><a class="on" href="/mtrl_list/<%= i %>"><%= i %></a></span>
    <%      }else{  %>
            <span><a href="/mtrl_list/<%= i %>"><%= i %></a></span>
    <%      }  %>
    <%  } %>
 
    <% if(curSet < totalSet){ %>    
        <span><a href="/mtrl_list/<%= endPage + 1 %>" class="next"></a></span>
    <%  }  %>
</div>
cs

##참고URL

https://www.npmjs.com/package/express-socket.io-session

1. express-socket.io-session 모듈 설치

1
npm install express-socket.io-session
 

2. 서버쪽 코드 [app.js]

socket.handshake.session으로 세션데이터로 접근 (38,39번 라인참고)

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
var app = express();    // nodejs express의 디폴트 포트번호는 3000번
 
var http = require('http');
var socketio = require('socket.io');
var server = http.createServer(app);
var io = socketio.listen(server);
server.listen(8080);    // 소켓 서버 포트는 8080으로 설정함
 
// 세션 설정
var session = session({                                            
  secret:"asdfasffdas",
  resave:false,
  saveUninitialized:true
});
 
app.use(session);
 
// 소켓 구문 시작 =================================================
var ios = require("express-socket.io-session"); // 소켓 내에서 세션데이터 접근 가능하도록하는 모듈
io.use(ios(session, { autoSave:true }));  // 모듈과 세션 연결
 
io.sockets.on('connection'function(socket){
  // 클라이언트에게 메세지 송신 방법
  // io.emit  == 접속된 모든 클라이언트에게 메세지 전송
  // socket.emit    == 메세지를 전송한 클라이언트에게만 전송
  // io.to(id).emit == 특정 클라이언트에게만 메세지 전송 (본인 포함)
  // socket.broadcast.to(id).emit == 본인은 제외한 특정 클라이언트에게만 전송
  // socket.emit('message', '서버 데이터 받음');
  // socket.on('이벤트명',기능 서술) == 서버 또는 클라이언트에서 메세지를 받는 방식
 
  // room 이름 설정
  var room = 'chatting';
 
  // 클라이언트에서 'login'이라는 이벤트명으로 서버로 송신하면 여기로....
  // 접속한 클라이언트의 정보가 수신
  socket.on('login'function() {
    console.log('########클라이언트 로그인########');
    var userID = socket.handshake.session.adminID;    // <======= 소켓 내에서 세션에 접근 
    var DEPT_CD = socket.handshake.session.DEPT_CD; // <======= 소켓 내에서 세션에 접근 
    console.log('session 사원 아이디 : '+ userID + " || " +'session 사원 부서번호 : '+ DEPT_CD);
 
    // room에 join한다
    socket.join(room);
    console.log("room에 존재하는 사원 수 : "+ io.sockets.adapter.rooms['chatting'].length);
  });
 
  // 클라이언트로부터 메세지 수신
  socket.on('message'function(message){
    var data = JSON.stringify(message);
    socket.emit('self''제품입고관리로 전송완료');
    socket.broadcast.to(room).emit('message', data); // 룸에서 본인을 제외한 방이 존재하는 사람들에게 전송
  });
});
// 소켓 구문 종료 =================================================
 

 

제목 처럼 socket.io 모듈을 사용하여 서버를 통해 다른 클라이언트로 데이터를 전송하는 방법을 알아보겠습니다.

 

socket.io 모듈은 nodejs의 내장 모듈이 아니라 설치를 해주어야 합니다. 

 

본인의 프로젝트 폴더에 들어가서 다음과 같은 명령어를 입력하여 설치를 해줍니다.

1
npm install --save socket.io
 

다음은 서버 설정 입니다.

[app.js] 서버쪽

1
2
3
4
5
6
7
var app = express();
 
var http = require('http');
var socketio = require('socket.io');
var server = http.createServer(app);
var io = socketio.listen(server);
server.listen(8080);
 

1. http 모듈은 nodejs 내장 모듈이라 따로 설치 ㄴㄴ

2. socket.io 모듈을 처음에 설치해 주었으니 사용한다고 선언해줍니다.

3. 소켓 서버을 설정해줍니다.

****참고로 nodejs 서버의 포트 번호는 3000으로 설정해준 상태입니다.

4. 소켓 서버의 포트 번호는 8080으로 설정해줍니다.

 

[app.js] 서버쪽

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
// 소켓 구문 시작 =================================================
 
io.sockets.on('connection'function(socket){
 
  // 접속한 클라이언트의 정보가 수신되면
  socket.on('login'function(data) {
    console.log('########클라이언트 로그인########\n USER: ' + data.userid);
 
    // socket에 클라이언트 정보를 저장한다
    var room = 'chatting';
 
    // room에 join한다
    socket.join(room);
    
    // 접속된 모든 클라이언트에게 메시지를 전송한다
    socket.emit('login''소켓 서버 로그인 성공');
 
    // 클라이언트로 부터 메세지 수신
    socket.on('message'function(message){
      var data = JSON.stringify(message);
      io.to(room).emit('message', data); // room에 join한 유저들에게 데이터 전송
      console.log('Message from Client: ' + data);
    });
  });
 
  // 클라이언트에게 메세지 송신 방법
  // io.emit  == 접속된 모든 클라이언트에게 메세지 전송
  // socket.emit    == 메세지를 전송한 클라이언트에게만 전송
  // io.to(id).emit == 특정 클라이언트에게만 메세지 전송
  // socket.emit('message', '서버 데이터 받음');
});
// 소켓 구문 종료 =================================================
 

다음은 클라이언트 코드를 보도록 하겠습니다.

[index.html] 클라이언트쪽

1
2
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.3.0/socket.io.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.3.0/socket.io.js.map"></script>
 

html 또는 ejs 파일에 위와 같은 cdn을 추가해 줍니다.

그리고 클라이언트 자바스크립트에는

[index.js] 클라이언트쪽

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// socket.io 서버에 접속한다
    var socket = io('http://192.168.XXX.XXX:8080');
    socket.emit('login',{
        userid: $('#userID').val() // 접속한 회원 정보
    });
 
    // 서버로부터의 메시지가 수신되면
    // socket.on("login", function(data) {
    //     alert(data);    
    // });
 
    //서버로부터의 메시지가 수신되면
    socket.on("message"function(data) {
        alert(data);  
    });
 
    //테스트
    $('#form_btn').on('click',function(){
        socket.emit('message', {
            message: $('#test_form').serialize()
        });
    });
 
 

위에서 가장 중요한건

1
var socket = io('http://192.168.XXX.XXX:8080');
 

이다.

 

이것을 잘못 입력하면(예를 들어 'localhost:808'로 전송시) 아래와 같은 에러가 뜬다.

 

정확하게 'localhost:8080'으로 입력해야 에러가 발생하지 않는다.)

에러 이유는 클라이언트 코드와 

1
var socket = io('http://192.168.XXX.XXX:8080');
 

서버쪽 코드가

1
2
3
4
5
6
7
var app = express();
 
var http = require('http');
var socketio = require('socket.io');
var server = http.createServer(app);
var io = socketio.listen(server);
server.listen(8080);
 

맞지 않는다면 에러가 발생하는 것이다.

 

정리하자면

nodejs express는 기본적으로 3000번 포트를 사용하며 app 변수는 3000번 포트가 기본적으로 설정되어있다.

var server = http.createServer(app);

var io = socketio.listen(server);

위의 2줄 구문 처럼 app의 3000번 포트 안에 소켓 서버를 설정하고

server.listen(8080); 소켓 서버는 8080포트로 받는것이다.

 

클라이언트가 웹(3000번)으로 접속하고 소켓서버(8080)으로 데이터를 전송하는 순서이다. 

1. nodejs 및 npm 설치 여부

1
2
3
4
5
[root@localhost ~]# node -v
v6.17.1
[root@localhost ~]# npm -v
3.10.10
 

- 설치가 안되어 있다면

1
[root@localhost ~]# yum install npm nodejs
 

2. express 설치

1
[root@localhost ~]# npm install -g express-generator
 
1
2
3
4
[root@localhost ~]# express -e 프로젝트 폴더명
[root@localhost ~]# cd 프로젝트 폴더명
[root@localhost ~]# npm install
[root@localhost ~]# npm init
 

-필자는 프로젝트 폴더명을 'myapp'이라고 했음...

npm init 명령어 이후  ls 명령어로 하위 폴더을 살펴보면 다음과 같이 생성되어 있는것을 볼 수 있다.

1
2
[root@localhost myapp]# ls
app.js  bin  node_modules  package.json  public  routes  views
 

방화벽 오픈(nodejs express 서버의 포트 번호는 3000번이므로...)

1
2
[root@localhost myapp]# firewall-cmd --permanent --zone=public --add-port=3000/tcp
[root@localhost myapp]# firewall-cmd --reload
 

mysql 모듈 추가 명령어는

1
npm install mysql
 

session 모듈 추가는

1
npm install --save express-session
 

[app.js]

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
34
35
36
37
38
39
40
41
42
43
44
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
 
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var paintingRouter = require('./routes/painting');
 
var app = express();
 
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine''ejs');                
app.engine('html', require('ejs').renderFile);
 
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
 
app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/painting', paintingRouter);
 
// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next();
});
 
// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env'=== 'development' ? err : {};
 
  // render the error page
  res.status(err.status || 500);
  res.render('error');
});
 
module.exports = app;
 

[routers/users.js]

1. GET방식

1
2
3
4
5
6
7
8
9
10
var express = require('express');
var router = express.Router();
var db = require('../connectDB');
 
/* GET users listing. */
router.get('/'function(req, res, next) {
  db.query('SELECT * FROM ProductTable WHERE prCode=?',req.query.num,(err, rows, fields) => {
    res.send(rows);
  });
});
 
 

2. POST방식

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function sendPost(number){
    fetch(
        `/users`,        // URL
        {
            method: 'post',         // method
            body: JSON.stringify({    // URL로 보낼 데이터
                num: number        
            }),
            headers:{        // json data를 보내기 위한 
                'Content-Type''application/json'
            }}
        ).then(function(response){
            return response.json();
        }).then(function(json){
            console.log(json);
        });
}
 
 

[routers/users.js]

1
2
3
4
5
6
7
8
9
10
11
12
var express = require('express');
var router = express.Router();
var db = require('../connectDB');
 
/* POST users listing. */
router.post('/'function(req, res, next) {
  var number = req.body.num;
  db.query('SELECT * FROM ProductTable WHERE prCode=?',req.body.num,(err, rows, fields) => {
    res.send(rows); 
  });
});
module.exports = router;
 

+ Recent posts