models/user.js: 사용자 테이블과 연결됨
- provider: 카카오 로그인인 경우 kakao, 로컬 로그인(이메일/비밀번호)인 경우 local
- snsId: 카카오 로그인인 경우 주어지는 id
models/post.js: 게시글 내용과 이미지 경로를 저장(이미지는 파일로 저장)
models/hashtag.js: 해시태그 이름을 저장(나중에 태그로 검색하기 위해서)
시퀄라이즈가 자동으로 생성해주는 코드 대신 다음과 같이 변경
- 모델들을 불러옴(require)
- 모델 간 관계가 있는 경우 관계 설정
- User(1):Post(다)
- Post(다):Hashtag(다)
- User(다):User(다)
모델간의 관계들 associate에 작성
1대다: hasMany와 belongsTo
다대다: belongsToMany
- foreignKey: 외래키
- as: 컬럼에 대한 별명
- through: 중간 테이블명
User(다):User(다)
- 다대다 관계이므로 중간 테이블(Follow) 생성됨
- 모델 이름이 같으므로 구분 필요함(as가 구분자 역할, foreignKey는 반대 테이블 컬럼의 프라이머리 키 컬럼)
- 시퀄라이즈는 as 이름을 바탕으로 자동으로 addFollower, getFollowers, addFollowing, getFollowings 메서드 생성
hashtag.js
const Sequelize = require('sequelize');
module.exports = class Hashtag extends Sequelize.Model {
static init(sequelize) {
return super.init({
title: {
type: Sequelize.STRING(15),
allowNull: false,
unique: true,
},
}, {
sequelize,
timestamps: true,
underscored: false,
modelName: 'Hashtag',
tableName: 'hashtags',
paranoid: false,
charset: 'utf8mb4',
collate: 'utf8mb4_general_ci',
});
}
static associate(db) {
db.Hashtag.belongsToMany(db.Post, { through: 'PostHashtag' });
}
};
index.js
const Sequelize = require('sequelize');
const env = process.env.NODE_ENV || 'development';
const config = require('../config/config')[env];
const User = require('./user');
const Post = require('./post');
const Hashtag = require('./hashtag');
const db = {};
const sequelize = new Sequelize(
config.database, config.username, config.password, config,
);
db.sequelize = sequelize;
db.User = User;
db.Post = Post;
db.Hashtag = Hashtag;
User.init(sequelize);
Post.init(sequelize);
Hashtag.init(sequelize);
User.associate(db);
Post.associate(db);
Hashtag.associate(db);
module.exports = db;
post.js
const Sequelize = require('sequelize');
module.exports = class Post extends Sequelize.Model {
static init(sequelize) {
return super.init({
content: {
type: Sequelize.STRING(140),
allowNull: false,
},
img: {
type: Sequelize.STRING(200),
allowNull: true,
},
}, {
sequelize,
timestamps: true,
underscored: false,
modelName: 'Post',
tableName: 'posts',
paranoid: false,
charset: 'utf8mb4',
collate: 'utf8mb4_general_ci',
});
}
static associate(db) {
db.Post.belongsTo(db.User);
db.Post.belongsToMany(db.Hashtag, { through: 'PostHashtag' });
}
};
uesr.js
const Sequelize = require('sequelize');
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',
});
}
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',
});
}
};
모델과 서버 연결하기
sequelize.sync()가 테이블 생성 // dotenv 아래에 위치하는 것이 좋음
IF NOT EXIST(SQL문)으로 테이블이 없을 때만 생성해줌
table 이 바꿨을 때 수정하는 방법
force : Table이 지워졌다가 다시 생성됨 ( 데이터가 날라감 )
alter : 컬럼이랑 기존 데이터랑 싱크가 되지 않아서 에러가 날 경우가 많음
'Node.js' 카테고리의 다른 글
카카오 로그인 작업 (0) | 2021.01.06 |
---|---|
패스포트 사용하기 (로그인 과정 helper) (0) | 2021.01.05 |
프로젝트 구조 갖추기 (0) | 2021.01.03 |
시퀄라이즈 쿼리 (0) | 2020.12.30 |
시퀄라이저 모델 자료형 (0) | 2020.12.29 |