궤도

[백엔드] MySQL 테이블 sequelize-auto로 Node.js에 연동하기 본문

💻 현생/📃 VIVA

[백엔드] MySQL 테이블 sequelize-auto로 Node.js에 연동하기

영이오 2021. 1. 22. 17:09

백엔드를 맡았다...

Node.js로 개발할거고 DB는 MySQL을 사용할 것인데, 검색을 하다보니 Node.js와 궁합이 잘 맞는 DB는 MongoDB라는 글을 발견하고 말았다. 하지만 우린 이미 MySQL을 연동해버렸다. 어쩔 수 없지 뭐 설마 큰일이 생길까

 

아무튼 동아리 프로젝트에서도 기획(+약간의 디버깅)만 맡아오고 평소에도 알고리즘이나 풀어오던 나는 관련 지식이 전무하다. 그래서 일단 강좌를 들었다.

 

opentutorials.org/course/3332

 

WEB2 - Node.js - 생활코딩

수업소개 이 수업은 JavaScript를 이용해서 Node.js를 제어해 동적으로 HTML 코드를 생성하는 웹애플리케이션을 만드는 방법에 대한 수업입니다.  수업대상 예를들어 1억개의 페이지로 이루어진 웹사

opentutorials.org

지난 학기 빅데이터 수업에서 HTML을 배워둔 덕분에 큰 어려움 없이 들었다. 여기서 개별 파일로 관리하던 데이터들을

 

opentutorials.org/course/3347

 

Node.js - MySQL - 생활코딩

수업소개 이 수업은 Node.js와 MySQL을 이용해서 웹애플리케이션을 만드는 방법에 대한 수업입니다.  수업대상 예를들어 1억 개의 페이지로 이루어진 웹사이트에서 필요한 정보가 파일에 하나하나

opentutorials.org

이 강좌에서 DB연동을 통해 관리했다. 처음에 DB 연동이 제대로 안돼서 별 짓을 다했는데, 알고보니 3306 포트를 사용하는 프로세스가 2개 실행중이었어서 생긴 오류였다. kill로 죽였더니 해결됐다.

 

opentutorials.org/course/3370

 

Node.js - Express - 생활코딩

수업소개 이 수업은 Node.js의 대표 웹프래임워크인 Express를 이용해서 웹애플리케이션을 구현하는 방법에 대한 수업입니다.  수업대상 코드가 복잡해지면 점차 애플리케이션을 구현하는 것이 고

opentutorials.org

그리고 마지막으로 이 강좌를 들었다. 그전까진 따라하면서도 오...이거 너무 코드가 더러운데..? 라고 생각했는데 이 친구를 듣고 나니 좀 정리가 되긴 하더라

 

하지만

3개의 강의를 모두 듣기 전의 나와 지금의 내가 뭐 그리 다른지는 모르겠다. 이해를 했지만 이해를 하지 못한 상태...

그래서 오늘은 node.js와 친해지는 날로 정했다.

지금까지 스크롤을 내렸다면 알겠지만, 난 블로그를 깔끔하고 예쁘게 관리 하지 못한다. 백엔드를 맡길 잘한 것 같다...

 

medium.com/wasd/node-js%EC%97%90%EC%84%9C-mysql-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-1-b4b69ce7433f

 

Node.js에서 MySQL 사용하기 — Part 1

이번 시간에는 node.js에서 직접 MySQL을 사용해보겠습니다. 우선 MySQL 모듈을 설치 해야 합니다.

medium.com

파트1인데 왜 파트2가 보이지 않을까? 내가 찾지 못하는 것 같기도 하다.

잘 모르겠지만 sequelize를 사용하면 데이터 관리가 수월한 듯하다. 해당 블로그에는 sequelize를 이용한 CRUD를 하는 방법이 적혀 있는데, 기존의 SQL문보다 좋아보인다. 그래서 sequelize에 대해 더 알아보기로 했다.

 

