상세 컨텐츠

본문 제목

[nestJS] @EntityRepository(Board) deprecated

카테고리 없음

by esoesmio 2024. 5. 12. 19:52

본문

NestJS와 TypeORM을 사용하면서 발생한 `"@EntityRepository" is deprecated` 경고는 TypeORM에서 데코레이터 기반의 리포지토리 정의가 더 이상 권장되지 않기 때문입니다. 이전에는 `@EntityRepository` 데코레이터를 사용하여 엔티티에 대한 커스텀 리포지토리 클래스를 쉽게 정의할 수 있었지만, 최근의 TypeORM 버전에서는 이 방식이 권장되지 않고 있습니다.

### 변경된 접근 방법

TypeORM은 이제 데코레이터를 사용하는 대신, 더 명시적이고 유연한 방법으로 리포지토리를 정의하고 사용할 것을 권장합니다. 이는 다음과 같은 방법으로 진행할 수 있습니다:

1. **직접 `Repository` 또는 `EntityManager`를 주입받아 사용하기**: 이 방법은 리포지토리를 직접적으로 서비스에 주입하여 사용합니다. NestJS에서 `TypeOrmModule.forFeature()`를 통해 엔티티를 등록하고, 서비스에서 필요한 리포지토리를 DI(Dependency Injection)를 통해 주입받아 사용합니다.

2. **기존 클래스를 확장하지 않고 서비스에서 `getRepository` 또는 `getManager` 사용하기**: 이 방법은 엔티티 관리자 또는 리포지토리 팩토리 함수를 사용하여 리포지토리 인스턴스를 직접 가져와 사용합니다. 

### 예제 코드 수정

기존 코드에서 `@EntityRepository` 데코레이터를 제거하고 NestJS의 의존성 주입 시스템을 사용하여 리포지토리를 주입받는 방식으로 변경할 수 있습니다. 다음은 그 예입니다:

```typescript

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Board } from './board.entity';

@Injectable()
export class BoardService {
    constructor(
        @InjectRepository(Board)
        private boardRepository: Repository<Board>,
    ) {}

    // 여기에서 boardRepository를 사용하여 데이터베이스 작업 수행
}


```

이 코드는 `BoardService` 내에서 `Board` 엔티티에 대한 리포지토리를 주입받아 사용하는 방법을 보여줍니다. 이렇게 변경하면 `@EntityRepository` 데코레이터를 사용하지 않아도 되며, TypeORM의 권장 사항에 따라 리포지토리를 사용할 수 있습니다.

### 정리

TypeORM의 이러한 변화는 라이브러리가 더 명확하고 유지 관리가 쉬운 코드를 장려하려는 시도의 일환입니다. 개발자로서는 이러한 변경 사항을 주시하고, 프로젝트에 적용하여 미래에 발생할 수 있는 호환성 문제를 방지하는 것이 좋습니다.

댓글 영역