...
sequelize-cli 모듈
[sequelize-cli]
- 데이터베이스가 구축되지않더라도, 프로젝트만 받아서 설정하고 서버실행만 하면 알아서 데이터베이스 테이블 생성해주는 라이브러리이다.
- 누군가의 프로젝트를 받아서 빠르게 was환경을 돌릴상황이면 좋은 선택지다.
- 모델 코드 작성 → 자동 create문 변환 → RDB 테이블 생성
[sequelize-auto]
- 데이터베이스를 이미 구축한 상태라면, 쓸모있는 라이브러리다.
- 이미 구축된 데이터베이스 스키마를 바탕으로 orm 모델을 자동으로 생성해준다.
- 힘들게 sql짜고 orm코딩 하는 두번의 번거로움을 없애준다.
- 이미 짜여진 테이블을 기반으로 → 자동으로 모델 코드 생성
sequelize-cli 사용 설정
> npm i sequelize sequelize-cli mysql2
sequelize-cli - 초기 설정
> npx sequelize init
sequelize init 을 하게되면, 몇가지 폴더와, 파일들이 생성된다.
config.json
- DB 연결 정보를 저장
{
"development": {
"username": "test",
"password": "123123",
"database": "nodebird",
"host": "127.0.0.1",
"dialect": "mysql"
},
"test": {
"username": "test",
"password": "123123",
"database": "database_test",
"host": "127.0.0.1",
"dialect": "mysql"
},
"production": {
"username": "test",
"password": "123123",
"database": "database_production",
"host": "127.0.0.1",
"dialect": "mysql"
}
}
sequelize-cli - 데이터베이스 생성
> npx sequelize db:create
db:create CLI 명령을 활용하게 되면 DB스키마를 mysql에서 생성하지 않더라도 명령어 한줄로 생성해줄 수 있다.
config.json에서 설정한 데이터베이스 이름 "nordbird"가 스키마에 자동으로 잘 추가된 것을 확인할 수 있다.
sequelize-cli - 테이블 생성
테이블에 연결할 모델을 작성한다.
user.js
const Sequelize = require('sequelize');
module.exports = class User extends Sequelize.Model {
static init(sequelize) {
return super.init(
{
// 시퀄라이즈는 id 자동 생성 (auto_increament)
email: {
type: Sequelize.STRING(40),
allowNull: true, // null 허용
unique: true, // 중복 비허용
},
nick: {
type: Sequelize.STRING(15),
allowNull: false,
},
password: {
type: Sequelize.STRING(100), // 해시암호화를 할때 문자가 길어지니, 여유있게 용량을 잡아준다.
allowNull: true, // 카카오 같은 api로 로그인할때, 직접 회원가입해서 비밀번호 설정한게 아니니 비번은 null일수도 있다.
},
provider: {
//? 어디로부터 로그인 했는지 정보
type: Sequelize.STRING(10),
allowNull: false,
defaultValue: 'local', // 로컬 / 카카오 / 네이버 / 구글 로그인 을 구분하기 위한 필드
},
snsId: {
//? sns으로 로그인할경우 sns아이디 저장 필드
type: Sequelize.STRING(30),
allowNull: true,
},
},
{
sequelize,
timestamps: true, // createdAt, udaptedAt 자동 생성
underscored: false,
modelName: 'User', // 모델명
tableName: 'users', // 테이블명
paranoid: true, // deletedAt 자동 생성
charset: 'utf8', // 한글 입력 설정
collate: 'utf8_general_ci',
},
);
}
static associate(db) {
/*
* 따로 외래키를 지정하지않으면, 모델명+기본키 컬럼이 생성되서 자동으로 연결된다.
* 즉, User와 id가 합쳐져서 Userid라는 필드가 생겨서 자동연결해준다.
* db.User.hasMany(db.Post, { foreignKey: 'Userid', targetKey: 'id' })
*/
db.User.hasMany(db.Post);
/*
* 팔로워 와 팔로잉 관계
* 잘 생각해보자. 팔로워,팔로잉 정보는 모두 User모델에서 가져오는 정보들이다. 따라서 자기자신을 참조하는 관계가 생겨난다.
* Follow라는 중간테이블을 만들어서 M:N관계를 형성한다.
*/
db.User.belongsToMany(db.User, {
foreignKey: 'followingId', // 팔로잉 당한 사람. 주체 (즉, 유명한 사람. 연예인, 유튜버)
as: 'Followers', // 모델쿼리에서 사용될 필드 별명. sql문의 필드명 as 별명 과 같다.
through: 'Follow',
});
db.User.belongsToMany(db.User, {
foreignKey: 'followerId', // 그 사람을 팔로워 한 사람들
as: 'Followings',
through: 'Follow',
});
}
};
followerId (팔로워를 한 사람) | followingId (팔로잉 당한 사람. 주체.) (즉, 유명한 사람. 연예인, 유튜버) |
1 | 3 |
4 | 3 |
5 | 3 |
2 | 1 |
1 | 2 |
4 | 1 |
- id가 3인 사람은 id가 1,4,5인 사람에게 팔로잉 당했다. 즉, id가 3인 사람은 팔로워 수가 3명.
- id가 1인 사람은 id가 3과 2인 사람을 팔로우 하고 잇다. 즉 id가 1인 사람이 팔로우 한 유튜버가 2명
팔로우
친구를 만드는 행위. 인스타에서 팔로우를 하면 친추 추가를 의미.
팔로워
상대방이 나를 먼저 팔로우 하게되면 팔로워에 숫자가 증가한다. 즉 나를 친구로 추가한 사람이란 의미이다.
팔로잉
내가 먼저 상대방을 팔로우 하게 되면 팔로잉에 숫자가 증가한다. 즉 내가 친구로 추가한 사람이란 의미이다.
post.js
const Sequelize = require('sequelize');
module.exports = class Post extends Sequelize.Model {
static init(sequelize) {
return super.init(
{
content: {
type: Sequelize.STRING(140),
allowNull: false,
},
img: {
type: Sequelize.STRING(200),
allowNull: true,
},
},
{
sequelize,
timestamps: true,
underscored: false,
modelName: 'Post',
tableName: 'posts',
paranoid: false, // 게시글 삭제하면, 휴지통 안거치고 칼삭제
charset: 'utf8mb4', // 이모티콘 가능 설정
collate: 'utf8mb4_general_ci',
},
);
}
static associate(db) {
db.Post.belongsTo(db.User);
db.Post.belongsToMany(db.Hashtag, { through: 'PostHashtag' });
}
};
hashtag.js
const Sequelize = require('sequelize');
module.exports = class Hashtag extends Sequelize.Model {
static init(sequelize) {
return super.init(
{
title: {
type: Sequelize.STRING(15),
allowNull: false,
unique: true,
},
},
{
sequelize,
timestamps: true,
underscored: false,
modelName: 'Hashtag',
tableName: 'hashtags',
paranoid: false,
charset: 'utf8mb4',
collate: 'utf8mb4_general_ci',
},
);
}
static associate(db) {
db.Hashtag.belongsToMany(db.Post, { through: 'PostHashtag' });
}
};
index.js : 모델
- 테이블 연결정의
const Sequelize = require('sequelize');
const env = process.env.NODE_ENV || 'development';
const config = require('../config/config')[env];
//? 모델 모듈
const User = require('./user');
const Post = require('./post');
const Hashtag = require('./hashtag');
const db = {};
const sequelize = new Sequelize(config.database, config.username, config.password, config);
//? db객체에 모델 정보들 넣음
db.sequelize = sequelize;
db.User = User;
db.Post = Post;
db.Hashtag = Hashtag;
//? 모델 - 테이블 연결
User.init(sequelize);
Post.init(sequelize);
Hashtag.init(sequelize);
//? 모델 관계 설정
User.associate(db);
Post.associate(db);
Hashtag.associate(db);
module.exports = db;
sequelize-cli - 데이터베이스 연결
모델을 설정해줬으면, 서버를 실행 시켜 연결하도록 하자.
app.js
//* DB 연결 및 생성
sequelize
.sync({ force: false })
.then(() => {
console.log('데이터 베이스 연결 성공');
})
.catch(err => {
console.error(err);
});
[sequelize.sync 옵션]
- force: true
- 모델을 수정하면, 이를 db에 반영하기 위한 옵션이다.
- 단, 테이블을 지웠다 다시 생성하는 거라서 기존 데이터가 날아간다.
- alter: true
- 기존 데이터를 유지하면서 테이블을 업데이트 할수있다.
- 다만, 필드를 새로 추가할때 필드가 notnull이면 제약조건에 따라 오류가 나는 등 대처를 해야 한다.
- 그냥 워크벤치 들어가서 직접 데이터베이스와 모델을 노가다라도 수정하는것이 더 안전하다.
- 이러한 옵션은 어디까지나 development환경일때만 적용한다.
서버를 실행 시키고 mysql워크벤치에 들어가서 확인해보면, 테이블이 생성되어있고, 외래키 관계도 잘 설정됨을 확인 할 수 있다.
다음은 생성한 테이블의 ERD 이다.
인용한 부분에 있어 만일 누락된 출처가 있다면 반드시 알려주시면 감사하겠습니다
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.