MySQL 과 sequelize 연결하기

성민개발로그·2022년 1월 6일
1

데이터베이스

목록 보기
1/6

MySQL 란?

MySQL 은 세계에서 가장 많이 쓰이는 오픈 소스의 관계형 데이터베이스 관리 시스템(RDBMS)이다. 일단 오픈소스이고 관계형이 대중적이기 때문에 배워본다.

1.MySQL 먼저 컴퓨터에 설치를 한다.

각자 구글링해서 설치하기~.

2. sequelize sequelize-cli mysql2설치 해준다.

npm i sequelize sequelize-cli mysql2

sequelize: 직접 database 언어사용하지 않고 js언어로 database 조작할 수 있게 해주는 라이브러리이다.
mysql2: node 와 mysql 연결해주는 드라이버 역할.

이제 sequelize 세팅을 해 줍시다. 다음 명령어를 쳐 주세요.

npx sequelize init

3. config폴더안에 config.json 파일 설정 해주기.

{
  "development": {
    //개발할때 사용하는 데이터베이스
    "username": "root",
    "password": "1234", // 자기계정 비밀번호
    "database": "react-nodebird", // 프로젝트 이름
    "host": "127.0.0.1", // 기본으로 localhost 로 설정됨.
    "dialect": "mysql"
  },
  "test": {
    // 테스트용 데이터베이스.
    "username": "root",
    "password": null,
    "database": "react-nodebird",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "production": {
    // 배포용 데이터베이스.
    "username": "root",
    "password": null,
    "database": "react-nodebird",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}

4. models/index.js 초기셋팅

const Sequelize = require('sequelize');
const env = process.env.NODE_ENV || 'development';
const config = require('../config/config')[env]; //설정한 config 에서 'development' config 가져오자.
const db = {};

const sequelize = new Sequelize(
  config.database,
  config.username,
  config.password,
  config
); // 시퀄라이즈 노드랑mysql 연결해주는 역할.

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

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

module.exports = db;

5. 모델 만들기 예시용으로 user모델과 post모델을 만들어 보겠다. 위치는 models 폴더에서 만들어준다

유저모델:

module.exports = (sequelize, DataTypes ) => {
    const User = sequelize.define('User', {// MySQL 에는 'User' => users 로 테이블이 생성된다.
        //id가 기본적으로 들어있다.
        email: {
            type: DataTypes.STRING(30),
            allowNull: false, //필수
            unique: true, //고유한값
        },
        nickname: {
            type: DataTypes.STRING(30),
            allowNull: false, //필수
        },
        password: {
            type: DataTypes.STRING(100),// 비밀번호는 암호화 되기떄문에 길게 설정해놓는다.
            allowNull: false, //필수
        },
    }, {
        charset: 'utf8', // 이렇게 셋팅안하면 데이터 베이스에 한글넣을시 에라남.
        collate: 'utf8_general_ci', //한글저장 가능
    });
    User.associate = (db) => { //관계 설정하는 구간.
        db.User.hasMany(db.Post); // 유저가 많은 포스트를 가질 수 있다.
        db.User.hasMany(db.Comment);
        db.User.belongsToMany(db.Post, { through: 'Like', as: 'Liked'}); // 내가 좋아요 누른 포스트들 {테이블 이름은 : Like, User 이름을 Liked 로}
        db.User.belongsToMany(db.User, { through: 'Follow', as: 'Follwer', foreignKey: 'FollowingId'});
        db.User.belongsToMany(db.User, { through: 'Follow', as: 'Following', foreignKey: 'FollowerId'});
    };
    return User;
}

포스트모델:

module.exports = (sequelize, DataTypes ) => {
    const Post = sequelize.define('Post', {// MySQL 에는 'User' => users 로 테이블이 생성된다.
        //id가 기본적으로 들어있다.
        content:{
            type: DataTypes.TEXT,
            allowNull: false,
        },
        // UserId
    }, {
        charset: 'utf8mb4', // 이렇게 셋팅안하면 한글(이모지)넣을시 에라남.
        collate: 'utf8mb4_general_ci', //한글(이모지)저장
    });
    Post.associate = (db) => {
        db.Post.belongsTo(db.User);
        db.Post.belongsToMany(db.Hashtag, {through: 'PostHashtag'});
        db.Post.hasMany(db.Comment);
        db.Post.hasMany(db.Image);
        db.Post.belongsToMany(db.User, { through: 'Like', as: 'Likers'}); // 좋아요 누른 유저들
        db.Post.belongsTo(db.Post, {as: 'Retweet'});
    };
    return Post;
}

6. 모델들 index.js 에 불러오고 연결시켜주기

const Sequelize = require('sequelize');
const env = process.env.NODE_ENV || 'development';
const config = require('../config/config')[env]; //설정한 config 에서 'development' config 가져오자.
const db = {};

const sequelize = new Sequelize(
  config.database,
  config.username,
  config.password,
  config
); // 시퀄라이즈 노드랑mysql 연결해주는 역할.

db.Comment = require('./comment')(sequelize, Sequelize); // 모델 불러오고 실행해준다.
db.Hashtag = require('./hashtag')(sequelize, Sequelize);
db.Post = require('./Post')(sequelize, Sequelize);
db.User = require('./user')(sequelize, Sequelize);
db.Image = require('./image')(sequelize, Sequelize);

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

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

module.exports = db;

7. express 와 db 연결하기 및 실행.

app.js

const express = require('express');
const app = express();
const port = 3065;
const postRouter = require('./routes/post');
const db = require('./models'); // models/index.js 에서 db 가져오기.
db.sequelize
  .sync() // 비동기 연결 시도.
  .then(() => {
    console.log('db 연결 성공');
  })
  .catch(console.error);

app.use('/post', postRouter);

app.listen(port, () => {
  console.log(`app listening at http://localhost:${port}`);
});

db 해당 프로젝트에 먼저 생성해줍시다.

npx sequelize db:create

db 연결성공 메시지 뜨면 연결이 된거다.
그리고 매번 백엔드쪽 고치면 db를 새로고침 해야할 다소 귀찮은점이 있다 그래서 그런걸 해결하기 위해서

npm i -D nodemon

설치해주고 개발을 시작하자.
패키지.json 가서 "node app.js" => 'nodemon app.js'

  "scripts": {
    "dev": "nodemon app.js" //=>'nodemon app.js' 이렇게 바꿔주세요
  },

npm run dev 로 실행.

0개의 댓글