프레임워크/TypeORM

TypeORM에서 Custom Repository 쓰기

SpaceCowboy 2023. 2. 1. 22:03

참고

우선 기본적으로 다음과 같은 entity가 있다고 가정하고 진행하겠다.

import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string; 
}

TypeORM 0.2.x 버전에서의 custom repository

import { EntityRepository, Repository } from "typeorm";
import { User } from "./entity/user.entity";

@EntityRepository(User)
export class UserRepository extends Repository<User>{}

TypeORM에서 제공되는 @EntityRepository 데코레이터로 간단하게 구현할 수 있다.

다만, TypeORM 0.3.x 버전부터는 deprecated 되었고 사용이 불가능하다. 따라서 위와 비슷하게 구현하기 위해서 여러가지 방법이 나오고 있다.

TypeORM 0.3.x 버전에서의 custom repository

여러가지 방법으로 구현할 수 있겠지만 내가 본 것 중에서 그나마 간단하면서 기존의 @EntityRepository를 쓴 custom repository와 비슷하게 구현할 수 있는 방법을 설명하겠다.

우선 결론적으로 repository class는 다음과 같이 구현하면 된다.

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

@Injectable()
export class UserRepository extends Repository<User> {
    constructor(
        @InjectRepository(UserEntity)
        private readonly repository: Repository<User>
    ) {
        super(repository.target, repository.manager, repository.queryRunner);
    }

   // 원하는 메서드 알아서 작성
}

이제 UserRepository를 다른 Service class에서 쓰기 위해서는 Module에 등록을 해야한다.

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './user.entity';

@Module({
  imports: [TypeOrmModule.forFeature([User])], // here we provide the TypeOrm support as usual, specifically for our UserEntity in this case
  providers: [UserRepository], // 모듈의 providers 배열에 UserRepository class 등록 
  exports: [UserRepository] // 다른 모듈에서 쓸 수 있도록 exports 배열에 UserRepository class를 등록
})
export class UserModule {}