node.js

[Node.js] #7 시퀄라이즈(Sequelize)

로춘남 2021. 11. 18. 16:43
728x90


※ 시퀄라이즈(Sequelize)를 사용하기전에 데이터베이스 MySQL이 설치가 되어 있어야 합니다.


시퀄라이즈는 ORM(Object-relational Mapping)으로 분류. ORM은 자바스크립트 객체와 데이터베이스의 릴레이션을 매핑해주는 도구. MySQL뿐만 아니라 MariaDB, PostgreSQL, SQLite, MSSQL 등 다른 데이터베이스와도 함께 쓸 수 있다.

 

왜 시퀄라이즈를 써야하는가?

→ 자바스크립트 구문을 알아서 SQL로 바꿔주기 때문. 따라서 SQL언어를 직접 사용하지 않아도 자바스크립트만으로 MySQL을 조작 할 수가 있다.

[시퀄라이즈에 필요한 패키지 설치]
npm i express morgan nunjucks sequelize sequelize-cli mysql2
npm i -D nodemon

[sequelize init 명령어 호출]
npx sequelize init

이 과정이 무사히 완료되었다면, config, models, migrations, seeders 폴더가 생성되고 models 포덜 안에 index.js가 생성되었을것이다.

 

const Sequelize = require('sequelize');

const env = process.env.NODE_ENV || 'development';
const config = require('../config/config')[env];
const db = {};

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

module.exports = db;

index.js의 코드이다. Sequelize는 시퀄라이즈 패키지이자 생성자이며, config/config.json에서 데이터베이스 설정을 불러온 후 new Sequelize를 통해 MySQL 연결 객체를 생성하게 된다. 연결객체를 나중에 재사용하기 위해 db.sequelize에 넣어두었다.

 

그럼 이제 MySQL에 연결을 해보자. app.js를 생성하고 익스프레스와 시퀄라이즈 연결코드를 작성해본다.

const express = require('express');
const path = require('path');
const morgan = require('morgan');
const nunjucks = require('nunjucks');

const { sequelize } = require('./models');

const app = express();
app.set('port', process.env.PORT || 3001);
app.set('view engine', 'html');
nunjucks.configure('views', {
    express: app,
    watch: true,
});
sequelize.sync({ force : false })
.then(() => {
    console.log('데이터베이스 연결 성공');
})
.catch((err) => {
    console.error(err);
});

app.use(morgan('dev'));
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));

app.use((req, res, next) => {
    const error = new Error('${req.method} ${req.url} 라우터가 없습니다.');
    error.status = 404;
    next(error);
});

app.use((err, req, res, next) =>{
    res.locals.message = err.message;
    res.locals.error = process.env.NODE_ENV !== 'production' ? err : {};
    res.status(err.status || 500);
    res.render('error');
});

app.listen(app.get('port'), () => {
    console.log(app.get('port'), '번 포트에서 대기중');
});
{
  "development": {
    "username": "root",
    "password": [root 비밀번호],
    "database": "nodejs",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}

각각의 js 파일과 json 파일을 설정후 npm start를 실행해주면 MySQL 연결이 완료된다.

 

MySQL 시퀄라이즈
VARCHAR(100) STRING(100)
INT INTEGER
TINYINT BOOLEAN
DATETIME DATE
INT UNSIGNED INTEGER.UNSIGNED
NOT NULL allowNull : false
UNIQUE unique : true
DEFAULT now( ) defaultValue: Sequelize.NOW

 

관계정의

 

1) 1 : N 관계

시퀄라이즈에서는 1:N 관계를 hasMany라는 메서드로 표현. belongsTo 메서드는 예제에서 comments 테이블 로우를 불러올 때 연결된 users 테이블의 로우를 가져올때 사용.

 

2) 1 : 1 관계

1:1관계에서는 hasMany 메서드 대신 hasOne 메서드 사용.

 

3) N : M 관계

데이터를 조회할때 여러단계를 거쳐야함.

 

쿼리 알아보기

SQL과 시퀄라이즈의 관계

INSERT INTO nodejs.users (name, age, married, comment) VALUES ('zero', 24, 0, '자기소개1');
const { User } = require('../models');
User.create({
	name: 'zero',
    age: 24,
    married: false,
    comment: '자기소개1',
  });

두 코드는 모두 같은 역할을 담당하고 있다. models 모듈에서 Users 모델을 볼러와 create를 적용시키는것이 바로 쿼리에서의 INSERT문이다. 다만 주의할점은 데이터를 넣을때 MySQL의 자료형이 아니라 시퀄라이즈 모델이 정의한 자료형태로 넣어야한다. (그래서 married가 0이 아니라 false 임). 시퀄라이즈가 알아서 MySQL 자료형으로 바꾸기 때문에 자료형이나 옵션에 부합하지 않는 데이터를 넣었을때는 시퀄라이즈가 에러를 발생시킨다.


모든 데이터 조회

SELECT * FROM nodejs.users;
User.findAll({});

테이블의 데이터 하나만 가져오기

SELECT * FROM nodejs.users LIMIT 1;
User.findOne({});

attributes 옵션 적용하여 원하는 컬럼만 가져오기

SELECT name, married FROM nodejs.users;
User.findAll({
	attributes: ['name', 'married'],
 });

where 옵션으로 나열하기

SELECT name, age FROM nodejs.users WHERE married = 1 AND age > 30;
const { Op } = require('sequelize');
const { User } = require('../models');
User.findAll({
	attributes: ['name', 'age'],
    where: {
    	married: true,
        age: { [Op.gt]: 30 },
      },
    });

※ Op 객체

age 부분을 보면 특이하다. 시퀄라이즈는 자바스크립트 객체를 사용해서 쿼리를 생성해야하므로 Op.gt 같은 특수한 연산자들이 사용된다. Sequelize 객체 내부의 Op 객체를 불러와 사용.

자주 쓰이는 녀석들 : Op.gt(초과), Op.gte(이상), Op.lt(미만), Op.lte(이하), Op.ne(같지 않음), Op.or(또는), Op.in(배열 요소 중 하나), Op.notIn(배열 요소와 모두 다름) 등이 있음.


참 조 : Node.js 교과서(개정 2판)

728x90