alencion.tistory.com/48

 

[Nodejs] Sequelize로 DB연결하기.

Seqeulize 사용하기 seqeulize는 nodejs에서 웹을 데이터베이스에 연동할 때 사용하는 미들웨어이다. seqeulize는 DB에서 조회 된 값을 객체로 전달해주는 ORM(object-relational mapping)이다. Seqeulize 사전작..

alencion.tistory.com

뭐가 뭔지 모르겠다. 다만 이 블로그가 관련 함수를 잘 정리해주신 것 같으니 나중에 참고해야지...

 

alencion.tistory.com/43?category=811710

 

[Nodejs] Pug 사용법

[Nodejs]Pug 사용법 Pug는 Nodejs Express Template Engine이다. html 대신 사용한다. 장점 HTML을 간단하게 표현해서 가독성 이 좋다. 정적인 부분과 동적인 부분을 따로 할 수 있다. 타 Express Engine보다 Goog..

alencion.tistory.com

한편 해당 블로그에서 이런 글을 발견했다. HTML을 간단하게 표현하는 방법이라는데, 마치 파이썬을 처음 봤을 때의 기분이다. 언젠가 쓸 일이 있을 수도 있으니 링크를 걸어둬야겠다.

 

그 이후로도 여러 글을 찾아봤으나 읽기만 하니 집중도 안되고 머리에 뭐가 들어오는 것 같지도 않아 직접하기로 했다.

 

m.blog.naver.com/so15284/221739591994

 

[Node.js] Express Setting하기

안녕하세요~ Express Setting 하는 방법에 대해 설명을 드리겠습니다.오래 되었지만 전에 Node.js 설치...

blog.naver.com

지금부터 이 블로그를 따라할 것이다.

 

오...

생겨난 파일들에 대한 설명은 저 블로그에서 잘 설명해주셨기 때문에 굳이 쓰지 않겠다.

나는 백엔드니까 저 중에서 routes 폴더와 친해져야 하나보다.

 

오호

아직까지 오류가 없다. 기적과도 같은 일이다.

 

아 근데 블로그가 좋긴 한데 너무 글씨가 작아서 힘들다. 그니까 여기에 코드만 따로 쓰겠다.

 

먼저 express project를 생성할 프로젝트를 연다.

vs code를 쓰고 있다면 터미널을 열고 순서대로 명령어들을 치자.

 

npm i -g express-generator

express project를 생성할 것이니 당연히 express를 먼저 설치해야 한다.

 

express "생성할 프로젝트 명" --view=ejs //html이 익숙하면
express "생성할 프로젝트 명" --view=pug //pug이 익숙하면

그 다음엔 project를 생성하는데 난 프로젝트 명을 VIVA로 했고 html이 익숙하여

express VIVA --view=ejs 라고 명령어를 쳤다.

 

cd "생성한 프로젝트 명"
npm i

npm start

생성된 프로젝트로 디렉토리를 이동하고, npm 모듈을 설치한 뒤 실행하고 localhost:3000으로 들어가보자~

 

여기까지가 기본적인 Express Setting이었고 이제 원래 목적이었던 sequelize를 설치할 차례이다.

npm i sequelize mysql2

 

성공했다면 package.json 파일의 dependencies 부분에

"mysql2": "^2.2.5",
"sequelize": "^6.4.0"

이 2개가 추가 됐을 것이다.

 

npm i -g sequelize-cli

sequelize 명령어를 사용하기 위해 sequelize-cli를 설치하자.

 

sequelize init

초기화다.

 

config, migrations, models, seeders 폴더가 새로 생긴 것을 확인할 수 있다.

 

그 다음엔 models/index.js를 수정해야 한다고 하는데 일단 수정 전 코드는 이렇다.

'use strict';

const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config.json')[env];
const db = {};

let sequelize;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(config.database, config.username, config.password, config);
}

