본문 바로가기
NestJS

TypeORM - 일대일 관계 구현

by Programmer.Junny 2025. 2. 24.

특정 테이블끼리 하나의 관계를 연결짓는 것을 일대일 관계라고 말한다.

예를 들어 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이다.

true인 경우 profile을 같이 가져온다.

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

최근댓글

최근글

skin by © 2024 ttuttak