One to One

Tags
relation
 
 

개요

1:1 관계를 만들어줌.
@OneToOne(type => 어떤타입) @JoinColumn() // 데코레이터도 required 이며, 반드시 한쪽에만 존재해야함.
@JoinColumn() 데코레이터를 선언한 쪽에 타겟 테이블에 대한 relation idforeign key가 생성된다.
사용하려는 쪽에서 위 데코레이터를 정의해야 한다.
 
예를 들어 UserProfile이 있는 경우, User에서 Profile을 참조하고 싶다면 User에서 @OneToOne(type⇒Profile), @JoinColumn() 데코레이터를 정의해야 한다.

Relation 생성 예시 (User↔Profile)

Entity - Profile

@Entity() export class Profile { @PrimaryGeneratedColumn() id: number @Column() gender: string @Column() photo: string }

Entity - User

@Entity() export class User { @PrimaryGeneratedColumn() id: number @Column() name: string // Profile entity와 1:1관계 생성 @OneToOne(() => Profile) @JoinColumn() profile: Profile }

결과 테이블

notion image

Relation Load 예시

relation 테이블까지 읽는 것은 비용이 든다.
따라서 typeOrm에서 무조건적으로 relation을 같이 읽어오지 않는다.
따라서 필요할 경우 명시적으로 어떤 relation을 같이 읽어오라고 표기해야 한다.
<UserRepository>.findOne({ wher:{id:11}, // user의 id가 11인 것을 User table에서 가져와라 relations: ['profileId'] // 읽어올 때 profileId에 해당하는 realtion까지 같이 읽어서 반환하라고 명시하는 것. })

의존중인 엔터티가 Delete될 때 동작 명시

의존중인 엔터티가 있다면 제거할 수 없다.
위의 예시로 이어서 설명하자면 User가 Profile을 의존하고 있다.
 
만약 Profile를 제거하려고 하면 Profile만 단독으로 제거될 수 없다고 에러가 뜬다.
User에 relation 관계인 Profile만 단독으로 제거될 수 없다는 의미다.
delete 발생 시 의존관계인 행을 어떻게 처리할 것인지를 onDelete 란에 명시할 수 있다.
notion image
가능한 옵션으로는 위와 같다.
  • RESTRICT, CASCADE, SET NULL, DEFAULT, NO ACTION
 
아래는 onDelete를 설정하는 예시다.
유저가 Profile을 제거한다면 User도 같이 제거되도록 했다. (실제론 이렇게 하지 않겠지만)
@Entity() export class User { @PrimaryGeneratedColumn() id: number @Column() name: string // Profile entity와 1:1관계 생성 @OneToOne(() => Profile, { onDelete: 'CASCADE' }) // 의존중인 Profile이 제거된다면 해당 User도 제거하라는 의미다. @JoinColumn() profile: Profile }
 
예를 들어 이메일 인증과 관련된 Verification 테이블이 있고 User와 1:1 relation 이라고 할 때,
유저가 삭제된다면 유저와 관계를 맺고 있는 Verification은 의미가 없다. 해당 유저가 인증이 되었는지 아닌지를 나타내기 때문이다.
이런 경우에 CASCADE유저가 삭제될 시 Verfication도 연쇄적으로 제거되도록 할 수 있다.