-
[first project] sequelize로 데이터베이스 다루는 법project 2022. 4. 10. 08:50반응형
사용하고자 하는 백엔드 폴더에(e.g. /server) sequelize를 설치했다는 가정 하에 진행한다.
초기화 작업
sequelize init
초기화를 진행하면 아래와 같은 폴더와 파일들이 생성된다.
. |-- README.md |-- config | `-- config.json |-- migrations |-- models | `-- index.js |-- package.json |-- seeders `-- yarn.lock
- config : 데이터베이스 설정 파일, 사용자 이름, DB 이름, 비밀번호 등의 정보
- migrations : git과 비슷하게, 데이터베이스 변화하는 과정들을 추적해나가는 정보로, 실제 데이터베이스에 반영할 수도 있고 변화를 취소할 수도 있다.
- models : 데이터베이스 각 테이블의 정보 및 필드타입을 정의하고 하나의 객체로 모은다.
- seeders : 테이블에 기본 데이터를 넣고 싶은 경우에 사용한다.
이제 각 폴더 및 파일들에 대해 살펴봅시다.
우선 mysql에 접속해 데이터베이스를 생성하고 선택한다. 이 과정에 대한 정보를 config.json에서 수정하면 된다.
mysql -u root -p // 입력 후 비밀번호 입력
create database testDB; use testDB;
config.json의 파일들 중 development, test, production 모두 수정해준다. development의 수정 예시
"development": { "username": "root", "password": "root", "database": "testDB", "host": "127.0.0.1", "dialect": "mysql", "operatorsAliases": false }
모델 생성 후 데이터베이스에 반영하기
sequelize CLI를 통해 모델을 생성할 수 있고 마이그레이션을 통해 실제 데이터베이스에 반영가능하다.
User라는 모델을 생성해서 진행한다.sequelize model:generate --name User --attributes user_id:integer,user_name:string
이 명령어를 실행하면 2개의 파일이 생성된다.
// models/user.js 'use strict'; module.exports = (sequelize, DataTypes) => { const User = sequelize.define('User', { user_id: DataTypes.INTEGER, user_name: DataTypes.STRING }, {}); User.associate = function(models) { // associations can be defined here // 모델에 있는 필드들의 타입을 정의하고 각 모델간의 관계를 설정하는 부분 }; return User; };
// migrations/[타임스탬프]-create-user.js 'use strict'; module.exports = { up: (queryInterface, Sequelize) => { return queryInterface.createTable('Users', { id: { allowNull: false, autoIncrement: true, primaryKey: true, type: Sequelize.INTEGER }, user_id: { type: Sequelize.INTEGER }, user_name: { type: Sequelize.STRING }, createdAt: { allowNull: false, type: Sequelize.DATE }, updatedAt: { allowNull: false, type: Sequelize.DATE } }); }, down: (queryInterface, Sequelize) => { return queryInterface.dropTable('Users'); } };
-> 마이그레이션 파일이 생성되고 id , createdAt , updatedAt 필드가 자동으로 생성된다.
여기서 up 프로퍼티는 실제 DB에 적용되는 부분이고 down 은 이 작업을 취소할 때 적용된다.
여기선 user_id 를 primary key로 사용할 것이고 createdAt 과 updatedAt 이 필요없으니 이쪽을 수정하면된다.
(** 단, 이렇게 하면 모델 부분도 primaryKey 를 수정해줘야 하고 timestamps 옵션도 추가해줘야 한다.)// models/user.js 'use strict'; module.exports = (sequelize, DataTypes) => { const User = sequelize.define('User', { user_id: { type: DataTypes.INTEGER, primaryKey: true // <--------- }, user_name: DataTypes.STRING }, { timestamps: false // <--------- }); User.associate = function(models) { // associations can be defined here }; return User; };
완료되었다면 실제 DB에 반영시키면 된다.
sequelize db:migrate
마이그레이션을 진행했다면 MYSQL CLI에서 테이블이 만들어진 것을 확인할 수 있다.
DESC users;
+-----------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+--------------+------+-----+---------+----------------+ | user_id | int | NO | PRI | NULL | auto_increment | | user_name | varchar(255) | NO | | NULL | | +-----------+--------------+------+-----+---------+----------------+
마이그레이션을 취소하고 싶다면 undo만 추가하면 된다!
sequelize db:migrate:undo
CRUD
이제 Users 테이블이 생성되었으니 기본 CRUD를 직접 실행해보는 단계이다.
테스트를 하기 위해 루트에 index.js를 만들고 사용할 것이다.
// index.js 상단에 작성 const models = require("./models");
Create (사용자 생성)
// index.js models.User.create({ user_name: "kimcoding" }).then(_ => console.log("User create!"));
작성 후 DB의 결과
+---------+-----------+ | user_id | user_name | +---------+-----------+ | 1 | kimcoding | +---------+-----------+
Read (사용자 조회)
// index.js models.User.findAll().then(console.log);
콘솔에 찍힌 결과!
Executing (default): SELECT `user_id`, `user_name` FROM `Users` AS `User`; [ User { dataValues: { user_id: 1, user_name: 'kimcoding' }, .... } ]
Update (사용자 수정)
수정할 부분을 먼저 찾고(findOne), 그 다음에 update를 작성한다.
models.User.findOne({ where: { user_name: "kimcoding" }}) .then(user => { if (user) { user.update({ user_name: "parkhacker" }) .then(r => console.log("Data update!")); } });
DB를 확인하면 이름이 바뀐 것을 확인할 수 있다.
+---------+-----------+ | user_id | user_name | +---------+-----------+ | 1 | parkhacker| +---------+-----------+
Delete (사용자 삭제)
models.User.destroy({ where: { user_name: "kimcoding" }}) .then(_ => console.log("Data was deleted!"));
이상 기본적인 사용법과 CRUD 다루기에 대한 설명은 끝!!
반응형'project' 카테고리의 다른 글
[final project] 시작 (feat. 코드스테이츠 여정은 끝나간다) (0) 2022.04.18 [first project] Yourturn 프로젝트 회고 (feat. 코드스테이츠) (0) 2022.04.18 [first project] 협업에서 필요한 데이터베이스 사용법(feat. MYSQL, Sequelize) (0) 2022.04.09 [first project] 팀 내 Git Workflow 정리 (0) 2022.04.09 [first project] 4일차 회고 / 백엔드 기초 환경 세팅 및 DB 구축 2 (0) 2022.04.08