개발 알다가도 모르겠네요

TypeORM 0.3 버전 repository pattern 적용 본문

웹/Nestjs

TypeORM 0.3 버전 repository pattern 적용

이재빵 2023. 5. 29. 00:26
728x90

2022년 3월, TypeORM 0.3 버전이 새롭게 배포되면서, 기존 @EntityRepository 데코레이터가 deprecated되었다.

@EntityRepository()
class BoardRepository extends Repository<Board> {}

기존에는 저런식으로 쓰였지만, 이제는 CustomRepository 데코레이터를 사용하거나, @Injectable()을 사용하여 서비스단에 의존성주입을 하는 방법을 사용해야 한다.

그중에서도 @Injectable이 코드가 훨씬 간단해보여 알아보고자 한다.

 

검색 결과, @Injectable을 이용한 대부분의 사람들이 아래와 같이 구현했다.

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

BoardRepository는 Repository<Board>를 상속하고 있으며, Repository의 모든 메소드가 BoardRepository에서 이용 가능하다. 

DataSource를 통해 EntityManager를 생성하는 것이 주목할 만한 부분이다. 이렇게 되면, 상속을 통해 부모 클래스의 기능을 재사용할 수 있지만, 클래스 간의 강력한 결합을 유발하며 코드의 유연성과 테스트 가능성이 줄어들 수 있다.

 

 

아래의 코드가 더욱 깔끔해보인다.

@Injectable()
export class BoardRepository {
  constructor(
    @InjectRepository(Board)
    private readonly userRepository: Repository<Board>,
  ) {}
}

BoardRepository는 Repository<Board>를 의존성 주입을 통해 받아드리고 있다.

@InjectRepository(Board) 데코레이터는 TypeORM의 일부로, 해당 엔티티의 레포지토리를 주입하는 데 사용된다.

이 코드는 의존성 주입 패턴을 따르고 있고, 테스트 가능성과 결합도 감소 등의 이점을 제공한다.

 

 

취향에 맞게 선택해서 적용해보면 될 것 같다.

' > Nestjs' 카테고리의 다른 글

env파일 인식시키는 법  (0) 2023.06.14
Nestjs 환경에서 path alias 적용하는 법  (0) 2023.05.29