이 노트는 "Nodejs 교과서"를 공부하면서 기록되었다.
사실 나도 작년에 노드 조금 해보긴 했지만 그때는 mongodb를 사용하였고 시퀄라이즈는 처음 들어본다..^^
시퀄라이즈는 nodejs에서 mysql을 쉽게 다룰 수 있도록 도와주는 라이브러리로, ORM(Object-relational Mapping)으로 분류된다. sql 작성법을 모르더라도 데이터베이스 관리가 가능하다.
엥🙄 ORM?
정처기 준비하면서 많이 본 ORM...^^ 간단히 개념을 짚고 넘어가자면...
ORM이란 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것을 말한다. 객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용한다.
즉 여기서 Sequelize는 자바스크립트 객체와 데이터베이스의 릴레이션을 매핑해주는 유용한 도구라는 의미이다! 자바스크립트 구문을 알아서 SQL문으로 변경해준다.
$ npm i sequelize mysql2
$ npm i -g sequelize-cli
$ sequelize init
sequelize 커맨드를 사용하기 위해 cli를 전역으로 설치해주고
sequelize init명령어를 호출하면 필요한 파일들과 폴더들을 알아서 설치해준다!
생성된 구조를 보면 model 디렉토리 안에 index.js 파일이 생성되었다.
이는 시퀄라이즈에서 가장 중요한 파일?로 한번 뜯어보자😎
📃 models/index.js
// 환경변수, 실제 배포할 때는 'production'으로 바꿔야한다.
const env = process.env.NODE_ENV || 'development';
// config
const config = require(__dirname + '/../config/config.json')[env];
// db 객체 생성
const db = {};
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);
}
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
시퀄라이즈만 있으면 sql문 작성 없이도! workbench 없이도!
데이터베이스를 만들 수 있다는 사실.
📃 config.js
{
"development": {
"username": "root",
"password": null,
"database": "nodejs", // 생성하고자하는 database명 적어주기
"host": "127.0.0.1",
"dialect": "mysql"
},
...
우리는 현재 환경변수가 development이니 여기를 고쳐준다.
그리고 명령 프롬프트에 밑의 명령어를 적어주면 'nodejs'라는 데이터베이스가 생성된다.
$ sequelize db:create
앞으로 models 폴더 내에서 js 파일로 테이블을 만들 것이다.
📃 사용자 테이블과 댓글 테이블 만들기 위해 user.js와 comment.js 생성
const Sequelize = require('sequelize');
module.exports = ((sequelize,DataTypes)=>{
return sequelize.define('user',{
email:{
type: Sequelize.STRING(40),
allowNull: true,
unique: true,
},
nick:{
type: Sequelize.STRING(15),
allowNull: false,
},
password:{
type: Sequelize.STRING(100),
allowNull: true, // 카카오 로그인은 비번 필요없으니,,
},
prvider :{ // 뭐로 로그인 했는지 : 카카오, 로컬,,
type: Sequelize.STRING(10),
allowNull: false,
defaultValue: 'local',
},
snsId:{
type: Sequelize.STRING(30),
allowNull: true,
},
},{
timestamps:true,
paranoid : true, // 삭제일 (복구용)
})
})
그리고 index.js에서 만든 js 파일들을 불러온다.
db.User=require('./user')(sequelize,Sequelize);
db.Comment = require('./comment')(sequelize,Sequelize);
불러온 다음에 바로 시퀄라이즈 인스턴스와 패키지를 넣어줬는데 이는
module.exports=(sequelize, DataTypes) =>{
여기의 매개변수와 이어진다.
지금까지 user, comment 두 개의 테이블을 만들었다.
이제 이 테이블 안에 속성(column) 값을 채워 넣어야 한다.
짚고 넘어갈 몇가지 개념만 정리해보겠다.
📃 user.js
name:{
type:DataTypes.STRING(20),
allowNull:false,
unique: true,
},
creates_at:{
type:DataTypes.DATE,
allowNull:false,
defaultValue:sequelize.literal('now()'),
}
},{
timestamps:false,
underscored:true,
});
comment 테이블에서 comment 컬럼의 내부는 적어주지 않았다.
그 이유는 user가 바로 comment를 작성한 자가 되기 때문에 여기서 관계가 생기는 것이다!
사용자는 여러개의 댓글을 달 수 있고, 댓글 하나는 한 사용자에게만 속해있다.
그러므로 user와 comment는 1:N의 관계이다.
이는 시퀄라이즈에서도 표현이 가능하다.
db.User.hasMany(db.Comment, {foreignKey:'commeneter', sourceKey:'id'})
db.Comment.belongsTo(db.User,{foreignKey:'commeneter',targetKey:'id'})
자! 그럼 이제 테이블이 만들어졌나?👀
아니다.
테이블의 구조를 짰을 뿐, 테이블은 아직 생성되지 않았다.
테이블을 생성하기 위해선 app.js를 건들여줘야한다.
서버가 우주선🚀이라고 한다면,
app.js 우주선의 중앙 통제실🚨이다.
우리가 지금까지 작업한 db 모듈은 단지 우주선의 부품🧱일 뿐..
이제 조립을 할 차례이다!
📃 app.js
var {sequelize} = require('../models/index')
var app = express();
sequelize.sync();
이렇게 하면 서버가 실행될 때 테이블이 생성된다.
그 전에 config.js에 development 환경변수에
"operatorAliases":false
를 추가해줘야지 에러가 안난다고 한다.