- 각종 모듈(sequelize, env, config)가져오기
const Sequelize = require('sequelize');
const env = process.env.NODE_ENV || 'development';
const config = require('../config/config')[env];
- 데이터베이스 모델(user, post, hashtag 등) 도 가져오기
const User = require('./user');
const Post = require('./post');
const Hashtag = require('./hashtag');
- 빈 db를 정의
const db = {};
- 시퀄라이즈 생성자 인자에 config파일을 이용하여 데이터베이스, 유저 이름, 비밀번호를 입력
const sequelize = new Sequelize(
config.database, config.username, config.password, config,
);
- 빈 db에 모델 연결하기 (js는 프로토타입 베이스)
db.sequelize = sequelize;
db.User = User;
db.Post = Post;
db.Hashtag = Hashtag;
- 테이블에 대한 설정: 각 모델의 static.init 메서드 호출
User.init(sequelize);
Post.init(sequelize);
Hashtag.init(sequelize);
- 다른 모델과의 관계 설정: associate 메서드로 연결
User.associate(db);
Post.associate(db);
Hashtag.associate(db);
- 모듈 내보내기
module.exports = db;
- sequelize 모듈 가져오기
const Sequelize = require('sequelize')
- 모듈 내보내기
- Sequelize.Model에서 확장된 클래스의 static.init(sequelize)에서 super.init 반환하여 모델 정의하기
- 이때 super.init의 첫 번째 인자는 각 칼럼의 정의
- super.init의 두 번째 인자는 테이블 자체에 대한 정의
module.exports = class User extends Sequelize.Model {
static init(sequelize) {
return super.init({
email: {
type: Sequelize.STRING(40),
allowNull: true,
unique: true,
},
nick: {
type: Sequelize.STRING(15),
allowNull: false,
},
password: {
type: Sequelize.STRING(100),
allowNull: true,
},
provider: {
type: Sequelize.STRING(10),
allowNull: false,
defaultValue: 'local',
},
snsId: {
type: Sequelize.STRING(30),
allowNull: true,
},
}, {
sequelize,
timestamps: true,
underscored: false,
modelName: 'User',
tableName: 'users',
paranoid: true,
charset: 'utf8',
collate: 'utf8_general_ci',
});
}
- 다른 테이블과 관계 설정하기(여전히 class 테이블 안)
static associate(db) {
db.User.hasMany(db.Post);
db.User.belongsToMany(db.User, {
foreignKey: 'followingId',
as: 'Followers',
through: 'Follow',
});
db.User.belongsToMany(db.User, {
foreignKey: 'followerId',
as: 'Followings',
through: 'Follow',
});
}
};
- .hasMany(db.모델):
인자로 주어진 모델과 1:N관계를 갖는다.
-- user.getPosts, user.addPosts 과 같은 관계 메서드들이 생성됨
db.User.hasMany(db.Post);
- .belongsTo(db.모델):
인자로 주어진 모델에게 속해있다.
--post.getUser, post.addUser 등의 관계 메서드가 생성된다.
post.getHashtags, post.addHashtags,
- .belongsToMany(db.모델, 외래키 오브젝트) :
모델과의 n:m관계를 나타낸다
--PostHashtag라는 중간 모델이 생긴다.
--각각 postId와 hashtagId라는 외래키도 추가된다.
--(as를 따로 지정하지 않았다면) post.getHashtags, post.addHashtags, hashtags.getPost 등의 관계 메서드들이 생성된다.
(케이스1)
db.Post.belongsToMany(db.Hashtag, {through:'PostHashtag'});
- 같은 테이블 안에서 n:m 관계일 경우:
-- through: 모델 이름을 따로 생성한다.
-- foreignKey옵션에 대상을, as 에 반대되는 모델을 입력한다
--user.getFollowers, user.getFollowings 등의 관계 메서드를 사용할 수 있다.
db.User.belongsToMany(db.User, {
foreignKey: 'followingId',
as: 'Followers',
through: 'Follow',
});
db.User.belongsToMany(db.User, {
foreignKey: 'followerId',
as: 'Followings',
through: 'Follow',
});
- 자동으로 생성된 모델(n:m등에서)도 다음과 같이 접근 가능하다
db.sequelize.models.PostHashtag
db.sequelize.models.Follow
- config.json를 읽어 데이터베이스를 생성한다.
(비밀번호읽기 + 데이터베이스 이름 설정하기 + operatorAliases 속성 삭제하기)
{
"development": {
"username": "root",
"password": "nodejsbook",
"database": "nodebird",
"host": "127.0.0.1",
"dialect": "mysql",
"operatorAliases": false
},
"test": {
"username": "root",
"password": null,
"database": "database_test",
"host": "127.0.0.1",
"dialect": "mysql"
},
"production": {
"username": "root",
"password": null,
"database": "database_production",
"host": "127.0.0.1",
"dialect": "mysql"
}
}
- 콘솔에 ' npx sequelize db:create ' 입력하여 데이터베이스 생성하기