[TIL] NestJS 공부 22일차

사용자 전용 레포지토리

TypeORM에서 제공하는 기능으로 기능은 기본 리포지토리 클래스를 확장 및 풍부하게 만들어준다.

사용방법

우선 생성을 위해선 @EntityRepository()데코레이터를 이용하고 Repositoryclass를 확장해줘야한다.

@EntityRepository(Author)
export class AuthorRepository extends Repository<Author> {}

위 코드처럼 사용된다.

클래스를 한번 만들면 다음 단계는 네스트에게 인스턴스화 책임을 전달해야한다.
그렇기위해서 AuthorRepository클래스를 TypeORM.forFeature메서드로 넘겨줘야한다.

@Module({
  imports: [TypeOrmModule.forFeature([AuthorRepository])],
  controller: [AuthorController],
  providers: [AuthorService],
})
export class AuthorModule {}

예시다.

@Injectable()
export class AuthorService {
  constructor(private authorRepository: AuthorRepository) {}
}

마지막으로 생성자로 넘겨주면 끝난다.

비동기 구성

리포 모듈 옵션을 정적이 아닌 비동기로 구성할 수 있는데,
forRootAsync()를 이용하는 것이다.
첫 번째 방법은 팩토리 방식이다.

TypeOrmModule.forRootAsync({
  useFactory: () => ({
    type: 'mysql',
    host: 'localhost',
    port: 3306,
    username: 'root',
    password: 'root',
    database: 'test',
    entities: [__dirname + '/**/*.entity{.ts,.js}'],
    synchronize: true,
  }),
});
TypeOrmModule.forRootAsync({
  imports: [ConfigModule],
  useFactory: (configService: ConfigService) => ({
    type: 'mysql',
    host: configService.get('HOST'),
    port: +configService.get<number>('PORT'),
    username: configService.get('USERNAME'),
    password: configService.get('PASSWORD'),
    database: configService.get('DATABASE'),
    entities: [__dirname + '/**/*.entity{.ts,.js}'],
    synchronize: true,
  }),
  inject: [ConfigService],
});

저 팩토리는 asyncinject를 이용하여 다른 비동기 제공자처럼 작동한다.

두 번째 방법은 userClass를 사용하는 것이다.

TypeOrmModule.forRootAsync({
  useClass: TypeOrmConfigService,
});

위 생성은 TypeOrmConfigServiceTypeOrmModule을 이용하여 인스턴스화 시킨 것이다.

좋은 웹페이지 즐겨찾기