티스토리 뷰

1. 이번 목표:
    Sequelize_relation (1:1, 1:N, M:N) 테이블 간 관계에 대해 알아보자!

 

2. 배운 내용 요약

1:1 관계 (One-to-One)

1:1 관계는 두 테이블 간의 각 행이 서로 하나씩 연결되는 경우
const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize('sqlite::memory:');

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

const Profile = sequelize.define('Profile', {
  bio: DataTypes.STRING,
});

// 1:1 관계 설정
// User가 Profile을 소유한다
User.hasOne(Profile, { foreignKey: 'userId' });
// Profile이 User에 속한다
Profile.belongsTo(User, { foreignKey: 'userId' });

(async () => {
  await sequelize.sync({ force: true });
  console.log("Database synced!");
})();

 

 

1:N 관계 (One-to-Many)

1:N 관계는 한 테이블의 행이 다른 테이블의 여러 행과 연결되는 경우
const User = sequelize.define('User', {
  name: DataTypes.STRING,
});

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

// 1:N 관계 설정
// User가 여러 Post를 가질 수 있는 관계
User.hasMany(Post, { foreignKey: 'userId' });
// Post가 특정 User에 속한다는 관계
Post.belongsTo(User, { foreignKey: 'userId' });

(async () => {
  await sequelize.sync({ force: true });
  console.log("Database synced!");
})();

 

M:N 관계 (Many-to-Many)

M:N 관계는 두 테이블 간에 서로 여러 행이 연결될 수 있는 경우입니다. 중간 테이블(Join Table)이 필요
const Student = sequelize.define('Student', {
  name: DataTypes.STRING,
});

const Course = sequelize.define('Course', {
  title: DataTypes.STRING,
});

// 중간 테이블 자동 생성
// 중간 테이블 StudentCourses를 통해 다대다 관계 설정
Student.belongsToMany(Course, { through: 'StudentCourses' });
Course.belongsToMany(Student, { through: 'StudentCourses' });

(async () => {
  await sequelize.sync({ force: true });
  console.log("Database synced!");
})();

 

관계 활용

관계를 설정한 뒤, Sequelize는 관련 메서드들을 자동으로 생성한다.
hasOne/hasMany: get, set, create
belongsTo: get, set, create
belongsToMany: add, remove, get, set
(async () => {
  const user = await User.create({ name: 'Alice' });
  const profile = await Profile.create({ bio: 'Developer', userId: user.id });

  const post = await Post.create({ title: 'My First Post', content: 'Hello World', userId: user.id });

  const student = await Student.create({ name: 'John' });
  const course = await Course.create({ title: 'Mathematics' });

  await student.addCourse(course);

  console.log(await student.getCourses()); // 학생이 수강한 강의 조회
})();

 

 

3. 회고

더보기

MySQL은 SQL 쿼리를 직접 작성하여 데이터를 처리할 수 있고, 성능이 뛰어나고 세밀한 제어가 가능하지만, 복잡한 쿼리 작성 시 가독성이 떨어지고 생산성이 낮을 수 있다고 한다. 반면, Sequelize는 JavaScript 환경에서 ORM을 통해 데이터베이스 작업을 추상화하여 코드의 가독성과 유지보수성을 높이고 빠른 개발을 지원하지만, 복잡한 쿼리에서 성능 저하나 제한이 있을 수 있다고 한다. MySQL은 데이터베이스 설계와 쿼리에 익숙한 개발자에게 적합하며, Sequelize는 빠른 개발과 유지보수성이 중요한 프로젝트에서 유용하다고 하는데, 솔직히 엄청난 join을 해본 적이 없기 때문에 나는 MySQL이 더 나은지, Sequelize가 더 나은지 판단을 할 수가 없을 것 같다. 그저 내가 회사를 다닐 때 MySQL을 사용한 경우를 매우 많이 봐서인지 나에게는 MySQL이 더 익숙하게 느껴질 뿐이다.

그치만 MySQL이나 Sequelize나 둘 다 딱 보자마자 어떠한 쿼리를 작성한 것인지 한 눈에 잘 들어온다는 것이 장점인 것 같다. 영어를 어느정도 기본적으로 할 줄 알면 이 쿼리가 무슨 뜻인지, 어떠한 테이블을 생성했고 어떤 관계에 있는지 이해할 수 있다는 것은 SQL에 있어서 매우 좋은 점이지만, RDBMS마다 (예를들어 오라클, MySQL 등) 문법이 조금씩 다른 것은 조금 짜증나는 점인 것 같다. 그래도 여러 번 많이 보며 익숙해지는 것만이 방법이겠지 하는 마음으로 많이 보고 많이 익혀야겠다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함