node mysql 연동

BackEnd_Ash.log·2021년 1월 17일
0

node

목록 보기
4/9

우선적으로 localhost 에 mysql 이 설치되어있어야 한다.
굳이 mysql 아니더라도 , mariadb 라던지 postgresql 를 써도 상관이 없다.

npm i sequelize sequelize-cli mysql2

sequelize

sequelize 는 Node JS 에서 mysql 사용할 때 raw Query문을 사용하지 않고 좀 더 쉽게 다룰 수있도록 도와주는 라이브러리 이다.
Django 를 사용해 보신분은 ORM 이라고 생각하시면 될것같습니다.
( ORM : Object-Relational Mappting 은 객체와 관계형 데이터베이스의 관계를 매핑 해주는 도구이다.)

Node.js 기반의 ORM 으로 Promise 문법을 사용한다.
sequelize 의 장점은 어떤 DB 와 커넥션만 연결이 되면 DB 의 특성에 상관없이 동인한 메서드로 쿼리 수행이 가능하다.

sequelize-CLI

models 폴더에 직접 작성하지 않고 터미널 차에엇 명령어를 통해서도 테이블을 정의할 수 있다.
sequelize-cli 는 sequelize command line interface 의 줄임말이다.
즉 터미널에서 명령어를 사용해 데이터베이스 작업을 할 수 있게 만들어주는 툴이다.

sequelize-cli 모듈은 seque

  • sequelize-cli 는 sequelize command line interface 의 줄임말이다.
  • 터미널에서 명령어를 사용해 데이터베이스 작업을 할수 있게 해주는 툴이다.
  • sequelize-cli 모듈은 sequelize 를 조금 더 효율적으로 사용하기 위해서 몇 개의 폴더와 파일을 생성해 준다.

mysql2

mysql 를 왜 설치하느냐 생각할수도있다.
localhost 에서는 분명 mysql 를 설치했지만 ,node랑 mysql 연결해주는 드라이버 라고 생각하시면 된다.

start

npx sequelize init

입력하게 되면 ,

config , models , seeders , migrations
이 생기는 것을 볼 수 있다.

config/config.js

안에 들어가보면 database 셋팅 부분이 나와있다
본인 localhost 에 설치되어있는 mysql 셋팅 부분에 맞춰서 작성하면 된다.

models/index.js

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

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

module.exports = db;

Object.kets(db).forEach(modelName => { ...
위에 있는부분을 일단 지워준다.

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); // 디비 연결


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

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

module.exports = db;

로 바꿔준다.

그리고 models 에 우리가 database table 에 칼럼들을 셋팅을 여기서 해주면 된다.

models/user
const DataTypes = require('sequelize');
const { Model } = DataTypes;

module.exports = class User extends Model {
    static init(sequelize) {
        return super.init({
            // id가 기본적으로 들어있다.
            email: {
                type: DataTypes.STRING(30), // STRING, TEXT, BOOLEAN, INTEGER, FLOAT, DATETIME
                allowNull: false, // 필수
                unique: true, // 고유한 값
            },
            nickname: {
                type: DataTypes.STRING(30),
                allowNull: false, // 필수
            },
            password: {
                type: DataTypes.STRING(100),
                allowNull: false, // 필수
            },
        }, {
            modelName: 'User',
            tableName: 'users',
            charset: 'utf8',
            collate: 'utf8_general_ci', // 한글 저장
            sequelize,
        });
    }
    static associate(db) {
        db.User.hasMany(db.Post);
        db.User.hasMany(db.Comment);
        db.User.belongsToMany(db.Post, { through: 'Like', as: 'Liked' })
        db.User.belongsToMany(db.User, { through: 'Follow', as: 'Followers', foreignKey: 'FollowingId' });
        db.User.belongsToMany(db.User, { through: 'Follow', as: 'Followings', foreignKey: 'FollowerId' });
    }
};

이런식으로 다른 models 안에있는 js 파일을 databse table 에 맞게 만들어주면된다.
예를 하나만 더 들기 위해 post 를 하나 더 만들어보면 ,

const DataTypes = require('sequelize');
const { Model } = DataTypes;

module.exports = class Post extends Model {
    static init(sequelize) {
        return super.init({
            // id가 기본적으로 들어있다.
            content: {
                type: DataTypes.TEXT,
                allowNull: false,
            },
            // RetweetId
        }, {
            modelName: 'Post',
            tableName: 'posts',
            charset: 'utf8mb4',
            collate: 'utf8mb4_general_ci', // 이모티콘 저장
            sequelize,
        });
    }
    static associate(db) {
        db.Post.belongsTo(db.User); // post.addUser, post.getUser, post.setUser
        db.Post.belongsToMany(db.Hashtag, { through: 'PostHashtag' }); // post.addHashtags
        db.Post.hasMany(db.Comment); // post.addComments, post.getComments
        db.Post.hasMany(db.Image); // post.addImages, post.getImages
        db.Post.belongsToMany(db.User, { through: 'Like', as: 'Likers' }) // post.addLikers, post.removeLikers
        db.Post.belongsTo(db.Post, { as: 'Retweet' }); // post.addRetweet
    }
};

이렇게 셋팅을 해주면 된다.

profile
꾸준함이란 ... ?

0개의 댓글