fs
  .readdirSync(__dirname)
  .filter(file => {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
  })
  .forEach(file => {
    const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
    db[model.name] = model;
  });

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

 

그리고 수정 후 코드는 이렇게 될 것이다.

'use strict';

const path = require('path');
const Sequelize = require('sequelize');

const env = process.env.NODE_ENV || 'development';
const config = require(path.join(__dirname, '..', 'config', 'config.json'))[env];
const db = {};

const sequelize = new Sequelize(config.database, config.username, config.password, config);

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

이렇게 많이 지워도 되나 싶지만 일단 난 아는게 없으니까...

 

그리고 app.js 파일에 문장 2개를 추가해야 한다.

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 sequelize = require('./models').sequelize; //추가

var app = express();
sequelize.sync(); //추가

모든 코드를 복붙하지 않고 윗부분만 가져왔다. 주석으로 추가하라고 적어놓은 저 문장을 추가하면 된다.

 

마지막으로 config.json 파일을 수정해야 한다.

이 즈음에서 제목에 sequelize를 추가했다.

{
  "development": {
    "username": "root",
    "password": null,
    "database": "database_development",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "database_test",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "production": {
    "username": "root",
    "password": null,
    "database": "database_production",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}

수정전 상태이다.

근데 블로그에는 operatorsAliases라는 게 있는데, 난 없다. 추가해야 할까? 일단 추가하자.

 

{
  "development": {
    "username": "vivaadmin", //유저이름
    "password": null, //비번
    "database": "VIVA", //DB 스키마 이름
    "host": "viva.c9birts7afmc.us-east-2.rds.amazonaws.com/", //DB server IP
    "dialect": "mysql", //DB 이름
    "operatorsAliases": false
  },
  "test": {
    "username": "vivaadmin",
    "password": null,
    "database": "VIVA",
    "host": "viva.c9birts7afmc.us-east-2.rds.amazonaws.com/",
    "dialect": "mysql",
    "operatorsAliases": false
  },
  "production": {
    "username": "vivaadmin",
    "password": null,
    "database": "VIVA",
    "host": "viva.c9birts7afmc.us-east-2.rds.amazonaws.com/",
    "dialect": "mysql",
    "operatorsAliases": false
  }
}

(실수 있음 아랫부분 참조)

보안따위 신경쓰지 않지만 그래도 DB 비번을 막쓰기엔 좀 그래서 null로 남겨놨다.

 

이렇게 연결이 끝났다...그리고 블로그에서 테이블 데이터를 써보는 법을 알려주겠다고 했는데 다음 글이 없다.

새로운 블로그를 찾으러 가보자...

 

www.hanumoka.net/2018/11/23/node-20181123-express-setting-sequelize/

 

Node Express에 sequelize를 이용해 mysql접속하기

들어가기Express 프로젝트에 sequelize(시퀄라이저)를 이용하여 로컬에 있는 mysql에 접속하는 예제를 정리해본다. 미리 로컬에 mysql을 설치하고, 스키마와 계정을 생성 해놨다. 테스트용 Express 프로젝

www.hanumoka.net

이 블로그를 따라하면 될 것같다.

난 이미 DB에 table이 다 있으니 2번 방법을 따라해보자.

 

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 sequelize = require('./models').sequelize; //추가

var app = express();
//sequelize.sync(); //추가

앞서 추가한 부분을 다시 주석처리하는 걸로 시작한다. 오...파격적이다.

 

npm install -g sequelize-auto
npm install -g mysql

sequelize-auto란 걸 설치했다.

 

지금부터 오류가 엄청 생길 것이다.

sequelize-auto -o "./models" -d VIVA -h viva.c9birts7afmc.us-east-2.rds.amazonaws.com/ -u vivaadmin -p 3306 -x pwd -e mysql

(실수 있음 아랫부분 참조)

이 명령어를 치면 기존의 테이블을 가져올 수 있다고 한다.

당연히 내 테이블에 맞춰서 작성한 것이기 때문에 각자에 맞춰 쓰시길

 

그리고 이런 오류를 만났다.

throw new Error(`Please install ${moduleName} package manually`);

 

찾아보니 mysql2를 글로벌로 설치하라고 해서 했다.

npm i -g mysql2

ㅎㅎ 다시 해볼까

 

HostNotFoundError [SequelizeHostNotFoundError]: getaddrinfo ENOTFOUND

오...Server host에 문제가 있는 것 같다.

 

gdpark.tistory.com/192

 

Error: getaddrinfo ENOTFOUND 오류발생

"Error: getaddrinfo ENOTFOUND" 는 인식할 수 없는 host 가 설정 되었을 때 발생합니다. host 주소로 설정한 address 의 prefix (http, https) 등을 확인 후 다시 시도하면 해결이 가능합니다.

gdpark.tistory.com

음 http를 안붙여서 생긴 문제일까?

 

하하 전부 아니었다.

내가 호스트를 viva.c9birts7afmc.us-east-2.rds.amazonaws.com/ 라고 썼었는데

viva.c9birts7afmc.us-east-2.rds.amazonaws.com 라고 써야한다. 하하

이 실수를 기록하기 위해 위에 쓴 부분들은 남겨 놓는다...

 

원래는 index.js만 있던 models 폴더에 테이블 정보가 들어왔다. 연동에 성공한 것이다 만세!

 

하지만 아직 끝난게 아니다 뭘 더 해야하나보다.

 

이 즈음에서 아예 제목을 바꿨다. 참고로 원래 제목은

Node.js와 친해지기 프로젝트(feat. MySQL, sequelize) 였다.

 

index.js 파일을 수정해야 한다. 자세히 보니 아까 지워버린 그 코드들을 다시 살려야 하나보다.

블로그에 적어놓아서 정말 다행이다... 부디 내 블로그를 보는 사람이 이 글을 끝까지 읽어보고 따라하길

'use strict';

const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');

const env = process.env.NODE_ENV || 'development';
const config = require(path.join(__dirname, '..', 'config', 'config.json'))[env];
const db = {};

const sequelize = new Sequelize(config.database, config.username, config.password, config);

fs
  .readdirSync(__dirname)
  .filter(function(file) {
    return (file.indexOf(".") !== 0) && (file !== "index.js");
  })
  .forEach(function(file) {
    var model = sequelize.import(path.join(__dirname, file));
    db[model.name] = model;
    console.log('model.name:' + model.name);  // 테스트로그 model명..
  });

Object.keys(db).forEach(function(modelName) {
  if ("associate" in db[modelName]) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

 

그 다음엔 config 폴더의 config.js 파일을 수정해야 한다.

{
  "development": {
    "username": "vivaadmin",
    "password": "viva1886!!",
    "database": "VIVA",
    "host": "viva.c9birts7afmc.us-east-2.rds.amazonaws.com",
    "dialect": "mysql",
    "operatorsAliases": false,
    "define": { //이 부분 추가
      "timestamps": false,
      "underscored": true
    }
  },
  "test": {
    "username": "vivaadmin",
    "password": "viva1886!!",
    "database": "VIVA",
    "host": "viva.c9birts7afmc.us-east-2.rds.amazonaws.com",
    "dialect": "mysql",
    "operatorsAliases": false
  },
  "production": {
    "username": "vivaadmin",
    "password": "viva1886!!",
    "database": "VIVA",
    "host": "viva.c9birts7afmc.us-east-2.rds.amazonaws.com",
    "dialect": "mysql",
    "operatorsAliases": false
  }
}

define을 추가했다. 저게 무슨 역할을 하는지 설명이 있었으나 잘 모르겠고 일단 넣으라고 하기에 넣었다.

 

그리고 데이터를 출력해보면 좋겠지만~ 힘들다 오늘은 여기까지

Comments