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)이다(당연한데, 가장 궁금했음)
부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>
'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 |