티스토리 뷰
사용자 테이블을 생성해 보자.
사용자는 부서에 속해있는 구조로 하여 부서 테이블과 조인을 한다.
사용자 테이블은 다음과 같다
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) | |
이메일 | 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;
'Web > Backend_서버구현하기' 카테고리의 다른 글
로그인을 위한 백엔드 서버_비밀번호 암호화 (0) | 2022.03.24 |
---|---|
로그인을 위한 백엔드 서버_CRUD구조 (0) | 2022.03.24 |
로그인을 위한 백엔드 서버_DB 연동 (0) | 2022.03.24 |
로그인을 위한 백엔드 서버_라이브러리 설치 (0) | 2022.03.24 |
로그인을 위한 백엔드 서버 구현 시작 (0) | 2022.03.24 |
- Total
- Today
- Yesterday
- Unity
- ardity
- three.js
- Python
- 라즈베리파이
- opencv
- emotive eeg
- JacobianMatrices
- sequelize
- docker
- AI
- CNC
- VR
- 유니티플러그인
- MQTT
- StableDiffusion
- node.js
- DeepLeaning
- motor controll
- 유니티
- Arduino
- Java
- Express
- houdini
- RNN
- oculuspro
- colab
- 후디니
- TouchDesigner
- unity 360
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |