이전 내용
사실 이전에 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
위 포스트에 작성한 것처럼 보기 어렵고 힘들게 구현해서 사용 중이었다.
현재
최근 프로젝트에 Repository Pattern을 도입하며
더 깔끔하고 작성하기 쉬운 방법을 고민하다가 새로운 방식을 찾아내게 되었다.
improved-typeorm0.3-custom-repository - hou27
간단하게 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?
'Backend > NestJS' 카테고리의 다른 글
NestJS - Provider와 Nest IoC Container (0) | 2023.03.18 |
---|---|
TypeORM - select distinct 이슈 (0) | 2023.02.21 |
TypeORM - findOne with undefined (0) | 2022.11.07 |
NestJS - Transaction Interceptor 적용하기 (6) | 2022.11.01 |
NestJS - JWT을 사용한 사용자 인증 ( with graphql ) (0) | 2022.04.24 |