1. 설치한 모듈
npm install mysql
2. 1차 소스코드
const mysql = require('mysql'); //My-sql을 사용하였다.
const connection = mysql.createConnection({ //커넥션 생성
host: 'ip주소',
user: '아이디',
database: '데이터베이스 명칭',
password : '비밀번호'
});
connection.query("select * from test", function (error, results, fields) { //조회
if (error) {
console.log(error);
} else {
console.log(results); //결과 출력(간혹 커넥션이 끊어졌다는 오류가 나올때가 있다.)
}
});
connection.end(); //연결 종료
위 방식데로 코딩하면 문제없어보이나 Node.js에서는 이러한 행위의 대부분을 이벤트 루프에 전달하여 비동기 방식으로 처리한다. (무슨말 입니까??)
위 소스코드처럼 데이터베이스에 접속해서 정보를 가져오고 있는데 다 가져오지도 않았는데 맨 아래의 connection.end() 함수가 호출되서 연결을 끊어버리는 경우가 있다.
또는 서버에서 운용중이라면 서버가 데이터베이스에서 조회작업이 끝나지도 않았는데 Response 해버리는 현상을 만날 수 있다.
이를 해결하려면 async, await라는 방법을 사용하거나 bluebird라는 모듈을 설치해서 사용하기도 하는데, 가장 쉬운방법으로는 Promise를 활용하는 것 이다. (자바스크립트의 Promise와 100% 동일하다.)
위 소스코드를 고쳐보면,
const mysql = require('mysql'); //My-sql을 사용하였다.
const connection = mysql.createConnection({ //커넥션 생성
host: 'ip주소',
user: '아이디',
database: '데이터베이스 명칭',
password : '비밀번호'
});
new Promise( (res,rej)=>{
connection.query("select * from tb_user", function (error, results, fields) { //조회
if (error) {
console.log(error);
rej(error); //실패시 catch행동을 한다.
} else {
console.log(results);
res(results); //성공시 then 이후의 행동을 한다.
}
});
}).then( res =>{ //성공하면 들어오는 구간
connection.end();
}).catch( err =>{ //실패하면 들어오는 구간
if(connection != null){
connection.end();
}
});
위 내용처럼 고쳐주면 성질급한 Node.js에게 순차적으로 일을 하도록 지시 할 수 있다.
만약 끊임없이 데이터를 등록, 수정, 삭제하는 서버 또는 앱이라면 그냥 Promise같은거 사용하지 않는 편이 속도에서 더 효율적이다.
반응형
'Node.js' 카테고리의 다른 글
NodeJs Redis 연동(NodeJs 레디스연동, zrangebyscore) (0) | 2019.08.16 |
---|---|
NodeJs 오라클 연동 (NodeJs Oracle, Node.js Oracle, Oracle 연동) (16) | 2019.08.14 |
Node.js Interceptor(인터셉터) (0) | 2019.07.18 |
Nodejs 에서 Mybatis 사용하기 (마이바티스, Node.js Mybatis) (10) | 2019.05.16 |
Node.js 웹소캣 서버 그리고 클라이언트, 채팅방과 함께하는 구성 (0) | 2019.04.28 |
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)
댓글