본문 바로가기
NestJS

TypeORM - 일대다, 다대일 관계 구현

by Programmer.Junny 2025. 2. 24.

한명의 유저는 여러 글을 포스팅할 수 있어야 한다.

이러한 것처럼 User - Post는 일대다 관계로 정의할 수 있다.

import { Column, CreateDateColumn, Entity, Generated, JoinColumn, OneToMany, OneToOne, PrimaryGeneratedColumn, UpdateDateColumn, VersionColumn } from "typeorm";
import { ProfileModel } from "./profile.entity";
import { PostModel } from "./post.entity";

export enum Role {
    USER = 'user',
    ADMIN = 'admin',
}

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

    @Column()
    email: string;

    @Column({
        type: 'enum',
        enum: Role,
        default: Role.USER,
    })
    role: Role;

    @CreateDateColumn()
    createdAt: Date;

    @UpdateDateColumn()
    updatedAt: Date;

    /**
     * 데이터가 업데이트 될 때마다 1씩 올라간다.
     * 처음 생성되면 값은 1이다.
     * save() 함수가 몇번 불렸는지 기억한다.
     */
    @VersionColumn()
    version: number;

    @Column()
    @Generated('uuid')
    additionalId: string;

    @OneToOne(() => ProfileModel, (profile) => profile.user)
    @JoinColumn()
    profile: ProfileModel;

    @OneToMany(() => PostModel, (post) => post.author)
    posts: PostModel[]

    @Column({
        default: 0,
    })
    count: number
}
@OneToMany(() => PostModel, (post) => post.author)
posts: PostModel[]

유저는 많은 포스트를 작성할 수 있으므로, 일대다 관계이다. 그러므로 @OneToMany로 작성한다.

import { Column, Entity, JoinTable, ManyToMany, ManyToOne, PrimaryGeneratedColumn } from "typeorm";
import { UserModel } from "./user.entity";
import { TagModel } from "./tag.entity";

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

    @ManyToOne(() => UserModel, (user) => user.posts)
    author: UserModel;

    @ManyToMany(() => TagModel, (tag) => tag.posts)
    @JoinTable()
    tags: TagModel[];

    @Column()
    title: string;
}

포스트는 하나의 유저가 작성한 것에 속해야하므로 다대일 관계이다. 그러므로 @ManyToOne 으로 작성한다.

@JoinTable() 은 어떻게 해야할까? (외래키)

이 부분은 조금만 고민해보면 쉽게 알 수 있다.

유저가 그 많은 포스팅에 대한 정보(외래키)들을 다 가지고 있어야 할까?

그건 현실적으로 불가능하므로 '다'에 해당하는 쪽에서 '일'의 해당하는 정보인 외래키를 들고 있어야 한다.

즉, 포스트된 글이 유저의 id만을 알고 있으면 된다.

'NestJS' 카테고리의 다른 글

TypeORM - FindManyOptions 파라미터  (0) 2025.02.24
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

최근댓글

최근글

skin by © 2024 ttuttak