[TypeORM] One-to-one 관계(@OneToOne)

cabbage·2023년 2월 5일
0

ORM

목록 보기
1/7
post-thumbnail
post-custom-banner

One-to-one relations (@OneToOne)

  • One-to-one 은 다음과 같은 관계를 말한다.
  • A가 B의 한가지 인스턴스만 포함하고, B가 A의 한가지 인스턴스만 포함한다.
  • UserProfile 엔티티 예시
    • 유저는 오직 하나의 프로필만 가질 수 있다.
    • 하나의 프로필은 오직 한 명의 유저에게만 포함된다.
import { Entity, PrimaryGeneratedColumn, Coloumn } from 'typeorm'

@Entity()
export class Profile {
	@PrimaryGeneratedColumn()
	id: number;

	@Column()
	gender: string;

	@Column()
	photo: string;
}
import {
	Entity,
	PrimaryGeneratedColumn,
	Column,
	OneToOne,
	JoinColumn,
} from 'typeorm'
import { Profile } from './Profile'

@Entity()
export class User {
	@PrimaryGeneratedColumn()
	id: number;

	@Column()
	name: string;

	@OneToOne(() => Profile)
	@JoinColumn()
	profile: Profile;
}
  • @OneToOneUser 엔티티의 profile 프로퍼티에 추가하고 대상 관계 타입을 Profile 로 지정하였다.
  • 또한 @JoinColumn 을 추가하였다.
  • @JoinColumn 은 one-to-one 관계의 엔티티 중에서 반드시 한 쪽에만 설정해야 한다.
  • @JoinColumn 을 설정한 쪽의 테이블에는 “관계 id”와 대상 엔티티 테이블에 대한 FK(외래키)가 포함된다. 스크린샷 2023-02-05 오후 5.15.35.png
  • user 테이블에 profile 테이블의 PK(기본키)가 FK(외래키)로 추가되었다.

User 엔티티의 profile 프로퍼티에 @JoinColumn 을 추가하는 이유에 대해 생각해 봤는데, 다음과 같은 이유라고 볼 수 있을 것 같다.

  • 유저와 프로필의 관계를 생각했을 때, 하나의 프로필은 하나의 유저에게 포함된다.
  • 따라서 유저 테이블이 프로필 테이블의 PK를 FK로 포함하는 것이 자연스럽다고 본다.

참고

profile
캐비지 개발 블로그입니다. :)
post-custom-banner

0개의 댓글