Sequelize

이재영·2023년 5월 17일
0

Node.js

목록 보기
8/12
post-thumbnail

Sequelize 란?

  • Node.js를 위한 ORM(객체 관계 매핑) 라이브러리 중 하나로, 객체와 데이터 베이스를 매핑 시켜 js 구문으로 SQL 제어 가능.

1. Sequelize로 model 설계

// sequelize 라이브러리에서 DataTypes 과 Model 가져와 사용
// DataTypes : 데이터베이스 컬럼의 데이터 유형 정의
// Model 클래스 : 데이터베이스 테이블과 상호 작용
const {DataTypes,Model} = require("sequelize");

// User 클래스는 Model 클래스를 상속받고
class User extends Model{
  // init 메서드를 정의
    static init(sequelize) {
      // 부모의 init 메서드를 가져와서 모델 설정
        return super.init(
            {
                user_id :{
                  // DataTypes 을 STRING으로 설정
                    type : DataTypes.STRING,
                  // 값이 Null 될 수 없음.
                    allowNull : false,
                  // 값은 고유값을 가져야 함.
                    unique: true
                },
              
             },{
                sequelize,
               // 카멜표기법으로 사용
                underscored : false,
               // createdAt, updatedAt 를 표기
                timestamps : true,
               // 모델 이름
                modelName : "Users",
               // 테이블 이름
                tableName : "users",
               // 문자 인코딩 및 규칙 설정.
                charset : "utf8",
                collate : "utf8_general_ci"
            }
        )
    }
  // assicoate 메서드 정의
  	static assicoate(db) {
      // User 테이블 과 Real_estate 테이블이 1 : N 관계고.
      // Real_estate 테이블의 seller 컬럼의 값은 User 테이블의 id를 참조한다. (외래키 설정)
		db.User.hasMany(db.Real_estate, { foreignKey : "seller", sourceKey : "id"});
	}
}
// 클래스를 내보내서 index.js 에서 한번에 
module.exports = User;

hasMany 로 설정했으면,
real_estate.js 에서도 설정을 해줘야한다.

static assicoate(db) {
	// belongsTo를 통해 Real_estate 테이블의 seller 컬럼을
  	// User 테이블의 id 값을 참조하는 외래키로 설정.
        db.Real_estate.belongsTo(db.User, { foreignKey: "seller", targetKey: "id" });

2. .env 및 config 설정

.env

DATABASE_NAME = 스키마 이름
DATABASE_USERNAME = DB 계정 이름
DATABASE_PASSWORD = DB 계정 비밀번호
DATABASE_HOST = 127.0.0.1

config/index.js

const config = {
    dev: {
      database: process.env.DATABASE_NAME,
      username: process.env.DATABASE_USERNAME,
      password: process.env.DATABASE_PASSWORD,
      host: process.env.DATABASE_HOST,
      dialect: "mysql",
      timezone: "+09:00",
      dateStrings: "date",
    },
  };
  
  module.exports = config;

3. model 초기화 및 관계 설정 ( models/index.js )

const Sequelize = require("sequelize");
const bcrypt = require("bcrypt")
const config = require("../config");
const User = require("./users");
const Real_estate = require ("./real_estate");

// Sequelize 인스턴스를 생성하고 설정 파일을 통해 데이터베이스에 연결
const sequelize = new Sequelize(config.dev);

// 데이터베이스 모델과 연결할 객체 db를 생성하고,  모델을 db 객체의 속성으로 설정
const db = {};
db.sequelize = sequelize;
db.User = User;
db.Real_estate = Real_estate;

// 모델을 초기화
User.init(sequelize);
Real_estate.init(sequelize);
Transaction.init(sequelize);

// 모델 간의 관계를 설정
User.associate(db);
Real_estate.associate(db);

// db 객체 내보내기
module.exports = db;

4. app.js 설정


const dot = require("dotenv").config();
const {sequelize} = require("./models");

const express = require("express");
const app = express();
app.use(express.urlencoded({extended : false}));

sequelize
.sync({force : false})
.then(()=>{
    console.log("database connect")
})
.catch((err)=>{
    console.log(err);
});

app.listen(8080, ()=>{
    console.log("Server on");
})
profile
한걸음씩

0개의 댓글