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;
}
}
'개발 > Nest.js' 카테고리의 다른 글
[Nest.js] TypeORM - 엔티티 정의와 DB 스키마 간의 차이가 있는 경우 발생하는 문제 (0) | 2024.07.14 |
---|