본문 바로가기

Web/Node.js

[Nodejs] Sequelize로 DB연결하기.

Seqeulize 사용하기

seqeulize는 nodejs에서 웹을 데이터베이스에 연동할 때 사용하는 미들웨어이다.
seqeulize는 DB에서 조회 된 값을 객체로 전달해주는 ORM(object-relational mapping)이다.

Seqeulize 사전작업

  • npm에서 seqeulize 다운받기

    : 터미널에서 npm install --save sequelize 실행시키면 된다.


  • npm에서 mysql2 다운받기

    : 터미널에서 npm install --save mysql2 실행시키면 된다.




  • config.json 파일 생성하기

    : 프로젝트에서 Project/config폴더/config.json을 생성해준다.
{
  "development": {
    "username": "root",
    "password": "db비밀번호",
    "database": "db이름",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "operatorAliases" : false
  }
}

config.json은 DB의 연동에 필요한 정보 (username, password, database, host, dialect) 값이 들어있다.



  • db table 모델링하기

    : 프로젝트에서 사용할 DB tableProject/models폴더/모델들.js을 생성한다.



Project/models/index.js

var path = require('path');
var Sequelize = require('sequelize');

var env = process.env.NODE_ENV || 'development';
var config = require(path.join(__dirname, '..', 'config', 'config.json'))[env];
var db = {};

var sequelize = new Sequelize(config.database, config.username, config.password, config);

db.sequelize = sequelize;
db.Sequelize = Sequelize;

db.User = require('./user')(sequelize, Sequelize);

module.exports = db;

index.js는 new Sequelize(config.database, config.username, config.password, config); config.json에 있는 DB 값으로 새로운 Sequelize객체를 생성하여 var db 객체에 넣어주고 다른 곳에서도 같은 Sequelize객체를 사용하도록 db을 experts 해주는 것을 볼 수있다.

  • models/index.js를 통해서 sequelize와 user를 접근 할수있다.


Project/models/user.js

module.exports = (sequelize, DataTypes) => {
    return sequelize.define('user', {
        useremail: {
        /* column 속성들 */
            type: DataTypes.STRING(20),
            allowNull: false,
            unique: true,
        /*   여기까지    */
        },
        password: {
            type: DataTypes.STRING(100),
            allowNull: false,
        },
        name: {
            type: DataTypes.STRING(10),
            allowNull: false,
        },
    },{
        timestamps:false,
    });
}

user.js는 users이름의 DB table이 없으면 생성해주고 존재하면 ORM의 객체 모델이 된다.

  • 칼럼은 id프라이머리 키, useremail, password, name가 있다.
  • idcreatedAt, updatedAt을 자동 생성해준다.

Sequelize의 DB table 칼럼 속성들

이름 Type Attribute Description
type String , DataTypes 밑에 참고
allowNull Boolean default: true null가능, 불가능
defaultValue any default: null 초기 값
unique String , Boolean default: false 칼럼에 겹치는 값의 존재 가능 여부
primaryKey Boolean default: false
field String default: null
autoIncrement Boolean default: false 값을 1씩 증가해서 저장
comment String default: null
references String , Model default: null
references.model String , Model
references.key String default: ‘id’
onUpdate String
onDelete String
get Function
set Function


table 칼럼 type의 Attribute들 “type-db.type형태”(-뒤가 없는 것은 db와 동일하기 때문)

type Attribute
text STRING-VARCHAR(255), STRING(1234)-VARCHAR(1234), STRING.BINARY-VARCHAR BINARY,
TEXT, TEXT(‘tiny’)-TINYTEXT
int INTEGER, BIGINT, BIGINT(11)
float FLOAT, FLOAT(11), FLOAT(11, 12)
double DOUBLE, DOUBLE(11), DOUBLE(11, 12)
boolean BOOLEAN-TINYINT(1)
demical DECIMAL, DECIMAL(10, 2)
date DATE-DATETIME, DATE(6)-DATETIME(6), DATEONLY-DATE
json JSON


Sequelize사용하기, DB사용하기

  • app.js Sequelize 객체 만들기, db연결하기.

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

