01. 간단하게 즐기는 Mysql
npm i sequelize sequelize-cli mysql2
mysql2 : mysql과 node를 연결해주는 드라이버
sequelize : sql언어를 몰라도 자바스크립트를 이용해서 sql로 변환해줌
그 후에는 npx sequelize init으로 sequelize세팅한다.
02. models 기본세팅
제로초님 왈 지금의 Sequelize의 세팅은 쓰래기다 다시 바꾸는데 맨처음 기본베이스는 이렇게 하는게 낫다라고 하셧다.
참고로 지금은 데이터베이스에 테이블을 짜지 않았으니 이대로는 작업이 안된다.
models/index.js
const Sequelize = require("sequelize")
const env = process.env.NODE_ENV || "devlopment"
const config = require("../config/config.json")[env]
const db = {}
// Sequelize가 노드와 sql을 연결시켜준다.
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;
03. user 및 나머지 프론트서 받는거 기본 세팅
참고로 기본세팅이라는거지 이거로 마무리라는 소리는 아니다.
Model.exports = (sequelize,DataTyes)=>{
const User = sequelize.define("User",{ // Mysql은 users 테이블 생성
// 여기에는 회원가입시 프론트에서 주는 정보
email:{},
nickname:{},
password:{}
},{
charset:"utf8",
collate:"utf8_feneral_ci" // 한글저장
});
// 엑셀모양을 잡아준다.
User.associate = (ab) ={}
return User
}
여기서 중요한점은 한글로 하고 싶다면 charset을 utf8로 이모티콘까지 넣고 싶다 라고 하면 utf8mb4 로 저장해두어야한다.
그 후의 세팅은 대충 이렇다고 보면된다. 참고로 아직 다한거 아니다 다른거랑 연결시켜야되서.....
내용은 대충 적어놧다.
Model.exports = (sequelize,DataTyes)=>{
const User = sequelize.define("User",{ // Mysql은 users 테이블 생성
// 여기에는 회원가입시 프론트에서 주는 정보
email:{
// 스트링이여야하고 30글자 이내여야한다.
type:DataTyes.SRTING(30),
allowNull:false, // 필수 true면 선택이다.
unique:true, // 중복이 되면 안되는 값이다.
},
nickname:{
type: DataTyes.SRTING(30),
allowNull: false, // 필수 true면 선택이다.
unique: true, // 중복이 되면 안되는 값이다.
},
password:{
type: DataTyes.SRTING(100),
allowNull: false // 필수 true면 선택이다.
}
// type에서 많이 쓰는거 STRING TEXT BOOLEAN INTEGER FLOAT DATETIME
},{
charset:"utf8",
collate:"utf8_feneral_ci" // 한글저장
});
// 엑셀모양을 잡아준다.
User.associate = (db) => {
// 한사람이 많은 게시물을 갖을수 있다.
db.User.hasmany(db.Post)
db.User.hasmany(db.Comment)
// 이거는 게시물의 좋아요
db.User.belongsToMany(db.Post, {
through: "Like", // 중간 관계테이블 이름을 Like로 설정햇다.
as:"Likers" // 좋아요를 누른 사람들
})
db.User.belongsToMany(db.User, {
through: "Follow", // 팔로우 하고 잇는사람들
as: "Followers", // 팔로우 하고 잇는사람들
foreignKey: "FollowingId" // 찾는 기준점 (팔로잉 아이디 그니까 나~)
})
db.User.belongsToMany(db.User, {
through: "Follow", // 팔로잉 하고 잇는사람들
as: "Followings", // 팔로잉 하고 잇는사람들
foreignKey: "FollowerId" // 찾는 기준점 (팔로우 아이디 그니까 나~)
})
}
return User
}
지금꺼는 회원가입시 받는 데이터 이메일 닉네임 패스워드를 받기 위해 짜놓은 유저데이터 테이블용이다.
중요한거
type:DataTyes.SRTING(30), // 데이터의 타입과 몇글자 미만인지.
allowNull : false, // 필수 true면 선택이다. 필수적으로 프론트에서 줘야하는지 안줘도 되는지에 대한 값이라고 생각하면 된다.
unique : true, // 중복이 되면 안되는 값이다. 말그대로 유니크한 값
through : "", // 서로 테이블이 1;1이든 다대다든 일대다든 연결이 되있다면 그 중간 테이블이름
as: "", // 테이블 이름이 해깔릴수 잇어서 별칭이라 생각하면 된다.
foreignkey: "", // 해당 테이블에서 찾는 기준점
* post와 user가 둘다 좋아요로 다대다 테이블을 만들엇는데 foreignkey를 안한이유는 별칭이 다르기 때문이다.
user 대 user라고 하면 followId라는게 중복으로 되는데
post 대 user라고 하면 postId 와 userId 이런식으로 구분되기 때문이다.
hasMany : 일대다
belongsToMany : 다대다
belongsTo : 다대 일
04. models 추후 세팅 및 app.js 에서 sequelize와 db연결하기
위에잇는 관계를 다 짯다고 하면 다시 index.js파일에서 아래와 같이 불러온다.
// /models/index.js
const Sequelize = require("sequelize")
const env = process.env.NODE_ENV || "devlopment"
const config = require("../config/config.json")[env]
const db = {}
// Sequelize가 노드와 sql을 연결시켜준다.
const sequelize = new Sequelize(config.database, config.username, config.password, config)
// 테이블짜놓은거 꺼내옴.
db.Comment = require("./comment")(sequelize, Sequelize)
db.Categore = require("./categore")(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)
Object.keys(db).forEach(modelName => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
그후 이거를 또 app.js에다가 불러오는데 이렇게 불러오면 된다고 한다.
참고로 sync는 sequelize와 데이터베이스를 연결하는 메소드라고 한다.
then catch문을 쓴것은 프로미스객체라서 그렇다나...
// db에 있는거를 가지고 온다.
// sync는 sequelize와 데이터베이스를 연결시키는 메소드임
db.sequelize.sync().then(()=>{
console.log("db연결 성공")
}).catch(console.error)
05. db연결
위에서 끝나는게 아니라 npx sequelize db:create 이거로 데이터 베이스를 짜줘야한다.
'nodebird' 카테고리의 다른 글
styled-components (0) | 2024.01.16 |
---|---|
블로그도 만들어 봅시다. (0) | 2024.01.16 |
Node기초 (0) | 2024.01.03 |
next를 쉽게 깔아 봅시다... (1) | 2024.01.01 |
section 03 (1) | 2023.10.29 |