Backend/NestJS

TypeORM - Custom Repository 개선안

hou27 2023. 5. 1. 23:45

이전 내용

사실 이전에 TypeORM이 0.3.x 버전 이상으로 올라가면서

@EntityRepository(User)
export class UserRepository extends Repository<User> {
  async customMethod(userId: number): Promise<Result> {
    ...
  }
}

위와 같이 @EntityRepository() 데코레이터를 사용해서

CustomRepository를 구현하는 것이 불가능해졌었기 때문에

 

typeORM 0.3 버전 이후의 Custom-repository - hou27

 

TypeORM - Custom repository(사용자 정의 레포지토리)

데이터 베이스 작업 로직을 작성하던 중 내가 작성한 함수를 typeORM에 정의된 메서드처럼 사용할 수 있는 방법이 있다는 걸 알게 되었다. https://orkhan.gitbook.io/typeorm/docs/custom-repository Custom repositorie

hou27.tistory.com

위 포스트에 작성한 것처럼 보기 어렵고 힘들게 구현해서 사용 중이었다.

 

현재

최근 프로젝트에 Repository Pattern을 도입하며

더 깔끔하고 작성하기 쉬운 방법을 고민하다가 새로운 방식을 찾아내게 되었다.

improved-typeorm0.3-custom-repository - hou27

 

GitHub - hou27/nestjs-examples: NestJS Example codes Repository

NestJS Example codes Repository. Contribute to hou27/nestjs-examples development by creating an account on GitHub.

github.com

 

간단하게 Custom Repository 구현하기

우선 형식은 typeORM 0.2 버전에서 구현하던 것과 매우 유사하다.

다음은 예시 코드이다.

 

Example Code

@Injectable()
export class UserRepository extends Repository<User> {
  constructor(private dataSource: DataSource) {
    super(User, dataSource.createEntityManager());
  }

  async customMethod(id: number): Promise<User> {
    return await this.createQueryBuilder('user')
      .where('user.id = :id', { id })
      .getOneOrFail();
  }
}

정말 유사하다는 것을 느낄 수 있을텐데,

위 코드와 같이 TypeORM 0.3.x 버전에서도 TypeORM이 제공하는 Repository를 상속받아 Custom Repository를 구현할 수 있다.

핵심은 생성자 부분이다.

 

Repository.d.ts

위 파일을 확인해보면, 

TypeORM이 제공하는 Repository Class의 생성자

다음과 같이 target, manager를 필수로 전달받는 것을 알 수 있다.

constructor(target: EntityTarget<Entity>, manager: EntityManager, queryRunner?: QueryRunner);

때문에 정말 단순하게도

기존 Repository를 확장하는 class를 만들어주기 위해 적절한 친구들을 부모 생성자에 넘겨주고,

원하는 custom method들을 작성해주면, 편하게 provider로 등록하여 사용할 수 있게 되는 것이다.

 

좋은 이유

정말 별게 없는데 이렇게 개선함으로써

Repository Layer를 하나 더 생성하고, 해당 클래스는 또 TypeORM의 Repository를 주입받는 경우에

서비스로부터 호출받은 Repository의 method가 아무 작업없이 그대로 TypeORM의 Repository로 넘기는

매우 비효율적인 코드를 피할 수 있게 되고,

 

복잡하게 Custom Repository를 구현하여 사용하는 경우의

유지보수가 어렵고 가독성이 떨어진다는 문제를 해결할 수 있게 된다.

 

혹시나 더 좋은 방법이 있다면 공유받고 싶습니다!


참고자료

 

How to do custom repository using TypeORM (MongoDB) in NestJS?