Sequelize
Sequelize란 node.js에서 mysql등 관계형 데이터베이스를 쉽게 다룰수 있게 도와주는 라이브러리이다. Sequelize는 대표적인 node.js의 ORM(Object Relational Mapping)이다.
ORM이란?
2020/09/28 - [학습노트/기초지식] - [ORM] Object Relational Mapping이란?
위에 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) {
// 쿼리 실행 에러
});
'학습노트 > 기초지식' 카테고리의 다른 글
[Express] express와 사용방법 (0) | 2020.10.08 |
---|---|
[axios] axios와 사용법 (0) | 2020.10.05 |
[MySQL2] MySQL과 MySQL2의 차이점 (0) | 2020.09.29 |
[WEB API] Web API란? (REST, RESTful, URL, URI, HTTP 응답 코드) (0) | 2020.09.28 |
[ORM] Object Relational Mapping이란? (0) | 2020.09.28 |