개발일지/Node.js

TypeORM - @Column({ unique : true }) vs @Unique()

E-room 2024. 2. 23. 18:18
728x90

nestjs + typeORM을 공부하던 중 특정 컬럼에 대해 유니크 속성을 주어야 하는데, 두 가지 방법이 보였다.

 

첫 번째는 변수에 @Column 데코레이터를 사용하는 것이고,

두 번째는 클래스에 @Unique 데코레이터를 사용하는 것이다.

 

두 방법 모두 유니크 속성을 부여한다는 것은 동일하지만 약간의 차이가 있다.

유니크 속성을 각각 부여하느냐, 합쳐서 부여하느냐의 차이다.

@Column({ unique : true })

일반적으로 원하는 특정 컬럼에 유니크 속성을 주기 위해 사용할 수 있다.

    @Column({ unique: true })
    first: string;

    @Column({ unique: true })
    second: string;

 

@Column({ unique : true })

이러한 방식으로 생성된 제약조건을 살펴보면 각각 컬럼별로 두 개의 제약조건이 생성된 것을 볼 수 있다.

 

@Unique(['first', 'second'])

두가지 컬럼에 하나의 유니크 제약조건을 부여한다.

즉, 'first' 및 'second' 열의 값이 모두 동일한 행이 두 번 이상 삽입되는 것을 방지한다.(복합키)

@Unique(['first', 'second'])
export class User extends BaseEntity {
 ...
}

 

@Unique

두 컬럼이 하나의 제약조건으로 묶여있는 모습이다.

 

위 사진처럼 first의 중복과 second의 각각 중복은 가능하다.

 

하지만, 이 상태에서

INSERT INTO users (first, second) VALUES ('a', 'b');

쿼리를 실행하게 되면 어떻게 될까?

위와 같이 에러가 발생한다.

 

결론

@Column 데코레이터에 unique: true 옵션을 주는 것은 일반적으로 유니크 속성을 부여하는 것이다.

@Unique 데코레이터는 복합키를 생성할 때 사용한다.

728x90