본문 바로가기
TIL

[TIL] Typeorm @Many-To-Many

by 쾌횽 2024. 3. 23.
반응형

Typeorm을 관계를 설정할때 @Many-To-Many로 관계를 설정할때가 있다.

Typeorm 공식문서를 살펴보면,

기본적으로 @Many-To-Many는 A가 B의 여러 인스턴스를 포함하고, B가 A의 여러 인스턴스를 포함하는 관계라고 정의하고 있다.

//category.entity.ts
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm"

@Entity()
export class Category {
    @PrimaryGeneratedColumn()
    id: number

    @Column()
    name: string
}
//question.entity.ts
import {
    Entity,
    PrimaryGeneratedColumn,
    Column,
    ManyToMany,
    JoinTable,
} from "typeorm"
import { Category } from "./Category"

@Entity()
export class Question {
    @PrimaryGeneratedColumn()
    id: number

    @Column()
    title: string

    @Column()
    text: string

    @ManyToMany(() => Category)
    @JoinTable()
    categories: Category[]
}

위의 코드처럼 category테이블과 question테이블이 @Many-To-Many관계로 구성되어있다.

@JoinTable()을 통해 서로의 Id로 구성된 테이블이 자동으로 생성된다. 이 테이블은 별도의 service.ts와 controller.ts파일이 존재하지 않아서 개발자가 직접 테이블을 제어하기 힘들다는 단점이있다.

 

이러한 경우 @One-To-Many, @Many-To-One의 관계를 통해 직접 테이블을 생성해 주고 새로움 컬럼도 추가할 수 있다. 

@JoinTable()로 생성된 테이블과 달리 questionToCategory.entity.ts로 직접 접근할 수 있고 명확하게 파악도 쉬워진다.

//category.entity.ts
@OneToMany(() => questionToCategory, questionToCategory => questionToCategory.category)
questionToCategories: QuestionToCategory[];
//question.entity.ts
@OneToMany(() => QuestionToCategory, questionToCategory => questionToCategory.question)
questionToCategories: QuestionToCategory[];
//questionToCategory.entity.ts
import { Entity, Column, ManyToOne, PrimaryGeneratedColumn } from "typeorm"
import { Question } from "./question"
import { Category } from "./category"

@Entity()
export class QuestionToCategory {
    @PrimaryGeneratedColumn()
	questionToCategoryId: number

    @Column()
    questionId: number

    @Column()
    categoryId: number

    @Column()
    order: number

    @ManyToOne(() => Question, (question) => question.questionToCategories)
    question: Question

    @ManyToOne(() => Category, (category) => category.questionToCategories)
    category: Category
}

 

반응형

댓글