Next.js 서버사이드렌더링
버전이 다르기 때문에 소스가 강좌와 다를 수 있다.
버전
next: 13.0.4
antd: 5.0.1
소스 : https://github.dev/braverokmc79/node-bird-sns
제로초 소스 : https://github.com/ZeroCho/react-nodebird
74. sequelize 최신 문법 사용
강의 :
시퀄라이즈 사용법
https://sequelize.org/docs/v6/
백엔드
models/comment.js
//기존
// module.exports = (sequelize, DataTypes) => {
// const Comment = sequelize.define('Comment', {
// //id: {}, id 가 기본적으로 들어있다.
// content: {
// type: DataTypes.TEXT,
// allowNull: false
// },
// //UserId:1
// //PostId:3
// }, {
// charset: 'utf8mb4',
// collate: 'utf8mb4_unicode_ci' //이모티콘 저장
// });
// Comment.associate = (db) => {
// db.Comment.belongsTo(db.User);
// db.Comment.belongsTo(db.Post);
// }
// return Comment;
// }
//==>업데이트
const DataTypes = require('sequelize');
const { Model } = DataTypes;
module.exports = class Comment extends Model {
static init(sequelize) {
return super.init({
// id가 기본적으로 들어있다.
content: {
type: DataTypes.TEXT,
allowNull: false,
},
// UserId: 1
// PostId: 3
}, {
modelName: 'Comment',
tableName: 'comments',
charset: 'utf8mb4',
collate: 'utf8mb4_general_ci', // 이모티콘 저장
sequelize,
});
}
static associate(db) {
db.Comment.belongsTo(db.User);
db.Comment.belongsTo(db.Post);
}
};
models/hashtag.js
// module.exports = (sequelize, DataTypes) => {
// const Hashtag = sequelize.define('Hashtag', {
// //id: {}, id 가 기본적으로 들어있다.
// name: {
// type: DataTypes.STRING(50),
// allowNull: false
// },
// }, {
// charset: 'utf8mb4',
// collate: 'utf8mb4_unicode_ci' //이모티콘 저장
// });
// Hashtag.associate = (db) => {
// db.Hashtag.belongsToMany(db.Post, { through: 'PostHashtag' });
// }
// return Hashtag;
// }
// 업데이트 =>
const DataTypes = require('sequelize');
const { Model } = DataTypes;
module.exports = class Hashtag extends Model {
static init(sequelize) {
return super.init({
// id가 기본적으로 들어있다.
name: {
type: DataTypes.STRING(20),
allowNull: false,
},
}, {
modelName: 'Hashtag',
tableName: 'hashtags',
charset: 'utf8mb4',
collate: 'utf8mb4_general_ci', // 이모티콘 저장
sequelize,
});
}
static associate(db) {
db.Hashtag.belongsToMany(db.Post, { through: 'PostHashtag' });
}
};
models/image.js
// module.exports = (sequelize, DataTypes) => {
// const Image = sequelize.define('Image', {
// //id: {}, id 가 기본적으로 들어있다.
// src: {
// type: DataTypes.STRING(200),
// allowNull: false
// },
// }, {
// charset: 'utf8mb4',
// collate: 'utf8mb4_unicode_ci' //이모티콘 저장
// });
// Image.associate = (db) => {
// db.Image.belongsTo(db.Post);
// }
// return Image;
// }
const DataTypes = require('sequelize');
const { Model } = DataTypes;
module.exports = class Image extends Model {
static init(sequelize) {
return super.init({
//id가 기본적으로 들어있다.
src: {
type: DataTypes.STRING(200),
allowNull: false,
}
}, {
modelName: 'Image',
tableName: 'images',
charset: 'utf8mb4',
collate: 'utf8mb4_general_ci', // 이모티콘 저장
sequelize,
})
}
static associate(db) {
db.Image.belongsTo(db.Post);
}
}
models/post.js
// module.exports = (sequelize, DataTypes) => {
// const Post = sequelize.define('Post', { //MYSQL 에는 POST 테이블 생성
// //id: {}, id 가 기본적으로 들어있다.
// content: {
// type: DataTypes.TEXT,
// allowNull: false,
// },
// //RetweetId
// }, {
// charset: 'utf8mb4',
// collate: 'utf8mb4_unicode_ci' //이모티콘 저장
// });
// Post.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
// }
// return 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.Report);
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
}
};
models/report.js
const DataTypes = require('sequelize');
const { Model } = DataTypes;
module.exports = class Report extends Model {
static init(sequelize) {
return super.init({
// id가 기본적으로 들어있다.
content: {
type: DataTypes.TEXT,
allowNull: false,
},
}, {
modelName: 'Report',
tableName: 'reports',
charset: 'utf8mb4',
collate: 'utf8mb4_general_ci', // 이모티콘 저장
sequelize,
});
}
static associate(db) {
db.Report.belongsTo(db.User);
db.Report.belongsTo(db.Post);
}
};
models/user.js
// module.exports = (sequelize, DataTypes) => {
// const User = sequelize.define('User', { //MYSQL 에는 users 테이블 생성
// //id: {}, 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,//필수
// }
// //PostId:1,2,5,10,15
// //CommentId
// }, {
// charset: 'utf8mb4',
// collate: 'utf8mb4_unicode_ci'
// });
// User.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" });
// };
// return User;
// }
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: 'utf8mb4',
collate: 'utf8mb4_unicode_ci', // 한글 저장
sequelize,
});
}
static associate(db) {
db.User.hasMany(db.Post);
db.User.hasMany(db.Report);
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/index.js
const Sequelize = require('sequelize');
const comment = require('./comment');
const hashtag = require('./hashtag');
const image = require('./image');
const post = require('./post');
const user = require('./user');
const report = require('./report');
//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.Comment = require('./comment')(sequelize, Sequelize);
// db.Hashtag = require('./hashtag')(sequelize, Sequelize);
// db.Image = require('./image')(sequelize, Sequelize);
// db.Post = require('./post')(sequelize, Sequelize);
// db.User = require('./user')(sequelize, Sequelize);
db.Comment = comment;
db.Hashtag = hashtag;
db.Image = image;
db.Post = post;
db.User = user;
db.Report = report;
Object.keys(db).forEach(modelName => {
db[modelName].init(sequelize);
})
Object.keys(db).forEach(modelName => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;














댓글 ( 4)
댓글 남기기