Node.js/Node.js 곡뢀

8.3 Sequelize foreignKey μ§€μ •ν•˜κΈ°(cascade 적용)

λŒ•λŒ•μ΄λ°œπŸΎ 2018. 9. 27. 17:28



κ°„λ§Œμ— Sequelizeλ₯Ό μ—…λ°μ΄νŠΈν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ§€λ‚œλ²ˆμ—λŠ” ν…Œμ΄λΈ” μ •μ˜κΉŒμ§€λ§Œ ν•΄λ³΄μ•˜λŠ”λ° ν…Œμ΄λΈ” μ •μ˜ 쀑 μ™Έλž˜ν‚€μ— κ΄€ν•œ κ±Έ ν¬μŠ€νŒ… ν•˜λ €κ³  ν•©λ‹ˆλ‹€. μ•„λ¬΄λŸ° 관계가 μ—†λŠ” 독립적인 ν…Œμ΄λΈ”μ„ μ •μ˜ν•˜λŠ”κ±΄ λ¬΄μ˜λ―Έν•œ κ²½μš°κ°€ λ§ŽκΈ°λ•Œλ¬Έμ— μ΄λΆ€λΆ„을 κ³΅λΆ€ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ™Έλž˜ν‚€μ˜ μ •μ˜μ™€ 같은 μžμ„Έν•œ κ°œλ…μ€ μƒλž΅ν•˜κ³  λ„˜μ–΄κ°€κ² μŠ΅λ‹ˆλ‹€.




일단 제 ν…Œμ΄λΈ”μ˜ μ •μ˜λŠ” μ΄λ ‡κ²Œ λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€.


일단 ν…Œμ΄λΈ” μ •μ˜λ₯Ό ν•œ jsνŒŒμΌμ„ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.


[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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
var models = require('../models');
module.exports = function (sequelize, DataTypes) {
  const user = sequelize.define('User', {
      name: {
          field: 'name'
          type: DataTypes.STRING(20), 
          allowNull:false
      },
      nick: {
          field: 'nick'
          type: DataTypes.STRING(20), 
          allowNull:false
      },
      user_id: {
          field: 'user_id'
          type: DataTypes.STRING(50), 
          allowNull: false,
          unique: true
      },
      password: {
          field: 'password'
          type: DataTypes.STRING(30), 
          allowNull:false
      },
      }, {
    // don't use camelcase for automatically added attributes but underscore style
    // so updatedAt will be updated_at
    charset: 'utf8',
    collate: 'utf8_unicode_ci',
    underscored: true,
 
    // disable the modification of tablenames; By default, sequelize will automatically
    // transform all passed model names first parameter of define) into plural.
    // if you don't want that, set the following
    freezeTableName: true,
 
    // define the table's name
    tableName: 'user'
    });
    user.associate = function(models) {
        models.User.hasMany(models.Code, {
            foreignKey: 'fk_userId',
            onDelete: 'cascade'
        });
    };
    return user;
};
 
cs



[code.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
module.exports = function (sequelize, DataTypes) {
  const code = sequelize.define('Code', {
      title: {
          field: 'title'
          type: DataTypes.STRING(10), 
          allowNull: false 
      },
      code: {
          field: 'code'
          type: DataTypes.STRING(100), 
          allowNull: false 
      },
  }, {
    // don't use camelcase for automatically added attributes but underscore style
    // so updatedAt will be updated_at
    underscored: true,
 
    // disable the modification of tablenames; By default, sequelize will automatically
    // transform all passed model names (first parameter of define) into plural.
    // if you don't want that, set the following
    freezeTableName: true,
 
    // define the table's name
    tableName: 'code'
  });
    return code;
};
 
cs


두 ν…Œμ΄λΈ” μ •μ˜λ¬Έμ„ 보면 κ΅¬μ‘°λŠ” 거의 λΉ„μŠ·ν•œλ° user ν…Œμ΄λΈ” ν•˜λ‹¨μ— 


1
2
3
4
5
6
user.associate = function(models) {
    models.User.hasMany(models.Code, {
        foreignKey: 'fk_userId',
        onDelete: 'cascade'
    });
};
cs


이와같이 μž‘μ„±λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ 되면 codeν…Œμ΄λΈ”μ— fk_userId λΌλŠ” μƒˆλ‘œμš΄ ν•„λ“œκ°€ μƒκΉλ‹ˆλ‹€. fk_userId λΌλŠ” ν•„λ“œλŠ” userν…Œμ΄λΈ”μ˜ primary key 와 λ™μΌν•œ 속성을 κ°€μ§€λŠ” ν•„λ“œλ‘œ μ •μ˜λ˜λ©°, μ—¬κΈ°μ„œλŠ” userν…Œμ΄λΈ”μ˜ idν•„λ“œλ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€. onDelete λΌλŠ”κ²ƒμ€ user ν…Œμ΄λΈ”μ˜ idν•„λ“œ 값이 μ‚­μ œλ˜μ—ˆμ„ λ•Œ code ν…Œμ΄λΈ”μ—μ„œ fk_userId ν•„λ“œκ°€ λ™μΌν•œ id값을 가리킀고 μžˆλŠ” 데이터듀은 μΌκ΄„μ μœΌλ‘œ μ‚­μ œκ°€ λ©λ‹ˆλ‹€. 



예λ₯Όλ“€λ©΄ AλΌλŠ” νšŒμ›μ΄ 글을 3개 μ»λŠ”λ° AλΌλŠ” νšŒμ›μ΄ νšŒμ›νƒˆν‡΄λ₯Ό ν•˜κ²Œ λœλ‹€λ©΄ Aκ°€ μ“΄ 글은 λ‹€ μ§€μ›Œμ Έμ•Ό ν•˜λŠ” κ²ƒμ²˜λŸΌ 말이죠.


그림으둜 ν‘œν˜„ν•΄λ³΄μžλ©΄ 이런 μƒνƒœμž…λ‹ˆλ‹€.






sql의 delete 문을 μ¨λ³΄κ² μŠ΅λ‹ˆλ‹€.



id κ°€ 2인 userν…Œμ΄λΈ”μ˜ 데이터 ν•œ 행을 μ‚­μ œν–ˆλ”λ‹ˆ code ν…Œμ΄λΈ”μ— μžˆλŠ” 데이터듀이 λͺ¨λ‘ μ‚­μ œκ°€ 된 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.code ν…Œμ΄λΈ”μ— 있던 데이터듀은 λͺ¨λ‘ userν…Œμ΄λΈ”μ˜ idκ°€ 2인 μ‚¬μš©μžλ₯Ό 가리킀고 있던 λ°μ΄ν„°μ˜€λ˜ 것이죠.



μ§€κΈˆκΉŒμ§€λŠ” ν…Œμ΄λΈ” μ •μ˜λ§Œ jsνŒŒμΌμ„ μ΄μš©ν•΄ κ΅¬ν˜„ν•˜κ³  데이터 μ‚½μž…μ΄λ‚˜ μ‚­μ œλŠ” SQL문을 톡해 μ‹€μŠ΅ν•˜μ˜€μŠ΅λ‹ˆλ‹€. ν…Œμ΄λΈ” μ •μ˜λΆ€λΆ„μ΄ μ–ΌμΆ” μ •λ¦¬λ˜λ©΄ μ΄ν›„μ—λŠ” λ°μ΄ν„°μ‘°μž‘μ–΄ (INSERT, UPDATE, DELETE) 와 같은 문법도 js둜 κ΅¬ν˜„ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.