Nodejs - Sequelize (2)

이율곡·2023년 2월 27일
0

Node js

목록 보기
18/26
post-thumbnail

관계형성

관계 형성은 테이블과 테이블의 관계를 정의하는 것이다. MySQL은 RDBMS로 관계지향 데이터베이스이기 때문에 테이블 간의 관계는 굉장히 중요하다.

주요 메서드

  1. belongsTo() : 다른 모델의 외래키를 가지는 모델과 일대일 관계설정
  2. hasOne() : 다른 모델에 대한 일대일 관계 설정
  3. hasMany() : 다른 모델에 대한 다대일 관계 설정
  4. belongsToMany: 다른 모델과 다대다 관계 설정 (연결 모델이 필요)

주요 메서드는 이렇게 네 가지가 존재한다. 이 메서드를 어떻게 활용하는지는 다음의 예로 정리했다.

일대다(1:N) 관계

하나의 테이블의 레코드가 다른 테이블의 여러 레코드와 연결되는 관계이다. 간단한 예로 게시물과 댓글이 일대다의 예가 될 수 있다.

예시

const Post = sequelize.define('post',{
	title: Sequelize.STRING,
    content: Sequelize.STRING
});

const Comment = sequelize.define('comment', {
	text: Sequelize.STRING
});

Post.hasMany(Comment);
Comment.belongsTo(Post);

위의 코드를 설명하면, 우선 Post와 Comment 모델을 정의했다. 그 후 hasMany() 메서드로 일다대 관계를 형성하고, belongsTo() 메서드로 Post 모델의 외래키를 참조했다. 이렇게 관계를 설정하면 Sequelize로 일대다 관계를 형성할 수 있다.

다대일(N:1) 관계

다른 테이블의 여러 레코드가 하나의 테이블 레코드와 연결되는 관계다. 예시로는 여러 개의 게시글을 한 명의 회원에 의해 작성되는 것을 예로 들 수 있다. 이 때 회원이 "다"이고 게시글이 "일"에 속한다.

예시

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

const Post = sequelize.define('post', {
	title: Sequelize.STRING,
    content: Sequelize.STRING,
});

Post.belongsTo(User);
User.hasMany(Post);

다대일 관계는 일대다 관계랑 비슷하다고 볼 수 있다. 하지만 관점에 따라 다르기 때문에 관계를 명확하게 하여 관계를 설정할 때 잘 처리할 필요가 있다.

일대다 관계와 다대일 관계의 차이점

일대다 관계는 하나의 모델이 다른 모델의 여러 개의 인스턴스를 가질 수 있다. 다대일 관계는 다른 모델이 하나의 모델과 관계를 가질 수 있다는 것이 차이점이다.

일대일(1:1) 관계

하나의 테이블 레코드가 다른 테이블 레코드와 하나씩 연결되는 관계다. 예로는 사용자와 고유 인증에 대한 것에 대한 예를 가질 수 있다.

예시

const User = sequelize.define('user', {
	name: Sequelize.STRING,
    email: Sequelize.STRING
});

const UserAuth = sequelize.define('userAuth', {
	name: Sequelize.STRING,
    password: Sequelize.STRING
});

User.hasOne(UserAuth);
UserAuth.belongsTo(User);

사용자와 사용자 인증에 관한 예시이다. 일대일 관계로 사용자 모델이 인증 모델을 갖고 있고 인증 모델은 사용자에 속한다. 이를 통해 User 모델은 getUserAuth() 메서드를 통해 사용자의 인증정보를 가져올 수 있다.

추가 예시

const user = await User.findByPk(name);
const auth = await user.getUserAuth();

이 코드를 통해 User 모델의 인스턴스를 가져오고, 가져온 user 인스턴스를 통해 사용자의 인증정보를 가져왔다. 여기서 반환 타입이 Promise이기 때문에 await 표현식을 사용해서 동기적으로 값을 처리했다.

다대다(N:M) 관계

두 개 이상의 테이블 레코드들이 서로 연결되어 씨는 관계다. 예시로는 학생과 강좌가 될 수 있다.

예시

const Student = sequelize.define('student', {
	name: Sequelize.STRING
});

const Subject = sequelize.define('subject', {
	name: Sequelize.STRING
});

const Enrollment = sequelize.define('enrollment', {});

Student.belongsToMany(Subject, { through: Enrollment });
Subject.belongsToMany(Student, { through: Enrollment });

다대다 관계를 갖은 코드 예시이다. 학생과 강좌 그리고 연결 모델을 만들었다. 그리고 belongsToMany() 메서드를 통해 서로의 모델을 연결하고 through 옵션을 통해 연결 테이블을 지정했다.

정리하기

이번에는 Sequelize로 테이블의 관계 형성을 공부했다. RDBMS에서 가장 중요한 부분이라 집중해서 공부했지만, 여전히 다대일 테이블 같은 경우는 꽤나 헷갈린다. 그래도 이렇게 정리함으로써 어느 정도 익힌 거 같아서 좋다. 다음은 MongoDB를 기반으로 Mongoose 라이브러리를 활용할텐데 이번만큼만 진행되면 괜찮을 것 같다.

profile
음악을 좋아하는 사람이 음악을 만들 듯, 개발을 좋아하게 될 사람이 쓰는 개발이야기

0개의 댓글