본문 바로가기

학습노트/기초지식

[Sequelize] Sequelize와 사용법 그리고 sequelize query

Sequelize

  Sequelize란 node.js에서 mysql등 관계형 데이터베이스를 쉽게 다룰수 있게 도와주는 라이브러리이다. Sequelize는 대표적인 node.js의 ORM(Object Relational Mapping)이다.

 

 

ORM이란?

2020/09/28 - [학습노트/기초지식] - [ORM] Object Relational Mapping이란?

 

[ORM] Object Relational Mapping이란?

프로그래밍을 하다보면 자신이 원하는 서비스를 만들고 싶을 때 많은 개념들을 접하게 됩니다. 저도 마찬가지로 프로젝트 진행중에 ORM이라는 개념을 보게되어 공부하고 정리하려고 합니다. 1. O

ukcasso.tistory.com

  위에 ORM을 정리해놓은 글을 보아도 좋지만 간단하게  말해서 ORM은 객체 지향 프로그래밍언어를 관계형 데이터베이스와 연결해주는 패러다임이다.

 

즉, Sequelize를 사용하면 자바스크립트로 mysql을 제어할 수 있다.

 

 

Sequelize 설치

sequelize와 mysql2를 터미널에서 설치한다.

npm install --save sequelize
npm install --save mysql2

 

sequelize가 전역설치가 안되어 있을 경우 전역설치해준다. sequelize-cli는 터미널에서 sequelize를 더욱 간편하게 조작할수있게 만들어준다.

npm install -g --save-dev sequelize-cli

 

전역 cmd 에서 sequelize를 초기화해준다. 그러면 config, models, migrations, seeders 폴더가 생성된다.

sequelize init

 

 

Sequelize 설정

1) config/config.json

  config.json파일에서 DB정보를 각 환경에 맞게 설정할 수 있다. sequelize init을 한 경우 기본값으로 설정이 되어있는 것을 자신의 프로젝트에 맞게 변경하면 된다.

 

{
  "development": {
    "username": "root",
    "password": null,
    "database": "database_development",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "database_test",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "production": {
    "username": "root",
    "password": null,
    "database": "database_production",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}

 

위 부분에서 development부분을 바꿔준다.

 

username: DB 사용자명

password: DB 사용자 비밀번호

database: 관계형 데이터 베이스에서 사용할 database(schema) 이름

*미리 MySQL에서 schema를 만들어주어야 한다.*

host: host주소

dialect: 사용할 관계형 데이터 베이스 이름

operatorsAliases: 연산자에 대한 별칭 사용여부

 

즉, config/config.json은 sequelize를 사용하기 위하여 환경을 설정하는 부분이다.

 

2) models/index.js

- models/index.js파일은 config.json파일의 설정 값을 읽어 sequelize를 생성한다.

let sequelize;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(config.database, config.username, config.password, config);
}

 

- models 폴더 아래에 존재하는 js파일을 모두 로딩한다.

fs
  .readdirSync(__dirname)
  .filter(file => {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
  })
  .forEach(file => {
    const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
    db[model.name] = model;
  });

 

- DB 객체에 Model을 정의하여 반환한다.

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

 

즉, models/index.js는 Model을 정의하고 관계를 설정해주는 역할이다.

 

3) 확인하기

  연결이 잘 되었는지 확인하기 위해서 아래 코드를 자신이 만들 index.js(일반적 네이밍)에 붙여넣고 node index.js를 실행시킨다.

const models = require("./models/index.js");

models.sequelize.sync().then( () => {
  console.log(" DB 연결 성공");
  
}).catch(err => {
  console.log("연결 실패");
  console.log(err);
}

 

DB 연결 성공이 뜨면 정상적이다.

 

 

Sequelize Query 사용방법

INSERT

-create(values: Object, options: Object): 레코드 생성함수

-findOrCreate(options: Object): 조회 시 없으면 생성해주는 함수

-findCreateFind(options: Object): 조회 시 없으면 생성 후 조회하는 함수

-upsert(vales: Object, options: Object): 한 레코드만 인서트하거나 업데이트 해주는 함수

 

SELECT

-findOne(options: Object) : 하나만 조회하는 함수. find()와 동일

-findAll(options: Object) : 여러 개를 조회하는 함수

-findAndCountAll(findOptions: Object) : 조회 후 총 수 조회.

-findByPk(id: Number | String | Buffer, options: Object) : 프라이머리키로 조회하는 함수

-findCreateFind(options: Object) : 조회 시 없으면 생성 후 조회하는 함수

-findOrCreate(options: Object): 조회수 없으면 생성해주는 함수

 

 

 

UPDATE

-update(values: Object, options: Object) : 값을 업데이트 해주는 함수. 여러 레코드 가능

-upsert(values: Object, options: Object) : 한 레코드만 인서트하거나 업데이트해 주는 함수

 

 

 

DELETE

-destroy(options: Object) : 한 개나 여러 레코드를 삭제하는 함수

 

Sequelize SELECT Query함수의 Option

-attributes : 조회할 칼럼을 정하는 옵션.
-attributes안의 include : table없는 칼럼을 추가할 때 쓰는 옵션.
-where : 조회할 칼럼의 조건문을 정하는 옵션.
-include : foreignKey로 Outer Left Join하는 옵션.
-order : 정렬 옵션.
-limit : 조회하는 레코드의 개수를 정하는 옵션.
-offset : 몇 번째부터 조회할지 정하는 옵션.

User.find({ attributes: ['useremail', 'username' ], where: {id:1, useremail:"admin@admin.com"}});
User.find({include : [model.users], order: 'createdAt desc', limit: 5, offset: 10 });

 

Sequelize foreignKey Join

// Automagically generated join model 
User.belongsToMany(Project, { through: 'UserProjects' });
Project.belongsToMany(User, { through: 'UserProjects' });

 

 

Sequelize에서 직접 Query문 사용하기

var query = 'select * form user where name = admin'; 
sequelize.query(query)
	.spread(function (results, metadata) { 
    // 쿼리 실행 성공 
    }, function (err) { 
    // 쿼리 실행 에러 
    });