혼자 적어보는 노트

[Node.js] NodeJS에 MySQL 연결하기 / Sequelize 본문

NodeJS

[Node.js] NodeJS에 MySQL 연결하기 / Sequelize

jinist 2022. 3. 17. 00:00

 

 

 

🔨 Community Server / Workbench 설치

https://dev.mysql.com/downloads/

 

MySql Community Downloads에서

DB server를 위한 MySql Community Server

데이터베이스 내부에 저장된 데이터를 시각적으로 확인하기 위해 MySql Workbench를 설치해준다.

 

두 개를 따로 따로 설치하기 싫다면 MySQL Installer for Windows를 설치하는 과정에서

Community Server와 Workbench를 선택해서 설치할 수 있다.

나는 Installer for Windows를 사용했다.

 

Installer for Windows로 설치할 때 아래의 세 가지 부분만 체크하고 나머지는 기본 값으로 설정하면 된다.

 

1. 설치 진행 중에 Choosing a Setup Type 부분에서 Custom을 선택

2. select Products and Features 에서 MySql Community Server와 MySql Workbench를 골라서 설치

3. Accounts and Roles부분에서 비밀번호 설정

 


 

💻 명령프롬프트에서 Mysql 실행하기

 

설치 완료 후 설치된 폴더로 이동하여 
명령 프롬프트를 통해서 MySQL에 접속한다.

 

MySQL 설치 시 기본 경로:

C:\Program Files\MySQL\MySQL Server 8.0\bin

 

아래의 명령어 입력

mysql -h localhost -u root -p

명령어를 입력하면 비밀번호 입력 창이 뜨게 되며
Mysql을 설치할 때 설정했던 비밀번호를 입력하면 된다.

 

프롬프트창에 mysql> 으로 표시되면 연결이 된 것이다.

다시 콘솔로 이동을 하려면 exit를 입력하면 된다.

 

 

* 혹시나 비밀번호를 변경하고 싶다면 mysql이 연결된 상태에서 아래의 명령어를 입력해준다.

mysql> alter user 'root'@'localhost' identified with mysql_native_password by '변경할 비밀번호';

 


 

🔗 Node.js에 Sequelize 세팅하기

 

✅ 관련 라이브러리 설치

아래의 명령어를 통해 필요한 라이브러리를 다운받아준다.

npm i sequelize sequelize-cli mysql2

 

sequelize: 자바스크립트로 sql을 조작할 수 있게 해주는 라이브러리
mysql2: mysql과 node, sequelize를 연결시켜주는 드라이버

 

 시퀄라이즈 세팅

설치가 완료되면 아래의 명령어로 시퀄라이즈 세팅을 진행한다.

npx sequelize init

터미널이 위와 같이 나타나며 폴더에 config, migrations, models 폴더가 생성된 것을 확인할 수 있다.

 

config.json 설정

config폴더 안의 config.json 파일에서 

개발용(development)/ 테스트용(test) / 배포용(production) 정보를 입력할 수 있다.

일단 나는 database는 진행하고 있는 프로젝트 명으로 전부 동일하게 설정하였고
development 부분의  password부분은 기존의 MySQL 비밀번호를 적어주었다.

 

 ❗ config.json에서 MySQL의 비밀번호가 틀릴 경우 sequelize db 생성 시 에러가 발생함.

 

 models 설정

 

model폴더 안의 index.js 파일에서 Node와 Mysql을 연결하기 위한 세팅을 해 준다.

[index.js]

const Sequelize = require("sequelize");
const env = process.env.NODE_ENV || "development";
// 배포 시 process.env.NODE_ENV 부분이 production으로 변경
// 아무것도 설정되어있지 않다면 development

const config = require("../config/config")[env];
// 현재 env는 development이기 때문에 config에서 설정한 development를 가지고 옴
const db = {};

const sequelize = new Sequelize(config.database, config.username, config.password, config);
//sequelize가 Node와 MySQL을 연결

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

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

module.exports = db;

 

기본 설정이 끝났다면 어떤 데이터를 받을 지 테이블을 정의해야 하는데

MySQL에서는 table이라고 하고 Node에서는 model이라고 한다.

 

module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define(
    "User",
    {
      email: {
        type: DataTypes.STRING(30),
        allowNull: false,
        unique: true,
      },
      username: {
        type: DataTypes.STRING(30),
        allowNull: false,
      },
      password: {
        type: DataTypes.STRING(100),
        allowNull: false,
      },
    },
    {
      charset: "utf8",
      collate: "utf8_general_ci",
      timestamps: true,
      paranoid: true,
    }
  );
  User.associate = (db) => {};
  return User;
};

 

 

