우리가 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
'개발이야기' 카테고리의 다른 글
[TIL]30. SQL 제약조건 (0) | 2023.11.29 |
---|---|
[TIL]29. Node 환경에서 AWS S3에 이미지 업로드 (0) | 2023.11.29 |
[TIL]27.타입스크립트 Type Predicate (0) | 2023.11.21 |
[TIL]26.타입스크립트 Type,Interface (0) | 2023.11.20 |
[TIL]25.bcrypt로 암호화를 해보자! (0) | 2023.11.16 |