NestJS + TypeORM : Eager/Lazy Relation

Outclass·2022년 8월 25일
0

NestJS+GraphQL+TypeORM 

목록 보기
13/16

Eager Relation

  • Eager relation을 설정하면 엔티티가 로드 될 때마다 자동으로 relation된 엔티티가 함께 로드 된다.

    Eager relations are loaded automatically each time you load entities from the database. - TypeORM 공식문서

아래는 간단예시

//user.entity.ts
export class User {
  @OneToMany((type) => Eager, (eager) => eager.user)
  eagers: Eager[];
}

//eager.entity.ts
export class Eager {
  @ManyToOne((type) => User, (user) => user.eager, 
    eager: true,
  })
  user?: User;
  ...
}
  • User엔티티를 불러 올 때, eager:true인 Eager의 entity도 함께 불러와진다.
  • eager설정이 없을 때는, 아래와 같이 service에서 relations를 일일이 설정해주어야 한다.
export class UserSrvice {
  constructor (
  	@InjectRepisitory(User) private readonly users: Repository<User>
  ){}
  ...
  async testUser () {
  	const user = await this.users.findOne({ where : id, relations : ["eagers"] })
  }
  ...
}

단, eager relation을 쓸 때는 nest가 제공하는 pagination 기능을 사용할 수 없다.

Lazy Relation

Lazy Relation의 경우 entity에 접근할때 로드되며 Promise를 반환하기 때문에 await로 받아와야 한다.

Entities in lazy relations are loaded once you access them. Such relations must have Promise as type - you store your value in a promise, and when you load them a promise is returned as well. - TypeORM 공식문서

//user.entity.ts
export class User {
  @OneToMany((type) => Lazy, (lazy) => lazy.user)
  lazy: Promise<lazy[]>;
}

//eager.entity.ts
export class Lazy {
  @ManyToOne((type) => User, (user) => user.lazy)
  user?: Promise<User>;
  ...
}
  • Lazy relation적용을 위해 타입에 Promise를 선언해준다.
export class UserSrvice {
  constructor (
  	@InjectRepisitory(User) private readonly users: Repository<User>
  ){}
  ...
  async testUser () {
  	const user = await this.users.findOne({ where : id })
    
    //await로 relation에 접근해야 한다
    cosnt lazy = await user.lazy
  }
  ...
}

참고링크

TypeORM 공식문서 Eager and Lazy Relations

profile
When you stop having big dreams that’s when you’ve died, despite not being buried yet.

0개의 댓글