sequelize.define

sequelize.define은 아래와 같이 사용이 가능하다.

sequelize.define( "모델(테이블)이름", 컬럼 속성 설정, 모델(테이블) 옵션 설정 )

 

모델 이름

시퀄라이즈는 자동으로 소문자, 복수로 users의 테이블이 생성된다. (User => users)

만약 이름을 직접 지정하고 싶다면 세 번째 인자인 테이블 설정에서 tableName: "user"으로 지정하거나

freezeTableName : true를 하여 복수화를 중지시킨다.

 

컬럼 속성 설정

데이터를 어떤 형태로 저장할 지, 모델의 컬럼 속성을 정의 한다.

 

type: 데이터 타입을 정의

DataTypes에는 STRING, TEXT, INTEGER, FLOAT, BOOLEAN 등 검증을 위한 타입, 데이터의 길이를 설정해 줄 수 있다.

*password와 같은 암호화가 필요한 데이터의 경우 암호화된 문자열의 길이까지 고려해주어야 함.

allowNull : 필수로 입력해야 하는 부분이라면 falseunique : 고유한 값이라면 true

defaultValue : 기본 값 지정

comment: 해당 column에 대한 설명

이 외에도 많은 속성들이 있다.

 

* 참고로 시퀄라이즈는 id를 기본키로 연결하므로 id 컬럼은 따로 적을 필요가 없다.

 

모델 옵션 설정

charset : "utf8"  / collate : "utf8_general_ci"charset과 collate를 모두 설정해야 한글이 입력된다.이모티콘 입력도 허용하고 싶다면 charset: "utf8mb4" / collate: "utf8mb4_general_ci" 를 설정한다.tableName : 테이블 이름 설정freezeTableName : true로 설정 시 자동으로 이름이 복수화가 되지 않는다.underscored : 기본적으로 테이블 명과 컬럼명을 camelCase로 생성하는데 true설정 시 스네이크 케이스 형식으로 변경timestamps : createdAt과 updatedAt 컬럼이 생성되고 데이터가 생성되는 시간과 수정되는 시간이 나타난다.

 

createAt과 updateAt 중 하나만 사용하고 싶다면 아래와 같이 적는다.

{
    timestamps: true,
    createdAt: true,
    updatedAt: false,
}

paranoid : deletedAt이라는 컬럼이 추가되며 데이터를 삭제하라는 쿼리가 들어왔을 때 해당 데이터를 삭제하지 않고
삭제되는 시점을 등록한다. 데이터를 복구하기 위해 사용된다.
*  timestamps를 true로 설정해야 함.

 

.associate

현재 예제로 User 모델 하나만 만들었지만

여러 개의 데이터들이 생기고 모델들을 생성하게되면

각각의 데이터들의 연관성을 지정을 해야 하는데 associate에서 할 수 있다.

약간의 복잡한 개념이 있기 때문에 이후의 포스팅에서 정리해 볼 예정이다.

 

 

만든 모델 index.js에서 불러오기

[models/index.js]

const Sequelize = require("sequelize");
const env = process.env.NODE_ENV || "development";
const config = require("../config/config")[env];
const db = {};

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

db.User = require("./user")(sequelize, Sequelize);
// 만든 User의 모델을 불러온다.

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

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

module.exports = db;

 


 

🔗 sequelize 연결

app.js 로 돌아와서 세팅해놓은 sequelise를 연결 해준다.

const express = require("express");
const postRouter = require("./routes/post");
const db = require("./models");

db.sequelize
  .sync()
  .then(() => {
    console.log("★DB 연결 성공★"); // db연결 성공 시 출력 됨
  })
  .catch(console.error);

const app = express(); // express 호출
const port = 8080;

//... 생략

 

아래의 명령어로 db를 생성해준다.

 

npx sequelize db:create

 


🙌 서버 실행

node app

node app이나 지정해놓은 명령어를 입력하여 서버를 실행하고

console에 ★DB 연결 성공★ 메세지가 출력되면 완료!

 


✅ 워크벤치 확인

워크벤치에 들어가서 해당 connection을 클릭하여 비밀번호를 입력하고

왼쪽 메뉴의 Schemas - (config에서 설정한 database이름)- Tables를 클릭하면

아까 만든 모델(테이블)이 나타난다.✨✨

 

명령프롬프트에서 확인하는 법

mysql> show databases;

위 명령어를 입력하면 database의 목록이 나온다.

 

mysql> use [데이터베이스 이름]
mysql> show tables;

위 명령어를 입력하면 만든 테이블들이 나타난다.

* use 명령어를 먼저 사용해야 show tables가 가능함.

Comments