본문 바로가기

카테고리 없음

TypeORM에서 onDelete 기초

안녕하세요, 저는 NestJs 개발자 오동현입니다.

//User Entity//
@Entity()
export class User extends BaseEntity {
	@PrimaryGeneratedColumn()
    id : number;
    
    @Column()
    name : string
}
// Phone Entity //
@Entity()
export class Phone extends BaseEntity {
	@PrimaryGeneratedColumn()
    id : number;
    
    @Column()
    number : string;
    
    @Column({
    	nullable : false
    })
    userId : number;
    
    @OneToOne(type => User)
    @JoinColumn({
    	name : "userId"
	})
    user : User;
    
}

 

위와 같이 User 그리고 Phone엔티티들이 있다고 가정해봅시다!

 

위와 보이시는것 같이, 엔티티를 구성 하게 된다면,

Phone은 누구의 휴대폰인지 저장할 수 있습니다.

User 하나에 Phone 하나를 연결 할 수 있을것입니다.

만약 Phone을 생성시, userId를 같이 등록하게 되면, 등록한 유저와 릴레이션이 생기게 됩니다.


그런데 이렇게 Phone을 생성한 상태에서,

 

만약 User가 삭제가 된다면 여러분은 어떻게 하실건가요?

그냥 그대로 두실건가요?

당연히 User가 삭제되었으니,
해당 User와 관련된 데이터들은 업데이트를 해주어야합니다.

이러한 제약 조건들은 데이터베이스 무결성을 유지하고 데이터 무결성을 보장하기 위해 사용됩니다.

이때 여러분은 이 OneToOne 릴레이션에서 아래와 같이 onDelete를 사용하여,
User가 삭제되었을 때, 여러분이 원하는 Action을 할 수 있습니다.

 

@OneToOne(type => User, {

     onDelete : ?

})
@JoinColumn({
     name : "userId",
})

?에 나와있는 부분에는 

아래와 같은 속성들을 사용할 수 있습니다.


CASCADE부모 테이블의 레코드가 업데이트나 삭제될 때, 
이와 연결된 자식 테이블의 레코드도 같이 업데이트나 삭제되도록 하는 제약 조건입니다. 
부모 테이블의 변경이 자식 테이블에 전파되어 일관성을 유지할 수 있게 해줍니다. 

DEFAULT: 자식 테이블의 외래 키 값에 대해 부모 테이블의 레코드가 삭제되어 무효화되면,
해당 외래 키 값을 기본 값으로 설정하는 제약 조건입니다. 
데이터의 무결성을 유지하면서도 기본 값을 사용하여 자식 테이블의 레코드를 유지할 수 있습니다. 

NO ACTION부모 테이블의 레코드가 업데이트나 삭제될 때, 
연결된 자식 테이블의 레코드를 아무런 작업 없이 그대로 유지하겠다는 제약 조건입니다. 
다만, 이 경우 데이터베이스에서 일관성 유지를 위해 부모 테이블의 변경을 제한하는 경우도 있을 수 있습니다. 

RESTRICTNO ACTION과 유사한 제약 조건으로, 
부모 테이블의 레코드 변경이나 삭제를 제한하도록 하는 제약 조건입니다. 
변경 또는 삭제 작업이 발생할 경우 해당 작업을 방지하여 데이터 무결성을 유지합니다. 

SET NULL: 부모 테이블의 레코드가 업데이트나 삭제될 때,
연결된 자식 테이블의 외래 키 값을 NULL로 설정하는 제약 조건입니다.
이는 부모 레코드가 사라지더라도 자식 레코드를 유지하되 연결을 끊을 수 있는 옵션을 제공합니다.