[Node.js] #8 MySQL과 Sequelize

✨New Wisdom✨·2020년 7월 26일
12

📗 Nodejs 📗

목록 보기
9/20

이 노트는 "Nodejs 교과서"를 공부하면서 기록되었다.

Sequelize?

사실 나도 작년에 노드 조금 해보긴 했지만 그때는 mongodb를 사용하였고 시퀄라이즈는 처음 들어본다..^^
시퀄라이즈는 nodejs에서 mysql을 쉽게 다룰 수 있도록 도와주는 라이브러리로, ORM(Object-relational Mapping)으로 분류된다. sql 작성법을 모르더라도 데이터베이스 관리가 가능하다.

엥🙄 ORM?
정처기 준비하면서 많이 본 ORM...^^ 간단히 개념을 짚고 넘어가자면...

ORM이란 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것을 말한다. 객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용한다.

즉 여기서 Sequelize는 자바스크립트 객체와 데이터베이스의 릴레이션을 매핑해주는 유용한 도구라는 의미이다! 자바스크립트 구문을 알아서 SQL문으로 변경해준다.

sequelize & mysql2 패키지 설치

$ npm i sequelize mysql2
$ npm i -g sequelize-cli
$ sequelize init

sequelize 커맨드를 사용하기 위해 cli를 전역으로 설치해주고
sequelize init명령어를 호출하면 필요한 파일들과 폴더들을 알아서 설치해준다!

  • config : sequelize를 사용하기 위해 환경을 설정하는 부분이다.
  • models/index.js : Model을 정의하고 관계를 설정하는 부분이다.

🚩 시퀄라이즈 index.js 뜯어보기🔨

생성된 구조를 보면 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 = {}; 
  • 참고로 config파일에는 'development', 'test', 'production' 키 값을 가진 각각의 설정들이 담겨있다!
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);
}
  • 시퀄라이즈 객체에 config 파일에 있는 설정들을 넣어준다.
db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;
  • db 객체에 시퀄라이즈 패키지와 객체를 넣고 모듈로 사용한다.

🚩 시퀄라이즈로 database 만들기

시퀄라이즈만 있으면 sql문 작성 없이도! workbench 없이도!
데이터베이스를 만들 수 있다는 사실.
📃 config.js

{
  "development": {
    "username": "root", 
    "password": null,
    "database": "nodejs", // 생성하고자하는 database명 적어주기
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  ...

우리는 현재 환경변수가 development이니 여기를 고쳐준다.
그리고 명령 프롬프트에 밑의 명령어를 적어주면 'nodejs'라는 데이터베이스가 생성된다.

$ sequelize db:create

🚩 시퀄라이즈로 table 짜기

앞으로 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, // 삭제일 (복구용)
    })
})
  • sequelize.define(객체이름, 테이블정의, 테이블_설정)
  • 참고로 테이블 설정에는 tableName으로 테이블 이름 설정도 가능하다.

그리고 index.js에서 만든 js 파일들을 불러온다.

db.User=require('./user')(sequelize,Sequelize);
db.Comment = require('./comment')(sequelize,Sequelize);

불러온 다음에 바로 시퀄라이즈 인스턴스와 패키지를 넣어줬는데 이는

module.exports=(sequelize, DataTypes) =>{

여기의 매개변수와 이어진다.


🚩 table 내용 채우기

지금까지 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,
    });
  • type : 데이터의 타입을 적어준다.
  • allowNull : Null 값을 허용하는지, 안하는지 여부.
  • unique : 고유의 값을 갖게 하는지.
  • defaultValue : 기본값 설정이다. 여기선 생성 날짜를 입력하지 않으면 현재 시간을 저장하도록 한다.
  • timestamp : createdAt과 updatedAt 컬럼을 자동 생성하고 입력한다.
  • underscored : '_(언더바)'를 허용할건지 말건지.

🚩 시퀄라이즈 관계 설정하기

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'})
  • 1 : 1 관계 : (hasOne, belongsTo)
  • 1 : N 관계 : (haseMany, belongsTo)
  • N : M 관계 : (belongsToMany)

🚩 시퀄라이즈로 table 생성하기

자! 그럼 이제 테이블이 만들어졌나?👀
아니다.
테이블의 구조를 짰을 뿐, 테이블은 아직 생성되지 않았다.
테이블을 생성하기 위해선 app.js를 건들여줘야한다.
서버가 우주선🚀이라고 한다면,
app.js 우주선의 중앙 통제실🚨이다.
우리가 지금까지 작업한 db 모듈은 단지 우주선의 부품🧱일 뿐..
이제 조립을 할 차례이다!

📃 app.js

var {sequelize} = require('../models/index')

var app = express();
sequelize.sync();

이렇게 하면 서버가 실행될 때 테이블이 생성된다.
그 전에 config.js에 development 환경변수에

"operatorAliases":false

를 추가해줘야지 에러가 안난다고 한다.

profile
🚛 블로그 이사합니다 https://newwisdom.tistory.com/

0개의 댓글