react와 express 서버 연동 익히기 5편 -sequelize로 테이블 생성하기-

1. 테이블 생성하기

 

models/의 js파일들이 테이블 역할을 하게 된다.

 

이곳에 teacher.js를 생성하고 다음 코드를 작성

 

const { DataTypes } = require("sequelize")

module.exports = (sequelize, DataTypes) => {
    return sequelize.define(
        'teacher', //테이블 이름을 지정
        {
            name: {
                type:DataTypes.STRING(50),
                allowNull : true
            },
        },
        {
            charset: 'utf8',
            collate: 'utf8_general_ci',
            timestamps: false,
        }
    )
}

 

 

여기서 다음 name부분은 teacher 테이블의 column 역할을 한다

 

{
    name: {
        type:DataTypes.STRING(50),
        allowNull : true
    },
},

 

type은 데이터 타입을 지정해주며, STRING은 CHAR, VARCHAR과 동일하고 괄호로 범위를 지정

 

즉 위 칼럼은 teacher의 name 컬럼이 String의 길이 50까지 가질 수 있다는 뜻이다.

 

그리고 sequelize는 컬럼의 id를 지정하지 않아도 생성되면 알아서 id를 부여한다

 

 

2. js파일을 sequelize에 추가하기

 

새로 만든 teacher.js를 sequelize에 추가

 

index.js 파일에 다음 코드를 추가

 

 

const db = {}으로 생성한 변수에

 

db.Teacher이라는 속성에 teacher.js 파일의 정보를 넣어주는 것이

 

 

3. 생성된 테이블 확인

 

backend를  npm start로 시작해보고, mysql workbench에서 table을 확인해본다.

 

 

 

4. 테이블 관계 만드는법

 

MySQL은 관계형 데이터베이스

 

각각 테이블들이 독립되어 있는 형태가 아닌, 서로 관계가 연결되어 있는 새로운 테이블을 형성

 

예를 들어 강사들에 대한 테이블, 강의에 대한 테이블이 있다고 해보자.

 

강의에 대한 스케줄을 짜고 싶을때,

 

한 강사당, 하나의 강의에만 배정되는 1대1 관계

 

한 강사당, 여러 강의들이 배정될 수 있는 1 대 다 관계

 

여러 명의 강사들이 여러개의 강의에 배정되는 다대다 관계

 

이런 정보들을 모아서 강의표라는 테이블을 생성하고 싶다면..

 

강의표에 들어갈 정보들은 강사들의 이름, 강사가 배정된 수업에 대한 정보로 테이블을 만들어야 한다.

 

강의에 대한 정보를 담을 테이블 class.js를 models 폴더내에 생성

 

//models/class.js

module.exports = (sequelize, DataTypes) => {
    return sequelize.define(
        'class',
        {
            className: {
                type: DataTypes.STRING(50),
                allowNull : true,
            }
        },
        {
            charset: 'utf8',
            collate: 'utf8_general_ci',
            timestamps: false,
        }
    )
}

 

index.js에서 db 정보에 위 js파일을 넣어준다.

 

 

실행해보고, mysql workbench에 들어가있는지 확인해본다.

 

 

 

4-1) 1대1 관계 만들기

 

1대1 관계는 두 테이블이 오직 하나의 foreign key로 연결된 관계

 

한명의 강사가 하나의 강의만 배정받는 것이다.

 

index.js에 다음과 같은 코드를 추가하면 된다.

 

 

hasOne은 1대1 방식을 지정하는 메소드

 

괄호 안에 들어간 Class는 target모델이고, Teacher은 source모델이다.

 

source모델이 target모델에 foreign key를 제공

 

소스가 목표한테 키를 주는거

 

실제로 실행해보면...

 

 

 

혹시나 추가가 안된다면, drop table teachers, drop table classes로 테이블 삭제하고,

 

다시 실행해본다

 

 

4-2) 1대다 관계

 

2개의 테이블이 2개의 foreign key로 이루어진 관계

 

1명의 강사가 여러개의 강의에 배정받는 경우이다.

 

models/index.js에 다음 코드를 추가

 

//1대 다 관계
db.Teacher.hasMany(db.Class, {
    foreignKey: 'teacher_id',
    sourceKey: 'id',
})

db.Class.belongsTo(db.Teacher, {
    foreignKey: 'teacher_id',
    targetKey: 'id'
})

 

hasMany는 1대다 방식을 지정하는 메소드

 

이제는 foreignkey와 source key를 각각 지정

 

'Teacher' 테이블의 id값을 teacher_id라는 이름을 가진 foreign key로 전달해준다는 의미

 

belongsTo는 source 모델에 target 모델의 foreign key를 전달해서, 일방향성이 아닌 양방향성 관계를 나타낸다.

 

 

4-3) 다대다 관계

 

두개의 테이블이 여러개의 foreign key로 이루어지는 관계

 

models/index.js에 다음 코드를 추가

 

//다대다 관계
db.Teacher.belongsToMany(db.Class, {
    through: 'schedule',
    foreignKey: 'teacher_id'
})

db.Class.belongsToMany(db.Teacher, {
    through: 'schedule',
    foreignKey: 'class_id',
})

 

실제로 실행해보면...

 

 

 

다대다 관계를 지정하면, through로 지정한 새로운 테이블이 나온다.

 

그 테이블에서 두개의 테이블의 foreignKey로 이루어진 두개의 column이 생성

 

위 결과에서 through로 들어간 schedule이라는 테이블이 생성

 

Teacher 테이블에서 전달된 'teacher_id'와 'Class' 테이블에서 전달된 'class_id' 로 이루어진 column이 생성

 

 

참조

 

React로 블로그 만들기 06 : RDS(Mysql) 연동 2-2 (Sequelize : 테이블 생성 및 관계 형성하기) : 네이버 블로그 (naver.com)

 

React로 블로그 만들기 06 : RDS(Mysql) 연동 2-2 (Sequelize : 테이블 생성 및 관계 형성하기)

저번 글(React로 블로그 만들기 05) 에서 Sequelize에 RDS 정보를 기입하고 서버와 연동하는 방법을 ...

blog.naver.com

 

 

https://victorydntmd.tistory.com/27

 

 

TAGS.

Comments