티스토리 뷰

TypeORM의 Entity 참조는 어떻게 일어나는가?

🐥 카카오테크캠퍼스 - 2단계 1주차 기본 Entity 설계를 하는데, 평소에 TypeORM의 Entity 참조는 어떻게 일어나나 궁금해졌다.

Entity 설계를 하니 FK 설정에 대해서 자연스럽게 고민하는데, 자동으로 Entity를 참조하고, 필요한 필드만 가져와 뿌리던 그 편리함은 어디서 왔지? 싶었다

Code 분석


위의 코드는 캡스톤 할 때 만든, User 테이블이다.
조금 손봐서, UserMeta 테이블을 Entity로 참조하도록 변경했다

TypeORM의 코드를 까보자 그렇다면, 예시로 0neToOne 어노테이션을 확인했다

export declare function OneToOne<T>(
    typeFunctionOrTarget: string | ((type?: any) => ObjectType<T>), 
    inverseSide?: string | ((object: T) => any), 
    options?: RelationOptions
): PropertyDecorator;

내부 파라미터를 열어보자

  • typeFunctionOrTarget
    • 관계를 설정할 대상 엔터티의 타입을 나타내는 문자열 또는 함수입니다.
    • 함수의 경우, 대상 엔터티 타입을 반환합니다.
  • inverseSide
    • (선택적) 역방향 관계를 설정하는 함수입니다.
    • 이 함수는 Entity2의 객체를 인수로 받아, Entity1을 반환합니다.
    • 이는 Entity2에서 Entity1로의 관계를 설정하는 데 사용됩니다.
  • options:
    • (선택적) 관계에 대한 추가 옵션을 설정하는 객체입니다.
    • 예를 들어, 옵션에는 cascade(엔터티 저장/제거 시 관계 설정), eager(엔터티를 불러올 때 항상 관련 엔터티를 같이 불러옴), lazy(관련 엔터티를 필요할 때만 불러옴) 등의 설정이 포함될 수 있습니다.

typeFunctionOrTartget에서 Entity를 바로 인자로 받을 수 있다.
하지만, 이걸론 부족해서 조금 더 찾아보았다

Decorator와 Metadata Reflection

결과적으로 TypeORM에서는 데코레이터와 메타데이터 리플렉션을 사용하여 엔터티 참조가 가능합니다.

TypeORM은 데코레이터는 엔터티 간의 관계를 정의하고 메타데이터 리플렉션을 사용하여 이 정보를 분석하고 저장합니다.

또한, 엔터티 간의 관계를 정의할 때 ‘OneToOne’, ‘ManyToOne’ 또는 'OneToMany’와 같은 데코레이터를 사용하여 엔터티의 해당 속성에 대한 정보를 제공합니다

예를 들어 User 및 Post 엔터티 간의 일대다 관계의 간단한 예를 살펴보겠습니다.

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

  @OneToMany(() => Post, post => post.user)
  posts: Post[];
}

@Entity()
class Post {
  @PrimaryGeneratedColumn()
  id: number;

  @ManyToOne(() => User, user => user.posts)
  user: User;
}

User 엔티티에서 @OneToMany 데코레이터는 Post 엔티티와 일대다 관계를 지정합니다.
이는 User 엔터티가 여러 게시물을 가질 수 있음을 나타내며 Post 엔터티의 post 속성을 관계의 역으로 ​​사용합니다.

반대로 ‘Post’ 엔터티에서 ‘@ManyToOne’ 데코레이터는 ‘User’ 엔터티와의 다대일 관계를 나타냅니다.
각 ‘Post’ 엔터티가 단일 ‘User’ 엔터티와 연결되도록 지정하고 관계의 역방향으로 ‘User’ 엔터티의 ‘user’ 속성을 사용합니다.

  • 여기서 역방향이라 함, entity => entity1.entity2 형식으로 데코레이터에 옵션을 주면 쿼리를 날릴 때 TypeORM이 해당 정보를 자동으로 참조합니다

이 때, TypeORM은 메타데이터 리플렉션을 사용하여 데코레이터와 해당 매개변수를 분석(엔터티, 속성 및 관계에 대한 정보를 수집)합니다.
합니다.
이 메타데이터는 런타임 중에 SQL 쿼리를 생성하고 데이터베이스 작업을 수행하며 관계의 무결성을 유지하는 데 사용됩니다.

TypeORM은 이 과정을 거쳐 효율적인 SQL 쿼리를 생성할 수 있는 것이죠

또한, TypeORM에서 엔터티를 참조할 때 참조되는 키는 일반적으로 해당 엔터티의 기본 키(PK)이다(당연한데, 가장 궁금했음)

부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>

728x90

'DEV > Backend' 카테고리의 다른 글

Restful API  (2) 2023.07.11
Mock API 작성하는 팁  (0) 2023.07.10
조회 vs Join 무엇이 더 효율적인가  (0) 2023.06.27
Secondary Index  (0) 2023.06.17
SA  (0) 2023.06.10