mysql 연동

Jung taeWoong·2021년 12월 20일
1

node.js

목록 보기
2/2
post-thumbnail

MySQL

node.js와 MySQL 연동하기

npm i sequelize sequelize-cli
npm i mysql2
  • sequelize: js로 sql대신 테이블을 만들 수 있게 도와주는 라이브러리
  • mysql2: node에서 mysql을 사용하기 위한 드라이버
$ npx sequelize init
  • sequelize를 실행시키면 프로젝트에 config, migrations, models, seeders라는 폴더가 생긴다.

config/config.json

{
  // 개발용 DB
  "development": {
    "username": "root",
    "password": MySQL에 등록한 비밀번호,
    "database": 데이터베이스 이름,
    "host": "127.0.0.1",
    "port": "3306"
    "dialect": "mysql"
  },
  // 테스트용 DB
  "test": {
    "username": "root",
    "password": null,
    "database": "database_test",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  // 배포용 DB
  "production": {
    "username": "root",
    "password": null,
    "database": "database_production",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}

app.js

const express = require('express');
const app = express();

const postRouter = require('./routes/post');
// 앱이 실행되면 db 연결
const db = require('./models');
db.sequelize.sync()
  .then(() => console.log('db 연결 성공'))
  .catch(console.error);

app.listen(3065, () => {
  console.log('Server running on port 3065');
})
// 아래코드로 db생성
$ npx sequelize db:create

models/index.js

  • sequelize에서는 table을 model로 부른다.
const Sequelize = require('sequelize');
const comment = require('./comment');
const hashtag = require('./hashtag');
const image = require('./image');
const post = require('./post');
const user = require('./user');

const env = process.env.NODE_ENV || 'development';
const config = require('../config/config')[env];
const db = {};
// Sequelize는 내부적으로 mysql2를 사용
// Sequelize가 config에 담긴 db 데이터로 node와 mysql을 연결시킨다.
// 연결이 성공하면 sequelize 객체에는 연결정보가 담기게 된다.
const sequelize = new Sequelize(config.database, config.username, config.password, config);

db.Comment = comment;
db.Hashtag = hashtag;
db.Image = image;
db.Post = post;
db.User = user;
// 만들어둔 모델들을 실행
Object.keys(db).forEach(modelName => {
  db[modelName].init(sequelize);
})
// 반복문을 통해 작성해둔 assoicae로 모델들끼리 관계형성
Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

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

module.exports = db;

model 기본 형태

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

module.exports = class User extends Model {
   static init(sequelize) {
    return super.init({
      // mysql에는 id값이 기본적으로 들어있다. ex: 1, 2, 3. 4
    column: {
      type: DataTypes.STRING(30), // 타입지정
      allowNull: false, // false === 필수값
      unique: true, // true === 고유값
    },
    column2: {},
    column3: {},
      {
      // 두번째 객체로 해당 모델에 대한 세팅
      modelName: '모델명',
      tableName: '테이블명',
      charset: 'utf8', // mysql에서 한글 사용 가능 설정 (utf8mb4는 이모티콘 포함)
      collate: 'utf8_general_ci', // mysql 한글 저장  
      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' });
  }
}

nodemon

  • 서버에서 작업을 수정하고 db에 반영하려면 서버를 껏다가 다시 켜주어야 하는 번거로움이 있다.
  • nodemon은 코드를 변경하게되면 알아서 서버를 재실행 해준다.
$ npm i -D nodemon
// node 대신에 nodemon 타이핑
$ nodemon app
profile
Front-End 😲

0개의 댓글