개발이야기

[TIL]28. node sequelize 에서 관계 맺기

무서운승태 2023. 11. 23. 09:04
728x90

우리가 RDB를 사용하다 보면 테이블 간 관계를 맺어서 사용하는 경우가 생긴다. 이 부분을 sequelize에서 사용하려 할 때 저번 과제에서는 상당히 헤매었는데 이번 팀 프로젝트에선 강의를 참고해서 하니 금방 해결했던 것 같다.

 

프로젝트 진행시 ERD를 작성하고 이 ERD를 바탕으로 데이터베이스를 설계한다.

 

 

Migration으로 데이터 베이스를 생성한 경우

마이그레이션 파일내 외래키로 사용할 칼럼에 다음과 같이 선언해주어야 한다.

 userId: {
        type: Sequelize.INTEGER,
        allowNull: false,
        references: {
            model: 'Users',
            key: 'id',
        },
},

references라는 객체 안에 참조할 모델을 명시하고 그 모델의 기본키를 명시해 준다. 그리고 모델 안에도 데이터베이스와 동일하게 관계를 맺어주어야 한다.

 

Posts 모델

 static associate(models) {
    this.belongsTo(models.Users, { as: 'user' });
}

sequelize 명령어로 모델을 생성했다면 해당 모델에 associate 라는 메서드가 있을 것이다. 이곳에 방금 데이터베이스와 동일하게 관계를 맺어 준다. posts는 users에 속하고 하나의 유저가 여러 개의 게시글을 가지고 있기 때문에 1:N 관계이다.

 

Users 모델

  static associate(models) {
    this.hasMany(models.Posts, { foreignKey: 'userId', as: 'posts' });
}

users에도 posts와 관계를 맺어준다. 그리고 외래키로 사용할 컬럼값도 명시해 준다. 이렇게까지 하면 두 테이블 간 관계를 맺은 것이다.

 

사용 예시

  const posts = await Posts.findAll({
        attributes: ['id', 'title', 'content', 'userId', 'createdAt'],
        include: [
            {
                model: Users,
                as: 'user',
                attributes: ['nickname'],
            },
        ],
    });

 

사용할 때 include를 이용하여 사용한다. 다양한 사용법이 있는데 그것은 공식문서를 참고하자.

https://sequelize.org/docs/v6/core-concepts/model-querying-basics/

 

Model Querying - Basics | Sequelize

Sequelize provides various methods to assist querying your database for data.

sequelize.org