Back Ground

Node - [ MySQL ] - 시퀄라이즈(ORM) 이용한 데이터 베이스 세팅 본문

Javascript/Node.js

Node - [ MySQL ] - 시퀄라이즈(ORM) 이용한 데이터 베이스 세팅

Back 2019. 3. 5. 14:18



시퀄라이즈로 데이터베이스를 설정한다.


sequelize

nodejs에서 mysql을 쉽게 다룰 수 있도록 도와주는 라이브러리 이다.
sequelize는 ORM(Object-Relational Mapping)로 분류가 된다.
ORM 은 간단하게 객체와 관계형 데이터베이스의 관계를 매핑 해주는 도구이다. 
sequelize를 사용하면 자바스크립트 코드로 mysql을 제어할 수 있기 때문이다.
출처 : https://medium.com/wasd/node-js%EC%97%90%EC%84%9C-mysql-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-1-b4b69ce7433f






models/user.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
module.export = (sequlize, DataTypes) => (
    sequelize.definde('user',{
        email:{
            type:DataTypes.STRING(40),
            allowNull:false,
            unique:true,
        },
        nick:{
            type:DataTypes.STRING(15),
            allowNull:false,
        },
        password:{
            type:DataTypes.STRING(100),
            allowNull:true,
        },
        provider:{
            type:DataTypes.STRING(10),
            allowNull:false,
            defaultValue:'local',
        },
        snsId:{
            type:DataTypes.STRING(30),
            allowNull:true,
        },
    }, {timestamps: true , paranoid: true,})
);
cs

예제 출처: Node.js 교과서





Model Define

Sequelize에서 Model은 Database공간의 Table의 Schema를 표현하는 수단이다. 

Table Schema에 대응되는 Model을 정의한 이후에 실제로 메모리 공간에 올려 캐쉬하려면 import를 해야된다.

Model에 대한 정의는 Sequelize의 define 메소드를 이용한다


  • timestamps : Sequelize는 테이블을 생성한 후 자동적으로 createdAt, updatedAt column을 생성한다.
    Database에 해당 테이블이 언제 생성되었고 가장 최근에 수정된 시간이 언제인지 추적할 수 있도록 해준다.
    기능을 끄려면 false로 설정한다.

  • paranoid : paranoid가 true이면 deletedAt column이 table에 추가된다.
    해당 row를 삭제시 실제로 데이터가 삭제되지 않고 deletedAt에 삭제된 날짜가 추가되며 deletedAt에 날짜가 표기된 row는 find작업시 제외된다.
    즉 데이터는 삭제되지 않지만 삭제된 효과를 준다. timestamps 옵션이 true여야만 사용할 수 있다.

출처 : http://webframeworks.kr/tutorials/expressjs/expressjs_orm_one/






테이블 옵션으로 timestamps와 paranoid가 true로 주어졌으므로 

createAt, updateAt, deleteAt 컬럼도 생성 된다.





models/post.js

1
2
3
4
5
6
7
8
9
10
11
12
module.export = (sequlize, DataTypes) => (
    sequelize.definde('post',{
        content:{
            type:DataTypes.STRING(140),
            allowNull:false,
        },
        img:{
            type:DataTypes.STRING(200),
            allowNull:true,
        },
    }, {timestamps: true , paranoid: true,})
);
cs


[게시글 모델]

게시글 내용과 이미지 경로를 저장.

게시글 등록자의 아이디를 담은 컬럼은 나중에 관계를 설정할 때 시퀄라이즈가 알아서 생성한다.






models/hashtag.js

1
2
3
4
5
6
7
8
9
module.export = (sequlize, DataTypes) => (
    sequelize.definde('hashtag',{
        title:{
            type:DataTypes.STRING(15),
            allowNull:false,
            unique:true,
        },
    }, {timestamps: true , paranoid: true,})
);
cs


[해시테그 모델]

해시태그 모델은 태그 이름을 저장한다.

