티스토리 뷰

사용자 테이블을 생성해 보자.

사용자는 부서에 속해있는 구조로 하여 부서 테이블과 조인을 한다.

사용자 테이블은 다음과 같다
user

속성명필드명타입기타

pk id int  
부서PK department_id int FK(department.id)
이름 name varchar(100)  
아이디 userid varchar(255) unique, not null
비밀번호 password varchar(500) not null
사용자권한 role varchar(20)  
이메일 email varchar(255)  
전화번호 phone varchar(255)  
비밀번호 변경일 updated_pw_date datetime  
등록일시 created_at datetime  
수정일시 updated_at datetime  
삭제일시 deleted_at datetime  

부서PK(department_id)는 부서테이블(department)의 PK(id)와 FK를 맺고 있다.

사용자 모델 생성

사용자 모델 파일을 생성 한다.

/models/user.js

const Sequelize = require('sequelize');

module.exports = class User extends Sequelize.Model {
  static init(sequelize) {
    return super.init({
      departmentId: {
        type: Sequelize.INTEGER,
      },
      name: {
        type: Sequelize.STRING(100),
      },
      userid: {
        type: Sequelize.STRING(255),
        unique: true,
        allowNull: false,
      },
      password: {
        type: Sequelize.STRING(500),
        allowNull: false,
      },
      role: {
        type: Sequelize.STRING(20),
      },
      email: {
        type: Sequelize.STRING(255),
      },
      phone: {
        type: Sequelize.STRING(255),
      },
      updatedPwDate: {
        type: Sequelize.DATE,
      },
    }, {
      sequelize,
      // tableName: 'tableName', // table명을 수동으로 생성 함
      // freezeTableName: true, // true: table명의 복수형 변환을 막음
      underscored: true, // true: underscored, false: camelCase
      timestamps: true, // createAt, updatedAt
      paranoid: true, // deletedAt
    });
  }

  //static associate(db) {
  //  db.User.belongsTo(db.Department, { foreignKey: { name: 'departmentId', onDelete: 'SET NULL', as: 'Department' } });
  }
};

하단의 assoicate부분에서 Department와의 관계를 설정 하였다.
User.belongsTo(Department의 뜻은 User가 하나의 Department에 속해있다는 뜻이다.

부서모델(Department)에서도 User와의 관계를 설정해 주도록 한다.(나는 이부분 제외했다.)

/models/department.js

...(중간생략)...
  static associate(db) {
    db.Department.hasMany(db.User, { foreignKey: { name: 'departmentId' }, onDelete: 'SET NULL', as: 'Users' });
  }
};

Department.hasMany(User의 뜻은 Department하나에 여러개의 User가 소속될 수 있다는 뜻이다.

즉, User : Department = N : 1의 관계이다.

참고 User와 Department가 서로 관계가 있을때 둘 중 하나만 관계를 써주면 어떻게 되는가?
–> 둘 중 하나만 관계를 써줘도 FK가 맺어진다. 다만, sequelize를 통해 해당 모델을 사용할때 관계를 맺어주지 않으면 join(include기능)을 사용할 수 없다.

Model의 요소는 다음과 같다.

첫번째 요소는 다음과 같이 Table Schema와 매핑되는 정보이다.

type : Data type
allowNull : NOT NULL 조건인지 아닌지 (default: true)
unique : Unique조건인지 아닌지에 대한 옵션. column하나로만 이루어진 unique라면 true/false로 지정한다. 복수개의 column이라면 동일한 문자열을 각 column의 unique속성에 넣어준다.
comment : column에 대한 comment
validate : 각 column에 대한 validation check옵션을 넣어준다.


두번째 요소는 config 옵션이 들어간다. 대표적인 옵션은 이와같다.

timestamps : Sequelize는 테이블을 생성한 후 자동적으로 createdAt, updatedAt column을 생성한다.
Database에 해당 테이블이 언제 생성되었고 가장 최근에 수정된 시간이 언제인지 추적할 수 있도록 해준다. 기능을 끄려면 false로 설정한다.
paranoid : paranoid가 true이면 deletedAt column이 table에 추가된다.
해당 row를 삭제시 실제로 데이터가 삭제되지 않고 deletedAt에 삭제된 날짜가 추가되며 deletedAt에 날짜가 표기된 row는 find작업시 제외된다.
즉 데이터는 삭제되지 않지만 삭제된 효과를 준다.(timestamps 옵션이 true여야만 사용할 수 있다.)
underscored : true면 column이름을 camalCase가 아닌 underscore방식으로 사용한다.
freezeTableName : true면 table 이름의 복수형 생성을 막는다.
tableName : table 이름을 수동으로 생성 한다.
comment : table 에 대한 comment

모델 index 파일 생성

모델을 생성하기 위해 index파일을 생성 한다.

/models/index.js

const { sequelize } = require('./connection');
const User = require('./user');

const db = {};

db.sequelize = sequelize;

// model 생성
db.User = User;

// model init
User.init(sequelize);

// association(관계 생성)
//Department.associate(db);
//User.associate(db);

module.exports = db;

생성된 index파일에 위와 같이 Department를 등록해야 Department모델을 사용할 수 있다.

모델 초기화(= 테이블 생성)

모델을 초기화하면 테이블을 생성할 수 있다.

/app.js

...
const models = require('./models/index');
const logger = require('./lib/logger');
...(중간생략)...

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

// DB 연결 확인 및 table 생성
models.sequelize.authenticate().then(() => {
  logger.info('DB connection success');

  // sequelize sync (table 생성)
  models.sequelize.sync().then(() => {
    logger.info('Sequelize sync success');
  }).catch((err) => {
    logger.error('Sequelize sync error', err);
  });
}).catch((err) => {
  logger.error('DB Connection fail', err);
});
...

다음과 같이 쿼리가 자동으로 생성 된다.

Executing (default): SELECT 1+1 AS result
Executing (default): CREATE TABLE IF NOT EXISTS "departments" ("id"   SERIAL , "name" VARCHAR(50), "code" VARCHAR(50), "description" TEXT, "created_at" TIMESTAMP WITH TIME ZONE NOT NULL, "updated_at" TIMESTAMP WITH TIME ZONE NOT NULL, "deleted_at" TIMESTAMP WITH TIME ZONE, PRIMARY KEY ("id"));
Executing (default): SELECT i.relname AS name, ix.indisprimary AS primary, ix.indisunique AS unique, ix.indkey AS indkey, array_agg(a.attnum) as column_indexes, array_agg(a.attname) AS column_names, pg_get_indexdef(ix.indexrelid) AS definition FROM pg_class t, pg_class i, pg_index ix, pg_attribute a WHERE t.oid = ix.indrelid AND i.oid = ix.indexrelid AND a.attrelid = t.oid AND t.relkind = 'r' and t.relname = 'departments' GROUP BY i.relname, ix.indexrelid, ix.indisprimary, ix.indisunique, ix.indkey ORDER BY i.relname;
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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
글 보관함