kakasoo

TypeORM에서의 명시적인 제약조건 이름 선언 본문

프로그래밍/NestJS

TypeORM에서의 명시적인 제약조건 이름 선언

카카수(kakasoo) 2022. 9. 12. 16:33
반응형

 

issue number #8524에서 JoinColumn에서의 제약 조건 이름을 추가하는 법이 추가되었습니다.

이 내용은, 기존의 방식처럼 Entity 위에 @index() 데코레이터를 통해 제약조건을 거는 것보다 명시적입니다.

인덱스 데코레이터의 경우에는 하나의 데코레이터를 이용해 Primary와 복합키, 외래키 등을 모두 표현했습니다.

따라서 그 의미가 무엇을 뜻하는지는 인덱스 데코레이터와 엔티티 칼럼과의 관계를 보고 이해해야 했습니다.

 

issue number #8900에서는 위의 변화와 더불어 Column 데코레이터에서도 제약조건 명시를 허용했습니다.

새로이 명시된 방법은 아래와 같습니다.

 

@Entity()
export class Post {
    @ManyToOne((type) => Category)
    @JoinColumn({
        name: "cat_id",
        referencedColumnName: "name",
        foreignKeyConstraintName: "fk_cat_id"
    })
    category: Category
}
@Entity()
export class Post {
    @ManyToMany((type) => Category)
    @JoinTable({
        name: "question_categories",
        joinColumn: {
            name: "question",
            referencedColumnName: "id",
            foreignKeyConstraintName: "fk_question_categories_questionId"
        },
        inverseJoinColumn: {
            name: "category",
            referencedColumnName: "id",
            foreignKeyConstraintName: "fk_question_categories_categoryId"
        },
    })
    categories: Category[]
}

 

JoinColumn과 JoinTable에서는 위처럼 명시할 수 있게 되었습니다.

이렇게 명시함으로써 엔티티 간의 관계가 어떤 제약조건으로 연결되어 있는지를 한 눈에 확인할 수 있게 됐습니다.

엔티티 간의 관계가 아니라, 단일 엔티티 내에서의 제약 조건은 다시 아래와 같이 표현 가능해졌습니다.

 

@Entity()
export class User {
    @PrimaryColumn({ primaryKeyConstraintName: "pk_user_id" })
    id: number
}
@Entity()
export class User {
    @Column({ primary: true, primaryKeyConstraintName: "pk_user_id" })
    id: number
}
@Entity()
export class User {
    @PrimaryGeneratedColumn({ primaryKeyConstraintName: "pk_user_id" })
    id: number
}

 

두 방식 모두, 명시적으로 선언 가능할 뿐만 아니라 커스텀한 제약 조건 이름을 넣을 수 있습니다.

이 내용들은 TypeORM 0.3.7 이상의 버전에서 사용 가능합니다.

반응형