Node.js에서 ORM 사용하기 (sequelize 기본 설정 하기)
ORM, Object-Relational Mapping 은 model을 기술하는 도구이다.
ORM을 통하여 SQL query문을 직접 작성하지 않고, 프로그래밍 언어를 통해서 Model에 접근할 수 있다.
이렇게, 프로그래밍 언어의 관점에서 Model에 접근할 수 있는 까닭은, ORM이 대신 프로그래밍 언어를 SQL query문으로 변환해주기 때문이다.
🏁 데이터베이스와 프로그래밍 언어 사이의 개념의 간극을 좁힌다.ORM은 entity나 record를 객체나 클래스를 다루듯이 접근할 수 있게 한다.
🍙 ORM을 통해서 객체에서의 각 속성은 데이터베이스에서 필드를 의미하게 된다.
각 언어마다 사용할 수 있는 ORM API가 있다.
- 자바에서는 JDBC(Java Database Connectivity)
- 자바스크립트(Node.js)에서는 sequelize
- 파이썬에서는 SQLAlchemy나 장고 내부의 ORM이 있다.
🥠 이러한 ORM은 여러가지 RDBMS를 지원하는데, 단순하게 어뎁터 설정만 바꾸면 ORM은 같은 프로그래밍 언어 코드를 각 DB에 알맞은 query문으로 변형시켜준다.
🍧 즉, 사용하는 데이터베이스가 중간에 바뀌어도 어뎁터 설정만 바꾸면 기존의 코드를 그대로 사용할 수 있다.
자바스크립트에서는 대표적인 ORM으로 Sequelize, TypeORM, Prisma가 있다.
😄 그중에서 sequelize를 한 번 사용해보기로 하였다.
🥡 sequelize의 특징
- sequelize은 PostgreSQL, MySQL, MariaDB, SQLite, MS SQL Server 등의 RDBMS를 지원한다.
- 사용하고자 하는 RDBMS의 어뎁터를 사용하면, 호환성 문제는 고려하지 않아도 된다.
- join table을 구현하기 위해서 Association을 고려할 수 있다.
🧉 HasOne, Belongsto, HasMany와 BelongsToMany 와 같은 매소드를 사용하여 1:N, M:N Mapping을 할 수 있다. - 데이터베이스의 롤백과 커밋을 위해서 Transaction을 정의한다.
🍵 일련의 작업 단위로 이루어져야 롤백할 수 있다. 하나하나 쿼리의 조합을 하나의 작업 단위로 보고 에러시 롤백, 성공하면 커밋한다.
sequelize 설치하기 (with mysql)
npm install sequelize sequelize-cli mysql2
설치가 끝나면, 다음과 같은 명령어로 기본 설정을 할 수 있다.
sequelize-cli가 설치되어있어야 sequelize 명령어를 사용할 수 있다.
npx sequelize init
해당 명령어를 실행하면 config, migrations, models, seeders 폴더가 새로 생긴 것을 확인할 수 있다.
config 폴더 내부에 config.json 파일이 있는데 development, test, production 각각의 환경에서 사용할 db에 대한 설정을 확인할 수 있다.
설치한 데이터베이스의 드라이버로 연결되므로, 여기에서는 mysql과 연결되어 있는 것을 확인할 수 있다.
사용할 db 계정과 비밀번호, 데이터베이스의 이름을 수정하자.
{
"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"
}
}
해당 이름의 db가 없다는 에러 메세지가 나타나면 다음과 같은 명령어로 db를 생성할 수 있다.
npx sequelize db:create
이제 models 폴더 내부에 테이블을 정의할 수 있다.
예시로 user.js 파일을 만들어보자.
module.exports = (sequelize, DataTypes) => {
const User = sequelize.define("user", {
name: DataTypes.TEXT,
favoriteColor: {
type: DataTypes.TEXT,
defaultValue: 'green'
},
age: DataTypes.INTEGER,
cash: DataTypes.INTEGER
});
User.associate = (db) => {
// 이곳에서 데이터간의 관계를 정의할 수 있다.
// ex. db.User.hasMany(db.Post);
};
return User;
};
그리고 다음과 같이 프로젝트 최상위 폴더에 index.js를 만들고 node index.js로 이를 실행한다.
const db = require("./models");
db.sequelize
.sync()
.then(() => {
console.log("db connected !!");
})
.catch(console.error);
터미널에 db connected !! 메세지를 확인할 수 있고,
mysql에서는 users라는 이름으로 테이블이 생긴 것을 확인할 수 있다.
이제 다음과 같이 db에 접근하여 데이터를 쓰고 가져올 수 있다.
const { user } = require("./models");
const initTest = async () => {
const createdUser = await user.create({
name: "park",
age: 35,
cash: 30000,
});
console.log("createdUser", createdUser);
const findUser = await user.findOne({
where: { name: "park" },
});
console.log("findUser", findUser);
};
initTest();
주의해야할 점은 models의 index로 부터 테이블을 가져와야 한다는 점이다.
models의 index에서 다른 테이블들을 가져온 뒤 실행하여 관계를 연결하고 이를 db 객체에 담아 다시 반환해주기 때문이다.
위의 코드를 실행한 결과를 확인하면, 실제 mysql에 데이터가 쓰여진 것을 확인할 수 있다.
https://sequelize.org/docs/v6/getting-started/
Getting Started | Sequelize
In this tutorial you will learn to make a simple setup of Sequelize.
sequelize.org