-
Node.js에서 ORM 사용하기 (sequelize 기본 설정 하기)Node 2023. 3. 23. 23:09
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
'Node' 카테고리의 다른 글
OAuth2.0에 대해서 알아보기 (with node.js) (0) 2023.04.07 http 통신 request의 query, params, body (with express) (0) 2023.03.25 patch-package 사용하여 노드 모듈 수정하기 (1) 2023.03.13 간단하게 노드 서버에서 로그 기록하기 (morgan 사용하기) (0) 2023.03.10 Node.js 의 Crypto - Cipher, Decipher 사용하기 (0) 2023.02.09