Backend Roadmap/Web

[TypeORM] EntityRepository is deprecated 해결하기

jungeun919 2024. 7. 2. 09:55

TypeORM 0.3.x 버전에서 @EntityRepository 데코레이터를 사용하여 Repository를 생성하려고 하면 'EntityRepository' is deprecated 오류가 발생하는 것을 볼 수 있습니다.

0.3.x 버전부터 @EntityRepositry를 Deprecate한 이유

@EntityRepositry 사용을 Deprecate한 주된 이유는 개발자 커뮤니티 내에서 나타난 다양한 구현상의 문제점과 설계 철학의 변화 때문이라고 합니다.

먼저 @EntityRepository를 사용하면, 특정 엔티티에 대한 쿼리 로직이나 비즈니스 로직이 하나의 클래스 내에 혼합될 수 있습니다. 이는 단일 책임 원칙을 위배하는 것으로 간주되며, 결과적으로 코드의 유지보수성이 저하될 수 있습니다.

또한, 다른 ORM 라이브러리들과의 일관성을 유지도 한 목표입니다. 대부분의 ORM 라이브러리들은 Repository 패턴을 보다 유연하고 확장 가능한 방식으로 구현하는 경향이 있습니다. 따라서 Custom Repository 클래스를 직접 정의하거나 Active Record Pattern 사용을 권장하여 자신의 애플리케이션에 최적화된 데이터 접근 패턴을 구현하도록 장려하고 있습니다.

Custom Repository를 통해 해결하기

@EntityRepository의 deprecation을 대응하기 위해 Custom Repository 클래스를 직접 정의하는 방식을 통해 해결했습니다.

1) boards.repository.ts 변경

  • @Injectable() 데코레이터를 사용하여 해당 클래스(BoardRepository)를 서비스로 인식하게 합니다.
  • Typeorm의 Repository를 상속받음으로써, TypeORM의 모든 데이터 접근 메서드를 BoardRepository 내에서 직접 사용할 수 있게 해줍니다.
  • Datasource의 인스턴스를 생성자를 통해 받아, 명시적으로 Board 엔티티와 연결합니다.

[before]

import { DataSource, EntityRepository, Repository } from "typeorm";
import { Board } from "./board.entity";
import { Injectable } from "@nestjs/common";

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


[after]

import { DataSource, Repository } from "typeorm";
import { Board } from "./board.entity";
import { Injectable } from "@nestjs/common";

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

 

2) boards.service.ts 변경

  • findOne 메소드를 사용할 때 { where: {id} } 와 같이 명시적인 쿼리 조건을 제공합니다.

[before]

import { Injectable, NotFoundException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { BoardRepository } from './board.repository';
import { Board } from './board.entity';

@Injectable()
export class BoardsService {
	constructor(
		@InjectRepository(BoardRepository)
		private boardRepository: BoardRepository
	) {}
  
  	// ...
  
  	async getBoardById(id: number): Promise<Board> {
		const found = await this.boardRepository.findOne(id);

		if (!found) {
			throw new NotFoundException(`Can't find Board with id ${id}`);
		}

		return found;
	}
}


[after]

import { NotFoundException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { BoardRepository } from './board.repository';
import { Board } from './board.entity';

export class BoardsService {
	constructor(
		@InjectRepository(BoardRepository)
		private boardRepository: BoardRepository
	) {}
  
  	// ...
  
  	async getBoardById(id: number): Promise<Board> {
		const found = await this.boardRepository.findOne({ where: {id} });

		if (!found) {
			throw new NotFoundException(`Can't find Board with id ${id}`);
		}

		return found;
	}
}

 

3) boards.module.ts 변경

  • TypeOrmModule.forFeature([Board])를 통해 해당 엔티티에 대한 작업을 할 수 있게 TypeORM과 연결한다는 것을 의미합니다.
  • BoardRepository를 providers 배열에 추가함으로써, custom 메서드를 포함한 리포지토리를 사용할 수 있게 됩니다
  • NestJS의 DI(Dependency Injection)를 통해 BoardRepository를 주입할 수 있게 했습니다.

[before]

import { Module } from '@nestjs/common';
import { BoardsController } from './boards.controller';
import { BoardsService } from './boards.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { BoardRepository } from './board.repository';

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


[after]

import { Module } from '@nestjs/common';
import { BoardsController } from './boards.controller';
import { BoardsService } from './boards.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { BoardRepository } from './board.repository';
import { Board } from './board.entity';

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

 

Ref

'Backend Roadmap > Web' 카테고리의 다른 글

사용자 인증을 관리하는 방법  (0) 2024.07.02