TypeORM에서 다음과 같이 Repository를 구성하는 경우 EntityMetadataNotFoundError가 발생한다.

 

 Board 도메인에서 createBoard API를 구성하는 것을 예제로하여 살펴보자

 

module.ts

@Module({
  imports: [TypeOrmModule.forFeature([BoardRepository])],
  controllers: [BoardsController],
  providers: [BoardsService],
})

 

controller.ts

@Controller('boards')
export class BoardsController {
  constructor(private boardsService: BoardsService) {}

  @Post('/')
  @UsePipes(ValidationPipe)
  createBoard(@Body() createBoardDTO: CreateBoardDTO): Promise<Board> {
    return this.boardsService.createBoard(createBoardDTO);
  }
}

 

service.ts

@Injectable()
export class BoardsService {
  constructor(
    @InjectRepository(BoardRepository)
    private boardRepository: BoardRepository,
  ) {}

  createBoard(createBoardDTO: CreateBoardDTO): Promise<Board> {
    return this.boardRepository.createBoard(createBoardDTO);
  }
}

 

Repository.ts

@EntityRepository(Board)
export class BoardRepository extends Repository<Board> {
  async createBoard(createBoardDTO: CreateBoardDTO): Promise<Board> {
    const { title, description } = createBoardDTO;

    const board = this.create({
      title,
      description,
      status: BoardStatus.PUBLIC,
    });

    await this.save(board);

    return board;
  }
}

 

createBoard API를 요청하는 경우 다음과 같은 에러가 발생한다

 

ERROR [ExceptionsHandler] No metadata for "BoardRepository" was found.
EntityMetadataNotFoundError: No metadata for "BoardRepository" was found.

 

이는 @EntityRepository가 지원 중단되어 nestjs가 Repository 클래스를 인식하지 못하기 때문에 발생하는 에러이다.

 

typeORM 사용시 custom repository를 만들기 위해서는 Repository와 Controller 클래스를 다음과 같이 수정해야 한다.

 

Controller

(provider에 Repository 추가)

@Module({
  imports: [TypeOrmModule.forFeature([BoardRepository])],
  controllers: [BoardsController],
  providers: [BoardsService, BoardRepository],
})

 

Repository

(Repository 클래스를 Injectable로 변환 후 모듈에 주입하고, constructor를 통해 엔티티 관계를 직접 설정해준다.)

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

  async createBoard(createBoardDTO: CreateBoardDTO): Promise<Board> {
    const { title, description } = createBoardDTO;

    const board = this.create({
      title,
      description,
      status: BoardStatus.PUBLIC,
    });

    await this.save(board);

    return board;
  }
}

 

+ Recent posts