본문 바로가기

Dot Programming/Node.js

[Node.js] node mysql 시퀄라이즈 연결하기, 엔티티 연관 관계 설정

1. mac mysql설치하기(v.8)

 

[MySQL] 설치와 초기 설정 for macOS

MAC에서 MySQL설치방법은 MySQL Community Server dmg파일을 다운받아 설치하는 방법과 Homebrew로 MySQL 패키지 다운받아 설치하는 방법 두가지이다.MySQL 공식 dev 페이지에서 MySQL Community Server 를 다운받는다.

velog.io

 

2. mysql설치 후 node 패키지에 라이브러리 설치하기

$ npm i sequelize sequelize-cli mysql2

mysql2 > node와 mysql을 연결해주는 드라이버
sequelize > javscript를 sql문으로 변환

 

3. sequelize 세팅

$ npx sequelize init

프로젝트에 config, models, migration, seeders폴더가 생성됨

 

config.js에서 자신이 만든 mysql 계정정보(username, pw)와 db이름을 입력한다

 

models/index.js를 최신 코드로 수정해준다.

'use strict';

const Sequelize = require('sequelize');
 // env : development, test, production 상황에 맞춰 설정 (현재 development 상태)
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;

 

user테이블 생성

models/user.js 파일 생성 후 user테이블을 선언해준다.

module.exports = (sequelize, DataTypes) => {
    const User = sequelize.define('User', { // MySql에는 users테이블 생성
        // id: {},  // mysql에서 자동으로 넣어줌
        email: {},
        nickname: {},
        password: {},
    }, {
        charset: 'utf8',
        collate: 'utf8_general_ci', //  한글 저장 (이모티콘도 저장하려면 mb4)
    });
    User.associate = (db) => {};

    return User;
}

 

그 후에 다음과 같이 칼럼 별로 설정을 해주면 끝

module.exports = (sequelize, DataTypes) => {
    const User = sequelize.define('User', { // MySql에는 users테이블 생성
        // id: {},  // mysql에서 자동으로 넣어줌
        email: {
            type: DataTypes.STRING(30),
            allowNull: false, // 필수 (NotNull)
            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) => {};

    return User;
}

 

4. 연관관계 설정하기

user와 post 엔티티가 있다.

한 user는 여러개의 게시글을 올릴 수 있으므로 user와 post의 관계는 1:N이다.

 

models/user.js

module.exports = (sequelize, DataTypes) => {
    const User = sequelize.define('User', { // MySql에는 users테이블 생성
        // id: {},  // mysql에서 자동으로 넣어줌
        email: {
            type: DataTypes.STRING(30),
            allowNull: false, // 필수 (NotNull)
            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)
    };

    return User;
}

 

models/post.js

module.exports = (sequelize, DataTypes) => {
    const Post = sequelize.define('Post', { 
         // mysql에 id 기본적으로 세팅되어있음.
        content: {
            type: DataTypes.TEXT,
            allowNull: false,
        },
    }, {
        charset: 'utf8mb4',
        collate: 'utf8mb4_general_ci', //  한글, 이모티콘(mb4) 저장
    });
    Post.associate = (db) => {
        db.Post.hasMany(db.User);
    };

    return Post;
}

 

이와 같이 설정해주면 된다.

 

5. 다대다 관계 설정하기

JPA에서는 다대다 매핑을 1:N N:1로 풀어서 설정을 하였지만 노드 시퀄라이즈에서는 각 테이블에 belongsToMany를 해주면 중간 테이블이 자동 생성이 된다.

  •  through : 중간 테이블 이름 설정
  • as : 테이블 호출 이름 설정 ( as: "Likers" 하면 PostId -> LikersId로 바뀜),
  • foreignKey : 컬럼 이름 설정
물론, 중간 테이블에 다른 칼럼을 추가로 넣고싶으면 따로 엔티티를 선언해서 연결해주면 된다. (check)

models/user.js

module.exports = (sequelize, DataTypes) => {
    const User = sequelize.define('User', { // MySql에는 users테이블 생성
        // id: {},  // mysql에서 자동으로 넣어줌
        email: {
            type: DataTypes.STRING(30),
            allowNull: false, // 필수 (NotNull)
            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);

        // sequelize에서 Like테이블 자동 생성
        db.User.belongsToMany(db.Post, { through: 'Like', as: 'Likers' }); // 좋아요 테이블 1:N - like - N:1 / as: db 이름 설정

    };

    return User;
}

 

models/post.js

module.exports = (sequelize, DataTypes) => {
    const Post = sequelize.define('Post', { 
         // mysql에 id 기본적으로 세팅되어있음.
        content: {
            type: DataTypes.TEXT,
            allowNull: false,
        },
    }, {
        charset: 'utf8mb4',
        collate: 'utf8mb4_general_ci', //  한글, 이모티콘(mb4) 저장
    });
    Post.associate = (db) => {
        db.Post.belongsTo(db.User);
        
        db.Post.belongsToMany(db.User, { through: 'Like', as: 'Liked' }); // 좋아요 테이블 1:N - like - N:1
    };

    return Post;
}

 

6. 서버 실행

설정 완료 후 models/index.js에 해당 파일들을 불러온다.

'use strict';

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.Post = require('./post')(sequelize, Sequelize);
db.User = require('./user')(sequelize, Sequelize);

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

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

module.exports = db;

 

app.js에 db sequelize를 한다

const db = require('./models');

db.sequelize.sync()
    .then(() => {
        console.log('db 연결 성공');
    })
    .cathch(console.error);

 

서버를 실행기전에 해당 명령어 실행 (db 실행)

 $ npx sequelize db:create

 

 

'Dot Programming > Node.js' 카테고리의 다른 글

[Node.js] Passport로 로그인 구현하기  (0) 2021.01.28
[Node.js] Cors 설정 ( credentials )  (0) 2021.01.28