본문 바로가기

Database/Sequelize

시퀄라이즈 관계 설정과 join해서 불러오는 방법 (Associations, Eager Loading)

시퀄라이즈에서 일대일, 일대다, 다대다 관계를 설정하는 방법을 다룬다.

 

const A = sequelize.define('A', /* ... */);

const B = sequelize.define('B', /* ... */);

 

A.hasOne(B);

B.belongsTo(A);

 

위 두 메소드를 호출하면 시퀄라이즈는 자동으로 적당한 테이블에 foreign 칼럼을 생성해준다.

'다' 관계를 설정해주는 아래의 메소드들도 있다.

 

A.hasMany(B);

A.belongsToMany(B, { through: 'C' }); // A와 B의 다대다 관계 설정을 위해 C 테이블을 자동으로 생성해주기까지 한다.

 

1. 일대일

 

관계 설정은 보통 패어로 이뤄진다.

그래야 각 테이블에 해당하는 두 인스턴스가 서로의 관계를 알고

각 인스턴스에서 다른 인스턴스까지도 불러올 수 있는 메소드를 호출할 수 있다.

하나만 설정해주면 한쪽에서만 호출할 수 있다.

 

Foo.hasOne(Bar);

Bar.belongsTo(Foo);

 

위와 같이 두 번째 인자에 아무 옵션도 넣어주지 않으면

시퀄라이즈는 이름을 추론해서 자동으로 Bar 테이블에 foreign 칼럼을 fooId로 설정한다.

칼럼의 이름을 다르게 하고 싶다면 매뉴얼을 참고하자.

Bar.sync();를 호출하면 다른 칼럼들과 함께 데이터베이스에도 생성된다.

 

2. 일대다

 

일대다 관계는 다음과 같이한다.

작동원리는 위와 동일하다.

 

Team.hasMany(Player);

Player.belongsTo(Team);

 

3. 다대다

 

기본적으로는 다음과 같이 구현한다.

 

const Movie = sequelize.define('Movie', { name: DataTypes.STRING });

const Actor = sequelize.define('Actor', { name: DataTypes.STRING });

 

Movie.belongsToMany(Actor, { through: 'ActorMovies' });

Actor.belongsToMany(Movie, { through: 'ActorMovies' });

 

through 속성에 넣어준 string 값에 따라서

시퀄라이즈는 자동으로 ActorMovies라는 모델을 생성한다.

ActorMovies는 다대다 관계를 이어주는 테이블이다.

 

https://sequelize.org/master/manual/assocs.html

 

4. Join해서 불러오는 방법

 

const User = sequelize.define('user', { name: DataTypes.STRING }, { timestamps: false });

const Task = sequelize.define('task', { name: DataTypes.STRING }, { timestamps: false });

const Tool = sequelize.define('tool', {

    name: DataTypes.STRING,

    size: DataTypes.STRING

}, { timestamps: false });

User.hasMany(Task);

Task.belongsTo(User);

User.hasMany(Tool, { as: 'Instruments' });

 

const tasks = await Task.findAll({ include: User });

 

findAll이든 findOne이든 위와 같이 include 속성을 이용해서 join 할 수 있다.

Task 테이블의 userId에 해당하는 User 테이블의 row를 가져온다.

 

[{

    "name": "A Task",

    "id": 1,

    "userId": 1,

    "user": {

        "name": "John Doe",

        "id": 1

    }

}]

 

'Database > Sequelize' 카테고리의 다른 글

시퀄라이즈 모델 (Model Basics)  (0) 2020.05.22
시퀄라이즈 시작 (Getting Started)  (0) 2020.05.22