나는 NestJS의 기초를 JohnAhn 님의 강의를 통해서 배웠다.
거기서는 Custom Repository를 만들 때 Repository<(엔티티명)> 를 상속받은 class에 @EntityRepository() 로 데코레이팅해주면 그만이었는데
저 가로줄 보이시는가..
de..pre..cated...
TypeORM 0.3.0 부터는 @EntityRepository가 deprecated되고 말았다..
그러면 Custom Repository는 어떻게 만들라는 말이지.?
다행히 위대한 스택오버플로우에는 답이 늘 존재한다.
해답을 찾아따
[참고] How to do custom repository using TypeORM (MongoDB) in NestJS?
저 분의 답에 따르면,
@Injectable()
export class SampleRepository extends Repository<Sample> {
constructor(dataSource: DataSource) {
super(Sample, dataSource.createEntityManager());
}
}
뭐 대충 조런 식으로 만들 수 있는 것 같다. DataSource 의 createEntityMangager()를 이용하는 것 같다.
DataSource가 뭔가 하고 설명을 읽어봤는데
데이터베이스와의 상호 작용은 DataSource를 설정한 후에만 가능...
DataSource는 데이터베이스 연결 설정을 유지하고 사용하는 RDBMS에 따라 초기 데이터베이스 connection 또는 connection pool 설정... 어쩌구 저쩌구...
뭐... 대충 db 연결해주는 객체다 그런 것 같고
그래서 왜 Repository의 생성자에 저걸 넣어줬는지 알아보기 위해 definition 코드를 한번 뜯어봤다.
첫 번째 인수로 target이 될 Entity, 두 번째 인수로 EntityManager 타입의 manager(entity에 대한 operation을 수행할 수 있는 애)를 넣어주는 걸 확인할 수 있었다. 아하.. 어쨌건 manager가 있어야 operation을 수행할 수 있으니 저렇게 해준거구나.
이 질문의 첫 번째 답변을 참고해서 한번 빠르게 BoardRepository를 작성해봤다.
import { Board } from "../../entities/board.entity";
import { DataSource, Repository } from "typeorm";
import { Injectable } from '@nestjs/common';
@Injectable()
export class BoardRepository extends Repository<Board> {
constructor(dataSource: DataSource) {
super(Board, dataSource.createEntityManager());
}
async getBoardById(id: number) {
return await this.findOneBy({boardId: id});
}
}
그리고 저 Repository를 사용할 수 있게 하기 위해서 BoardModule 에 provider로 등록해주면 된다. 왜냐? @Injectable 로 데코레이팅 되어 있으니까... 어쨌건 @EntityRepository였으면 forFeature 안에 넣어줬을 텐데 얘는 이런식으로 구성하면 되는 것 같다.
@Module({
imports: [TypeOrmModule.forFeature([Board])],
controllers: [BoardController],
providers: [
BoardService,
BoardRepository,
]
})
export class BoardModule {}
해결법을 알았으니 나머지 repository들도 작성해주면 될 것 같다.
진짜 감사합니다. 사랑해요.