특정 테이블끼리 하나의 관계를 연결짓는 것을 일대일 관계라고 말한다.
예를 들어 UserModel 에선 ProfileModel을 가져야 하고, 마찬가지로 ProfileModel 에서도 UserModel을 가지고 있어야 한다면 일대일 관계가 성립된다.
import { Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from 'typeorm';
@Entity()
export class Profile {
@PrimaryGeneratedColumn()
id: number;
@Column({ type: 'text' })
bio: string;
// 추가적인 프로필 관련 컬럼들을 정의할 수 있습니다.
}
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column({ type: 'varchar', length: 100 })
name: string;
// 1:1 관계를 정의합니다.
// @JoinColumn 데코레이터를 사용하여 해당 테이블(User)이 외래 키를 소유함을 명시합니다.
@OneToOne(() => Profile, { cascade: true })
@JoinColumn() // 외래 키가 User 테이블에 생성됨
profile: Profile;
}
@JoinColumn: 이 데코레이터를 사용하는 엔티티가 외래 키(foreign key)를 소유하게 된다.
관계 옵션 (모든 관계에서 설정 가능)
@OneToOne(() => ProfileModel, (profile) => profile.user, {
// find() 실행 할때마다 항상 같이 가져올 relation
eager: true,
// true일 경우 저장할때 relation을 한번에 같이 저장 가능
cascade: true,
// null이 되어도 되는지 (기본값 true)
nullable: true,
// 관계가 삭제됐을 때
// no action -> 아무것도 안함
// cascade -> 참조하는 Row도 같이 삭제
// set null -> 참조하는 Row에서 참조 id를 null로 변경
// set default -> 기본 세팅으로 설정 (테이블의 기본 세팅)
// restrict -> 참조하고 있는 Row가 있는 경우 참조당하는 Row 삭제 불가
onDelete: 'CASCADE',
})
@JoinColumn()
profile: ProfileModel;
eager
find 계열 함수를 실행 시 관계를 같이 가져올지 설정 여부이다.
false 이면 가져오지 않으며, true이면 가져온다.
기본값은 false이다.
cascade
관계가 연결되어있는 것들을 한번에 저장할 수 있도록 할지 설정 여부이다.
true일 경우 저장할때 relation을 한번에 같이 저장 가능해진다.
@Post('user/profile')
async createUserAndProfile() {
const user = await this.userRepository.save({
email: 'user-0@google.com',
// cascade가 true일 경우에만 가능
profile: {
profileImg: 'qwer.jpg',
}
});
return user;
}
User와 Profile은 일대일 관계이므로 User 내의 Profile을 변경하거나 생성이 가능해진다.
기본값은 false 이다.
nullable
null이 되어도 되는지 (기본값 true)
onDelete
관계가 삭제됐을 때 어떤 행동을 할지 결정한다.
- no action -> 아무것도 안함
- cascade -> 참조하는 Row도 같이 삭제
- set null -> 참조하는 Row에서 참조 id를 null로 변경
- set default -> 기본 세팅으로 설정 (테이블의 기본 세팅)
- restrict -> 참조하고 있는 Row가 있는 경우 참조당하는 Row 삭제 불가
'NestJS' 카테고리의 다른 글
TypeORM - 다대다 관계 구현 (0) | 2025.02.24 |
---|---|
TypeORM - 일대다, 다대일 관계 구현 (0) | 2025.02.24 |
Entity Embedding VS Table Inheritance (0) | 2025.02.24 |
TypeORM - Entity Column 탐구 (0) | 2025.02.24 |
TypeORM - Repository 주입하기 (0) | 2025.02.24 |