TypeORM에서 관계(Relationship)는 두 엔티티 간의 연결을 설정하여 데이터베이스에서 연관된 데이터를 쉽게 조회하고 조작할 수 있도록 합니다. 관계 설정을 통해 객체 지향적으로 데이터베이스의 테이블 간 관계를 표현할 수 있으며, TypeORM은 이 관계를 기반으로 쿼리를 자동 생성하고 관리합니다.
TypeORM에서는 크게 다음 네 가지 종류의 관계를 지원합니다:
- One-to-One (일대일)
- One-to-Many (일대다)
- Many-to-One (다대일)
- Many-to-Many (다대다)
1. One-to-One (일대일) 관계
일대일 관계는 한 엔티티가 다른 하나의 엔티티와 단독으로 연결되는 관계입니다. 예를 들어, 사용자(User)와 프로필(Profile) 사이의 관계에서 사용자는 하나의 프로필을 가지고 있으며, 프로필은 하나의 사용자와만 연결될 수 있습니다.
설정 방법
- @OneToOne(): TypeORM에서 일대일 관계를 설정하는 데 사용됩니다.
- @JoinColumn(): 일대일 관계에서 외래 키를 지정하는 데 사용합니다. 이 데코레이터가 있어야 관계가 지정된 엔티티에 외래 키가 생성됩니다.
예시 코드
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@OneToOne(() => Profile)
@JoinColumn()// User 엔티티에 Profile의 외래 키를 생성
profile: Profile;
}
@Entity()
export class Profile {
@PrimaryGeneratedColumn()
id: number;
@Column()
bio: string;
}
- 여기서 User 엔티티는 **Profile**을 소유하며, **@JoinColumn()**을 통해 User 테이블에 **profileId**라는 외래 키 컬럼이 생성됩니다.
일대일 관계 특징
- 양방향으로 설정할 수 있습니다. 예를 들어 **Profile**에서도 **User**와 연결을 설정할 수 있습니다.
- 기본적으로 한 테이블에만 외래 키가 생성되며, 외래 키를 생성할 엔티티에 **@JoinColumn()**을 추가해야 합니다.
2. One-to-Many (일대다) & Many-to-One (다대일) 관계
일대다와 다대일 관계는 함께 사용됩니다. 예를 들어, **User**와 Post 간의 관계에서 한 사용자는 여러 게시물을 가질 수 있지만, 각 게시물은 단 하나의 사용자에게 속합니다.
- One-to-Many: 한 엔티티가 여러 엔티티와 연결됩니다.
- Many-to-One: 여러 엔티티가 한 엔티티와 연결됩니다.
설정 방법
- @OneToMany(): 여러 개의 엔티티가 관계를 맺을 때 사용하며, 외래 키는 반대편의 **@ManyToOne()**을 설정한 엔티티에 생성됩니다.
- @ManyToOne(): 한 엔티티가 다른 여러 엔티티와 관계를 가질 때 사용됩니다.
예시 코드
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@OneToMany(() => Post, post => post.user)// User는 여러 Post를 가질 수 있음
posts: Post[];
}
@Entity()
export class Post {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@ManyToOne(() => User, user => user.posts)// 여러 Post가 하나의 User에 속함
user: User;
}
- 여기서 Post 테이블에 userId 외래 키 컬럼이 생성됩니다.
- User 엔티티는 여러 **Post**와 연결되며, **Post**는 하나의 **User**와만 연결됩니다.
일대다/다대일 관계 특징
- 단방향 또는 양방향으로 설정할 수 있습니다.
- **OneToMany**와 **ManyToOne**을 조합하여 사용합니다. 실제 외래 키는 **@ManyToOne**이 설정된 엔티티에 생성됩니다.
3. Many-to-Many (다대다) 관계
다대다 관계는 여러 엔티티가 서로 연결될 수 있는 관계입니다. 예를 들어, **Student**와 Course 간의 관계에서 여러 학생이 여러 과정을 수강할 수 있고, 각 과정에는 여러 학생이 있을 수 있습니다.
설정 방법
- @ManyToMany(): 여러 엔티티가 서로 연결될 수 있도록 설정합니다.
- @JoinTable(): 연결 테이블(중간 테이블)을 생성하여 다대다 관계를 관리합니다. 이 데코레이터가 있어야 연결 테이블이 생성됩니다.
예시 코드
@Entity()
export class Student {
@PrimaryGeneratedColumn()
id: number;
@ManyToMany(() => Course, course => course.students)
@JoinTable()// Student와 Course 간의 중간 테이블 생성courses: Course[];
}
@Entity()
export class Course {
@PrimaryGeneratedColumn()
id: number;
@ManyToMany(() => Student, student => student.courses)
students: Student[];
}
- **@JoinTable()**을 사용하면 TypeORM이 중간 테이블을 생성하여 다대다 관계를 관리합니다.
- Student와 Course 간의 다대다 관계는 중간 테이블(student_courses)을 통해 서로 연결됩니다.
다대다 관계 특징
- 중간 테이블이 자동으로 생성되며, 이를 통해 관계가 유지됩니다.
- 단방향 또는 양방향으로 설정할 수 있습니다. **@JoinTable**은 양방향 관계 중 하나에만 지정해야 중간 테이블이 생성됩니다.
관계 설정의 주요 옵션
- cascade: 연관된 엔티티의 데이터 변경을 자동으로 반영할 수 있습니다. 예를 들어, 부모 엔티티를 삭제할 때 연관된 자식 엔티티도 자동으로 삭제되도록 설정할 수 있습니다.
- **cascade: ['insert', 'update', 'remove']**와 같이 insert, update, remove 중 필요한 기능만 지정 가능합니다.
- eager: **true**로 설정 시 관계 데이터를 자동으로 로드합니다. 예를 들어, **User**를 조회할 때 posts 관계 데이터도 자동으로 함께 조회됩니다.
- 기본값은 **false**이며, **즉시 로딩(eager loading)**을 원하는 경우에 설정합니다.
- nullable: 관계 컬럼이 **NULL**을 허용할지 여부를 설정합니다. 기본값은 **true**입니다.
- onDelete: 관계 데이터가 삭제될 때 연관된 엔티티에서 어떤 동작을 할지 설정합니다. CASCADE, SET NULL, RESTRICT 등 옵션을 설정할 수 있습니다.
- 예를 들어, 부모 엔티티를 삭제할 때 자식 엔티티도 자동으로 삭제되도록 하려면 **onDelete: 'CASCADE'**를 사용할 수 있습니다.
관계 설정의 예시 코드 (포괄적)
아래는 cascade, eager, onDelete 등의 옵션을 포함한 예시입니다.
@Entity()
export class Author {
@PrimaryGeneratedColumn()
id: number;
@OneToMany(() => Book, book => book.author, {
cascade: true,
eager: true,
onDelete: 'CASCADE',
})
books: Book[];
}
@Entity()
export class Book {
@PrimaryGeneratedColumn()
id: number;
@ManyToOne(() => Author, author => author.books, {
nullable: false,
onDelete: 'CASCADE',
})
author: Author;
@Column()
title: string;
}
요약
- One-to-One: 한 엔티티가 다른 하나의 엔티티와 단독으로 연결되는 관계입니다. **@OneToOne**과 **@JoinColumn**을 사용합니다.
- One-to-Many / Many-to-One: 여러 엔티티가 한 엔티티와 연결되는 관계입니다. **@OneToMany**와 **@ManyToOne**을 조합하여 사용합니다.
- Many-to-Many: 여러 엔티티가 서로 연결되는 관계입니다. **@ManyToMany**와 **@JoinTable**을 사용해 중간 테이블을 생성합니다.
- 추가 옵션으로 cascade, eager, nullable, onDelete 등이 있으며, 관계 데이터를 관리하는 데 유용합니다.
이렇게 TypeORM의 다양한 관계 설정을 통해 데이터베이스의 테이블 간 관계를 객체 지향적으로 관리할 수 있으며, 코드 내에서 관계 데이터를 쉽게 조회하고 조작할 수 있습니다.
'TypeOrm' 카테고리의 다른 글
TypeOrm 관계 설정 옵션 (0) | 2024.11.11 |
---|---|
TypeOrm FindManyOptions (0) | 2024.11.11 |
TypeOrm Inheritance (1) | 2024.11.08 |
TypeOrm Embedded Entity (0) | 2024.11.08 |
TypeOrm 엔티티 옵션 (0) | 2024.11.08 |