nodebird

Mysql을 다뤄봅시다

PGI 2024. 1. 3. 22:41
반응형

01. 간단하게 즐기는 Mysql

 

npm i sequelize sequelize-cli mysql2

mysql2 : mysql과 node를 연결해주는 드라이버

sequelize : sql언어를 몰라도 자바스크립트를 이용해서 sql로 변환해줌

 

그 후에는 npx sequelize init으로 sequelize세팅한다.

 

좌측은  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 이거로 데이터 베이스를 짜줘야한다.

반응형