mysql vs mysql2

woals3000·2021년 7월 29일
1

Today I Learned

목록 보기
58/62
post-thumbnail

mysql2의 존재를 알게됨

sequelize 스프린트를 진행하면서 에러가 발생해 진행이 어려웠다.

npm install로 필요한 패키지들을 전부 install 하였는데, mysql2 모듈을 자꾸 설치하라는 에러였다.

  • 에러 메세지
Error: Please install mysql2 package manually
    at ConnectionManager._loadDialectModule (/home/jaemin/node_modules/sequelize/lib/dialects/abstract/connection-manager.js:81:15)
    at new ConnectionManager (/home/jaemin/node_modules/sequelize/lib/dialects/mysql/connection-manager.js:25:21)
    at new MysqlDialect (/home/jaemin/node_modules/sequelize/lib/dialects/mysql/index.js:15:30)
    at new Sequelize (/home/jaemin/node_modules/sequelize/lib/sequelize.js:340:20)
    at Object.<anonymous> (/home/jaemin/Desktop/section3-2/im-sprint-shortly-mvc/models/index.js:15:15)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Module.require (internal/modules/cjs/loader.js:952:19)
    at require (internal/modules/cjs/helpers.js:88:18)
    at Object.<anonymous> (/home/jaemin/Desktop/section3-2/im-sprint-shortly-mvc/__test__/01_setup.test.js:4:23)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Module.require (internal/modules/cjs/loader.js:952:19)
    at require (internal/modules/cjs/helpers.js:88:18)
    at Object.exports.requireOrImport (/home/jaemin/Desktop/section3-2/im-sprint-shortly-mvc/node_modules/mocha/lib/esm-utils.js:42:12)
    at Object.exports.loadFilesAsync (/home/jaemin/Desktop/section3-2/im-sprint-shortly-mvc/node_modules/mocha/lib/esm-utils.js:55:34)
    at Mocha.loadFilesAsync (/home/jaemin/Desktop/section3-2/im-sprint-shortly-mvc/node_modules/mocha/lib/mocha.js:473:19)
    at singleRun (/home/jaemin/Desktop/section3-2/im-sprint-shortly-mvc/node_modules/mocha/lib/cli/run-helpers.js:125:15)
    at exports.runMocha (/home/jaemin/Desktop/section3-2/im-sprint-shortly-mvc/node_modules/mocha/lib/cli/run-helpers.js:190:10)
    at Object.exports.handler (/home/jaemin/Desktop/section3-2/im-sprint-shortly-mvc/node_modules/mocha/lib/cli/run.js:362:11)
    at /home/jaemin/Desktop/section3-2/im-sprint-shortly-mvc/node_modules/yargs/build/index.cjs:443:71

에러메세지에서는 스프린트 폴더의 node_modules가 아닌 다른 경로의 node_modules를 참조하는것 같았다.

해당 위치의 node_modules를 확인 해보니, mysql2 모듈이 없었고,
상위 경로에서 npm install mysql2 명령문을 통해 mysql2를 설치하니 에러가 해결 되었다.

왜 스프린트 폴더에서의 mysql2 모듈을 참조하지 않고, 해당 경로를 참조하는지는 좀더 찾아봐야할 것 같다.

크루분께서는 아마도 mysql 과 sequelize 설치 방식,경로의 매칭등이 중요논점으로 보여진다고 하셨다.

우선 mysql2는 mysql과 어떤 차이점이 있는지, 왜 mysql2를 사용하는지 궁금해졌고, 간단히 짚어보았다.

MySQL과 MySQL2의 차이점

섹션3에서는 백엔드를 공부하게된다.
그래서 섹션3에서는 과제를 진행할때 node.js서버와 DB를 연결시키는것이 필수이다.

mysql 모듈은 mysql용 node.js 드라이버이고, mysql2 또한 mysql용 node.js 드라이버이다.
두 모듈은 자바스크립트로 작성 되었다.

  • mysql 사용법
var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'me',
  password : 'secret',
  database : 'my_db'
});
 
connection.connect();
 
connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
  if (error) throw error;
  console.log('The solution is: ', results[0].solution);
});
 
connection.end();

npm에서 mysql2를 소개할때 다음과 같이 설명한다.

MySQL client for Node.js with focus on performance. Supports prepared statements, non-utf8 encodings, binary log protocol, compression, ssl much more

직역한다면, 성능에 초점을 맞춘 mysql모듈이라고 한다.
이진 로그 프로토콜, 압축, utf8 이외의 유니코드 인코딩, 프리페어드 스테이트먼트가 가능하다고 한다.
mysql의 업그레이드 버전? 이라고 생각하면 될 것 같다.

그렇다면 왜 sequelize는 mysql2를 사용하는걸까?

sequelize는 a promise-based Node.js ORM이고, 다양한 데이터베이스와 소통이 가능하다.
이번 과제에서 sequelize는 mysql 데이터베이스와 소통하였기에 mysql 모듈을 사용한 것 같다.

그리고 mysql2를 사용하는 이유는 다른 이유도 있겠지만은,
내가 찾고 이해하게된 것은 바로 promise 사용 여부 때문이다.

sequelize의 쿼리문은 async await을 사용하거나, .then()함수로 값을 핸들링한다.
즉, 비동기적으로 코드가 움직인다.

  • 예시코드
module.exports = {
      get: async (req, res) => {
            
            const result = await urls.findAll();   
            try {
            res.status(200).json(result)
            }
            catch {
            res.sendStatus(404)
            }
      

      }
}

sequelize의 기본 쿼리중 데이터의 모든 값을 조회하는 findAll 메소드를 사용할 때, async await을 사용한다.

async await은 promise에 의존하는 함수이다.

mysql은 callback기반이기 때문에 promise를 사용하지 못하고,
npm에 있는 promise-mysql 모듈을 따로 설치해서 사용해야한다.
하지만 mysql2는 promise를 지원하기 때문에 다른 모듈을 설치하지 않고 사용이 가능하다.

이러한 장점 때문에 sequelize에서 db는 mysql을 사용한다면
node.js 드라이버는 mysql2를 채택 하게 되는 것 같다.

참고 사이트

https://stackoverflow.com/questions/25344661/what-is-the-difference-between-mysql-mysql2-considering-nodejs
https://www.npmjs.com/package/mysql2
https://ukcasso.tistory.com/64

profile
내가 보려고 쓰는 블로그

0개의 댓글