sequelize Node.js

PARK·2021년 5월 26일
0

서버 및 Node.js

목록 보기
6/7

# 1.패키지 소개

sequelize

Sequelize는 Microsoft SQL Server(Postgres, MySQL, MariaDB, SQLite)를 지원하는 Promise 패턴 기반의 Node.js ORM입니다.

특징

Promise 패턴 기반
자바스크립트의 promise 기반입니다. async와 await를 사용할 수 있고 예외처리도 Callback보다 깔끔하게 할 수 있습니다.

ORM

ORM은 Object Relational Mapping(객체-관계 매핑)의 약자입니다. 자동으로 DBMS의 데이터를 객체 형태로 변환해줘서 객체 지향적인 코드를 생산할 수 있도록 도와줍니다. 이를 통해 개발자는 데이터를 가지고 어떤 작업을 할지에만 집중할 수 있습니다. 또한 손쉽게 DBMS를 변경할 수 있어서 제품이 높은 이식성을 가질 수 있게 됩니다.

  • sequelize-cli
    sequelize 기능을 터미널에서 실행하기 위한 툴 입니다.
  • morgan
    https://www.npmjs.com/package/morgan
    NodeJS 서버로 구성된 웹 환경에서 로그를 관리하기 위한 라이브러리입니다.

2. 설치 및 초기화

sequelize 설치
npm i morgan nunjucks sequelize sequelize-cli mysql2

참고: mysql2은 드라이버입니다. node와 mysql연결을 위해서 사용.

sequelize 초기화

npx sequelize init
sequelize-init으로 생성된다.

config
DB 연결 정보 등을 저장합니다.

models
DB 모델(테이블) 정의를 저장합니다.

migrations
마이그레이션에 필요한 데이터가 자동으로 저장됩니다.

seeders
테스트에 필요한 데이터를 정의합니다.(임시 데이터 삽입을 위한 도구)

참고: nunjucks를 사용하기 위해서는 views를 따로 만들어서 관리하면 좋습니다. sequelize init으로 따로 생성되지 않습니다.

config 파일

config.json

"development"칸에 db의 password와 database명을 적습니다. root는 db사용자 명입니다. "test"는 테스트 모드용 "production"은 운용모드용입니다.

models 파일

model은 db의 테이블과 대응된다고 생각하면 됩니다.

const Sequelize = require("sequelize");

class MyModel extends Sequelize.Model {
  static init(sequelize) {
    return super.init(
      {//1
        myField: DataTypes.STRING
      },
      {//2
        sequelize 
      }
    );
  }
}
 

모델을 생성하는 방법을 다루고 있습니다.

init의 첫 번째 인자에는 컬럼을 적습니다. (//1 부분)
두 번째 인자에는 테이블에 대한 설정을 적습니다. (//2부분)

Sequelize와 MySql 비교
{
  created: {
    type: Sequelize.DATE, //DATETIME
          Sequelize.DateOnly // DATE
    	  //DateOnly = DATE without time
    allowNull: false,
    defaultValue: Sequelize.NOW,
}
id는 default로 생성됩니다.
allowNull: ture
   //notNull
  unique: true
    //uniqueKey
{//2부분 옵션,
      sequelize, 
        //항상 디폴트로 존재해야합니다.(연결객체)
      timestamps: false, 
      // timestamps를 true로 하면 creatat, updateat 사용가능하다,
      underscored: false,
      //컬럼명 생성할 때 _를 사용한다.ex) creat_at로 해야한다.
      paranoid: false,
      //deleteAt도 사용할 수 있다. 삭제한 날짜 기록,soft delete를 사용할 수 있다.
      modelName: 'User', 
        // sequelize의 모델 이름, 단수형 사용
      tableName: 'users', 
        // sql의 테이블 이름, 복수형 사용
      charset: 'utf8', 
      collate: 'utf8_general_ci', 
        // 밑에 2행은 한글 설정을 위해 필요, default로 집어넣음 
    
}

Sequelize Sync 사용하기

models.sequelize.sync()
  .then(() => {
    //
  })
  .catch(err => {
    //
  });
  

sync를 만나면 Sequelize작업을 진행합니다. DB의 테이블을 생성하는 작업입니다. sync 메서드는 모델에서 정의한 이름의 테이블이 존재하지 않을 경우에만 동작합니다. 이미 테이블이 존재할 경우에는

models.sequelize.sync({force: true}) 

과 같이 force 옵션을 주어 강제적으로 테이블을 제거 후 다시 생성이 가능하지만 매우 위험한 옵션이므로 주의를 기울여 사용해야 합니다.

CRUD

sequelize는 기본적으로 CRUD기능을 지원합니다.

MySql
INSERT
SELECT
UPDATE
DELETE

Sequelize
Create
findAll, findOne
update
destory

ex 1 ) findAll 사용

User.findAll({
attributes: ['name', 'age'],
});

attributes는 name과 age 컬럼만 선택됩니다.

ex 2 ) 조건문과 findAll 사용

User.findAll({
attributes: ['name', 'age'],
  where: {
  	married: 1,
    	age: {[Op.gt]: 30},
  },
});

where는 조건문 입니다. married가 boolean이라면 1은 true인 조건만 선택, op.gt는 >으로 30보다 큰 조건만 선택됩니다.

//조건
op.gt >
 op.lt <
 op.gte >=
 op.lte <=
 op.in [] //[]조회해서 실행, 반복작업용

관계쿼리 엮기

1대1 관계

db.User.hasOne(db.Info, {foreignKey: 'UserId, sourceKey:'id'});
db.User.belongsTo(db.User, {foreignKey: 'UserId, targetKey:'id'});

foreignKey는 belongsTo에 있는 컬럼

profile
익숙한 것에 작별을 고해야한다

0개의 댓글