본문 바로가기

Backend/NestJS

extends Repository<레포지토리명>이 아닌 <엔티티명>으로 가야하는 이유

Nestjs로 Repository에 코드를 작성하던 중에 

export class AgreementApiRepository extends Repository<AgreementApiRepository> {
 async findByAddress(walletAddress: string) {
    return this.findOne({ where: { walletAddress: ILike(walletAddress) } });
  }
}

이런 내용을 작성하였다. 그런데 내가 안에 삽입했던 로직에서 에러가 나고 있었다. where절 안에서 발생하는 에러였다. 

 

에러상황 

TS2322: Type '{ walletAddress: FindOperator<string>; }' is not assignable to type 'FindOptionsWhere<AgreementApiRepository> | FindOptionsWhere<AgreementApiRepository>[]'.   Object literal may only specify known properties, and 'walletAddress' does not exist in type 'FindOptionsWhere<AgreementApiRepository> | FindOptionsWhere<AgreementApiRepository>[]'.

 

이 말인 즉슨, 위에서 export class로 선언한 Repository<> 부분에서 <>안에 레포지터리가 올게 아니라, 엔티티명이 와야 하는 것이다. 


Why ?? 

TypeORM의 findOne 메서드는 엔티티를 조회하는데 사용이 되는데, 

인자로 FindOneOptions 타입의 객체를 받는다. 이 객체는 typeorm의 엔티티와 관련된 쿼리 옵션들을 지정하는데 사용이 된다. 

따라서 AgreementApiRepository에서 findOne() 메서드를 사용할때 인자로 전달되는 객체의 형식은 FindOneOptions와 관련된 형식이어야 한다. -> where 속성을 사용하여 쿼리 조건 지정 가능. 

 

실제로 사용되는 엔티티 클래스를 정확하게 지정을 해야하는데, 나는 엔티티명이 아닌 레포지터리명으로 지정을 했기 때문에 위와 같은 에러가 발생한 것이었다. 

 

 

앞으로 repository 작성할때 주의하자!