TypeOrm / / 2024. 11. 9. 03:46

TypeOrm Relationship

TypeORM에서 관계(Relationship)는 두 엔티티 간의 연결을 설정하여 데이터베이스에서 연관된 데이터를 쉽게 조회하고 조작할 수 있도록 합니다. 관계 설정을 통해 객체 지향적으로 데이터베이스의 테이블 간 관계를 표현할 수 있으며, TypeORM은 이 관계를 기반으로 쿼리를 자동 생성하고 관리합니다.

TypeORM에서는 크게 다음 네 가지 종류의 관계를 지원합니다:

  1. One-to-One (일대일)
  2. One-to-Many (일대다)
  3. Many-to-One (다대일)
  4. 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**은 양방향 관계 중 하나에만 지정해야 중간 테이블이 생성됩니다.

관계 설정의 주요 옵션

  1. cascade: 연관된 엔티티의 데이터 변경을 자동으로 반영할 수 있습니다. 예를 들어, 부모 엔티티를 삭제할 때 연관된 자식 엔티티도 자동으로 삭제되도록 설정할 수 있습니다.
    • **cascade: ['insert', 'update', 'remove']**와 같이 insertupdateremove 중 필요한 기능만 지정 가능합니다.
  2. eager: **true**로 설정 시 관계 데이터를 자동으로 로드합니다. 예를 들어, **User**를 조회할 때 posts 관계 데이터도 자동으로 함께 조회됩니다.
    • 기본값은 **false**이며, **즉시 로딩(eager loading)**을 원하는 경우에 설정합니다.
  3. nullable: 관계 컬럼이 **NULL**을 허용할지 여부를 설정합니다. 기본값은 **true**입니다.
  4. onDelete: 관계 데이터가 삭제될 때 연관된 엔티티에서 어떤 동작을 할지 설정합니다. CASCADESET NULLRESTRICT 등 옵션을 설정할 수 있습니다.
    • 예를 들어, 부모 엔티티를 삭제할 때 자식 엔티티도 자동으로 삭제되도록 하려면 **onDelete: 'CASCADE'**를 사용할 수 있습니다.

관계 설정의 예시 코드 (포괄적)

아래는 cascadeeageronDelete 등의 옵션을 포함한 예시입니다.

@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**을 사용해 중간 테이블을 생성합니다.
  • 추가 옵션으로 cascadeeagernullableonDelete 등이 있으며, 관계 데이터를 관리하는 데 유용합니다.

이렇게 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
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유