우선적으로 localhost 에 mysql 이 설치되어있어야 한다.
굳이 mysql 아니더라도 , mariadb 라던지 postgresql 를 써도 상관이 없다.
npm i sequelize sequelize-cli mysql2
sequelize 는 Node JS 에서 mysql 사용할 때 raw Query문을 사용하지 않고 좀 더 쉽게 다룰 수있도록 도와주는 라이브러리 이다.
Django 를 사용해 보신분은 ORM 이라고 생각하시면 될것같습니다.
( ORM : Object-Relational Mappting 은 객체와 관계형 데이터베이스의 관계를 매핑 해주는 도구이다.)
Node.js 기반의 ORM 으로 Promise 문법을 사용한다.
sequelize 의 장점은 어떤 DB 와 커넥션만 연결이 되면 DB 의 특성에 상관없이 동인한 메서드로 쿼리 수행이 가능하다.
models 폴더에 직접 작성하지 않고 터미널 차에엇 명령어를 통해서도 테이블을 정의할 수 있다.
sequelize-cli 는 sequelize command line interface 의 줄임말이다.
즉 터미널에서 명령어를 사용해 데이터베이스 작업을 할 수 있게 만들어주는 툴이다.
sequelize-cli 모듈은 seque
mysql 를 왜 설치하느냐 생각할수도있다.
localhost 에서는 분명 mysql 를 설치했지만 ,node랑 mysql 연결해주는 드라이버 라고 생각하시면 된다.
npx sequelize init
입력하게 되면 ,
config , models , seeders , migrations
이 생기는 것을 볼 수 있다.
안에 들어가보면 database 셋팅 부분이 나와있다
본인 localhost 에 설치되어있는 mysql 셋팅 부분에 맞춰서 작성하면 된다.
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 에 칼럼들을 셋팅을 여기서 해주면 된다.
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
}
};
이렇게 셋팅을 해주면 된다.