티스토리 뷰
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 등) 문법이 조금씩 다른 것은 조금 짜증나는 점인 것 같다. 그래도 여러 번 많이 보며 익숙해지는 것만이 방법이겠지 하는 마음으로 많이 보고 많이 익혀야겠다.
'SeSAC' 카테고리의 다른 글
| [새싹x코딩온] 웹 개발자 부트캠프 과정 8주차 회고 | 1차 프로젝트 1주차 (0) | 2024.12.22 |
|---|---|
| [새싹x코딩온] 웹 개발자 부트캠프 과정 7주차 회고(2) | jwt, 비밀번호 암호화/복호화 (0) | 2024.12.13 |
| [새싹x코딩온] 웹 개발자 부트캠프 과정 6주차 회고(2) | Sequelize (1) | 2024.12.06 |
| [새싹x코딩온] 웹 개발자 부트캠프 과정 6주차 회고(1) | MVC 패턴과 MYSQL 연결 (0) | 2024.12.04 |
| [새싹x코딩온] 웹 개발자 부트캠프 과정 5주차 회고(2) | SQL, MVC 패턴의 이해 (1) | 2024.11.27 |
