본문 바로가기

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