해시태그 모델을 따로 두는 것은 나중에 태그로 검색하기 위해서이다.






이렇게 생성한 모델들을 시퀄라이즈에 등록한다.

moduels/index.js에는 시퀄라이즈가 자동으로 생성한 코드들이 들어 있을 것이다.

그것을 다음과 같이 통째로 바꿔준다.









models/index.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
const Sequelize = require('sequelize');
const env = process.env.NODE_ENV || 'development';
const config = require('../config/config')[env];
const db = {};
 
const sequelize = new Sequelize(
  config.database, config.username, config.password, config,
);
 
db.sequelize = sequelize;
db.Sequelize = Sequelize;
db.User = require('./user')(sequelize, Sequelize);
db.Post = require('./post')(sequelize, Sequelize);
db.Hashtag = require('./hashtag')(sequelize, Sequelize);
 
db.User.hasMany(db.Post);
db.Post.belongsTo(db.User);
db.Post.belongsToMany(db.Hashtag, { through: 'PostHashtag' });
db.Hashtag.belongsToMany(db.Post, { through: 'PostHashtag' });
db.User.belongsToMany(db.User, {
  foreignKey: 'followingId',
  as: 'Followers',
  through: 'Follow',
});
db.User.belongsToMany(db.User, {
  foreignKey: 'followerId',
  as: 'Followings',
  through: 'Follow',
});
 
module.exports = db;
 
cs




1
2
db.User.hasMany(db.Post);
db.Post.belongsTo(db.User);
cs

 User모델과 Post모델은 1:N 관계에 있으므로 hasMany와 belongsTo로 연결되어 있다.

시퀄라이즈는 Post모델 userId컬럼을 추가한다.







1
2
db.Post.belongsToMany(db.Hashtag, { through: 'PostHashtag' });
db.Hashtag.belongsToMany(db.Post, { through: 'PostHashtag' });
cs

 

 Post와 Hashtag모델에서 N:M(또든 다대다) 관계가 나옵니다.

게시글 하나는 해시태그를 여러 개 가질 수 없고,

해시태그 하나도 게시글을 여러 개 가질 수 있다. 

따라서 게시글 모델과 해시태그 모델은 N:M 관계에 있다.

시퀄라이즈에서는 N:M(N:1) 관계를 belongsToMany메서드로 정의한다.



N:M 관계에서는 중간에 관계 테이블이 생성된다.

시퀄라이즈가 관계를 분석하여 PostHashtag라는 이름으로 테이블 자동 생성한다.

컬럼 이름은 postId와 hashTagId이다.




Post와 Hashtag 모델의 관계에서 시퀄라이즈는 

post 데이터에는 getHashtags, addHashtags 등의 메서드를 추가하고,

hashtag 데이터에는 getPosts, addPosts등의 메서드를 추가한다.







1
2
3
4
5
6
7
8
9
10
11
12
db.User.belongsToMany(db.User, {
  foreignKey: 'followingId',
  as: 'Followers',
  through: 'Follow',
});
db.User.belongsToMany(db.User, {
  foreignKey: 'followerId',
  as: 'Followings',
  through: 'Follow',
});
 
module.exports = db;
cs

 

 같은 테이블끼리도 N:M관계를 가질 수 있다.

팔로잉 기능도 N:M관계이다.

사용자 한명이 팔로워를 여러 명 가질 수도 있고,

여러 명을 팔로잉할 수도 있다.

User모델과 USer모델 간에 N:M관계가 있는 것이다.









출처 : Node.js 교과서




'Javascript > Node.js' 카테고리의 다른 글

Node - npm 설치 항목 목록 보는법  (0) 2019.03.08
Node - Cluster [ 멀티 스레드 처럼 ]  (1) 2019.03.06
WebPack의 기본 개념  (0) 2019.03.01
Node - Event Loop  (0) 2019.03.01
Node - Express [Router 객체로 라우팅 분리]  (6) 2019.02.27
Comments