var sequelize = require('./models').sequelize;

var app = express();

sequelize.sync();

먼저 var sequelize = require('./models').sequelize;코드가 sequelize 객체를 만들어 준 것이다.
이후 sequelize.sync(); sync()메소드를 통해 db를 연결해주었다.
javascript는 컴파일러가 아니라 인터프리터이기 때문에 코드 순서가 중요하다.
var sequelize = require('./models').sequelize;는 라우터들 밑에 작성해 주도록 하고
sequelize.sync();는 var app = express(); 밑에 작성해주도록 하자.
잘못된 곳에 호출했을 시 오류가 발생할 수 있다.



  • 필요한 라우터에서 필요한 DB table의 model객체 생성하기.

Project/views/index.js

var express = require('express');
var router = express.Router();
var {User} = require('../models');

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

module.exports = router;

기존의 /routes/index.js에서 var {User} = require('../models');가 추가되었다.

db에 미리 넣어둔 user 테이블의 레코드이다.


이 레코드를 가져와서 화면에 띄어보자.

먼저 /views/index.pug를 조금 수정해주자.

    block content
      h1= title
      p Welcome to #{title}
      p User e-mail : #{useremail}

block content 부분에 p태그로 User e-mail을 화면에 보이도록 만들었다.

다시 라우터로 가서 DB에서 레코드를 가져오자.

Project/views/index.js

var express = require('express');
var router = express.Router();
var {User} = require('../models');

/* GET home page. */
router.get('/', function(req, res, next) {
  User.find({where:{id:1}})
      .then((user) => {
    res.render('index', {
      title: 'Express',
      useremail: user.useremail});
  });
});

module.exports = router;

User객체의 find함수로 레코드를 찾아서 변수 user에 담았다.
뜬금없이 find함수가 나왔다. find함수는 sequelize의 함수로 레코드 하나를 조회하여 값을 가져오는 함수다.
쉽게 말해 SELECT 함수이다. 같은 SELECT 함수로는 findAll(), findAndCountAll() 등이 있다.
sql문으로는 SELECT `id`, `useremail`, `password`, `name` FROM `users` AS `user` WHERE `user`.`id` = 1;이다.
그렇게 조회한 레코드는 user객체에 저장되어있다. index.pug의 변수 #{useremail}에 조회한 user.useremail값을 넘겨주어서 화면에 출력했다.


결과 화면


원하는 대로 잘 출력 되었다.


Sequelize의 Query사용법

  • Sequelize의 INSERT, SELECT, UPDATE, DELETE 함수들

INSERT 함수

  • create(values: Object, options: Object) : 레코드 생성 함수이다.
  • findOrCreate(options: Object): 조회 시 없으면 생성해주는 함수이다.
  • findCreateFind(options: Object) : 조회 시 없으면 생성 후 조회하는 함수이다.
  • upsert(values: Object, options: Object) : 한 레코드만 인서트하거나 업데이트 해주는 함수.

SELECT 함수

  • findOne(options: Object) : 하나만 조회하는 함수이다. find()와 동일
  • findAll(options: Object) : 여러 개를 조회하는 함수이다.
  • findAndCountAll(findOptions: Object) : 조회 후 총 수까지 알 수 있다. 조회 객체.count로 접근
  • 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.docs에서 확인 가능하다.



  • Sequelize의 foreignKey 조인

Project/models/index.js

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

위 코드는 본 Project파일과 관계없음. Sequelize Documents에 나오는 코드.
models/index.js 부분에 위 코드처럼 foreignKey로 연결해주고 싶은 테이블 연결 해주면 됨.




  • Sequelize의 Query문 직접 사용하기.

var query = 'select * form user where name = admin';

sequelize.query(query)
  .spread(function (results, metadata) {
      // 쿼리 실행 성공

    }, function (err) {
      // 쿼리 실행 에러

    });

직접 Query문을 사용할 때는 sequelize.query()을 이용한다.


'Web > Node.js' 카테고리의 다른 글

[Nodejs] Pug 사용법  (9) 2019.01.20
[nodejs] 웹서버 운영하기  (0) 2019.01.20