반응형
Sequelize?
- node.js의 ORM으로, mysql이나 postgresql과 같은 DB를 제어할 수 있도록 해준다.
- cf. ORM(Object relational Mapping) : 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것. 객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용한다. 즉, 프로그래밍 언어의 구문을 자동으로 SQL 구문으로 변경해준다.
$ npm install sequelize
- 또한 sequelize는 mysql 등의 DB모듈도 필요로 한다. 그 중 하나인 mysql을 설치하자.
$ npm install mysql2
dotenv 설정
- Sequelize를 사용하기 위해서는 앞서 말했듯이 DB와 연동이 되어있어야 한다.
- mysql과 같은 DB에 접속하기 위해서는 해당 DB의 ID와 password가 필요하다. 이를 한두번 입력해주는 것은 어렵지 않겠지만 매번 처리하기란 귀찮은 일이다. 다른 사람과 프로젝트를 공유하는 상황에서는 더더욱 그렇다.
- dotenv를 활용하면 환경변수 설정이 가능해져 이러한 작업이 용이해진다. 따라서 Sequelize 사용에 앞서 dotenv를 설정해보겠다.
$ npm install dotenv
-
패키지를 설치한다.
-
새 파일 만들기로
.env.sample
을 만들어서.env
파일을 어떻게 구성하면 되는지 작성한다. 아래는 그에 대한 예시이다. -
.env.sample
에는 해당 정보에 대한 설명이 들어간다고 생각하면 편하다.
DATABASE = "데이터베이스명"
DB_USER = "아이디"
DB_PASSWORD = "패스워드"
DB_HOST = "DB호스트"
.env.sample
을 참고하여 실질적인.env
파일을 작성할 수 있는 것이다.- git에 프로젝트를 올리는 경우,
.env
파일은 id, password같은 보안정보가 포함되어 있기 때문에.env.sample
만 git에 올리고.env
는 git ignore로 설정해야 한다. - 추후 프로젝트에서
.env
의 정보는 process.env.DB_USER와 같은 방식으로 접근할 수 있다.
DB 접속
- mysql에 'exercise'라는 DB가 생성되어 있다는 가정하에 설명을 시작한다.
- 일반적으로 프로젝트 root 디렉토리에
models 폴더
생성 후index.js 파일
을 만들어 이에 관련내용을 작성한다.
📃 index.js
var Sequelize = require('sequelize');
var path = require('path');
var fs = require('fs');
var dotenv = require('dotenv');
dotenv.config(); //LOAD CONFIG
const sequelize = new Sequelize( process.env.DATABASE,
process.env.DB_USER, process.env.DB_PASSWORD,{
host: process.env.DB_HOST,
dialect: 'mysql',
timezone: '+09:00', // 한국 시간 셋팅
operatorsAliases: Sequelize.Op,
pool: {
max: 5,
min: 0,
idle: 10000
}
});
- 새로운 Sequelize 객체를 process.env.DATABASE, process.env.DB_USER, process.env.DB_PASSWORD를 기반으로 생성
let db = [];
fs.readdirSync(__dirname)
.filter(file => {
return file.indexOf('.js')&& file !== 'index.js'
})
.forEach(file => {
var model = sequelize.import(path.join(__dirname,
file));
db[model.name] = model;
});
- 현재경로에서 index.js 파일을 제외한 파일들을 참조해 테이블들을 생성
Object.keys(db).forEach(modelName => {
if("associate" in db[modelName]){
db[modelName].associate(db);
}
});
- foreign key 관련 정보를 읽고 이와 관련된 테이블도 자동생성
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
- 최종 모듈 exports
- 이제 app.js에서 해당 모듈을 불러와 활용하면 된다.
📃 app.js
const db = require('./models');
db.sequelize.authenticate()
.then(() => {
console.log('Connection has been established successfully.');
})
.then(() => {
console.log('DB Sync complete.');
return db.sequelize.sync();
})
.catch(err => {
console.error('Unable to connect to the database:', err);
});
- 위 코드를 app.js에 추가하고 실행했을 때 'Connection has been established successfully.'와 'DB Sync complete.' 메세지가 콘솔에 출력된다면 성공적으로 DB가 연결된 것이다.
모델 작성
models 폴더
에 새로운 js파일을 만들어 모델을 작성한다.
📃 ex. Products.js
module.exports = (sequelize, DataTypes) => {
const Products = sequelize.define('Products',
{
id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
name : { type: DataTypes.STRING },
price : { type: DataTypes.INTEGER },
description : { type: DataTypes.TEXT }
}
);
return Products;
}
- db.sequelize.sync()를 통해 자동으로 초기화가 진행되면서 해당 테이블이 지정된 DB에 생성된다.
DB CRUD
CREATE
Model.create({key: 'value'})
- 위의 형식으로 입력할 데이터를 전달
READ
Model.findAll()
Model.findOne()
Model.findAll({ where: { type: 'choice' } })
- Model.findAll() : 조건에 맞는 모든 데이터를 불러옴
- Model.findOne() : 조건에 맞는 하나의 데이터만 불러옴
- Model.findAll({ where: { type: 'choice' } })와 같이 검색할 조건 전달가능
UPDATE
Model.update({ answer: 1 }, { where: { _id: 1 } })
- 첫 번째 인자로 수정할 데이터를, 두 번째 인자로 조건을 전달. (위 코드는 id가 1인 행의 answer를 1로 변경함)
DESTROY
Model.destroy({ where: { type: 'choice' } })
- 조건에 맞는 모든 데이터 삭제. 위의 경우 type이 choice인 모든 데이터를 삭제함.
반응형
'🛠 기타 > WEB' 카테고리의 다른 글
Node.js - cookie (0) | 2021.02.02 |
---|---|
Node.js - multer (파일 업로드) (0) | 2021.01.31 |
Nest.js - nest.js 환경에서 GraphQL 사용하기 (0) | 2021.01.13 |
React - GraphQL Client (with Apollo) (0) | 2021.01.12 |
React - Styled Components (0) | 2021.01.12 |