개요Relation 생성 예시 (User↔Profile)Entity - ProfileEntity - User결과 테이블Relation Load 예시의존중인 엔터티가 Delete될 때 동작 명시
- typeorm 공식문서 : https://typeorm.io/one-to-one-relations
개요
1:1 관계를 만들어줌.
@OneToOne(type => 어떤타입) @JoinColumn() // 데코레이터도 required 이며, 반드시 한쪽에만 존재해야함.
@JoinColumn() 데코레이터를 선언한 쪽에 타겟 테이블에 대한
relation id
와 foreign key
가 생성된다.사용하려는 쪽에서 위 데코레이터를 정의해야 한다.
예를 들어
User
와 Profile
이 있는 경우, 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 }
결과 테이블

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
란에 명시할 수 있다.
가능한 옵션으로는 위와 같다.
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도 연쇄적으로 제거되도록 할 수 있다.