본문 바로가기

STUDY/Node.js

NestJS | API 만들기 (1) - Repository

데이터베이스 connection 방법

Repository Pattern

TypeORM이 Repository Pattern을 지원하기 때문에 Entity와 Repository를 사용할 수 있다.

Entity

@Entity를 포함한 엔티티 관련 데코레이터도 TypeORM이 지원해준다.

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

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

  @Column()
  name: string;

  @Column()
  address: string;
}

Custom Repository

리포지토리를 만들건데, Custom repository로 만들어 본다. 커스텀 리포지토리는 리포지토리 클래스를 확장할 수 있다.

커스텀 리포지토리는 데이터베이스와 소통하는 메서드를 리포지토리에 생성할 수 있다.
즉, 기본적으로 지원하는 CRUD외에 다른 메서드를 만들 수 있게 된다.

커스텀 리포지토리를 만들 때는 @EntityRepository데코레이터를 사용하고, 기본 Repository클래스를 상속받아 확장한다.

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

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

Nest에 위임

위에서 만든 리포지토리를 Nest에게 알려준다..
TypeOrmModule.forFeature메서드를 사용해 리포지토리 클래스를 전달한다.

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UserRepository } from './entity/user.repository';
import { UserService } from './service/user.service';
import { UserController } from './user.controller';

@Module({
  imports: [TypeOrmModule.forFeature([UserRepository])],
  controllers: [UserController],
  providers: [UserService],
})
export class UserModule {}

Service

서비스클래스의 생성자에서 리포지토리 의존관계 주입을 한다.

커스텀 리포지토리는 @InjectRepository데코레이터를 사용하지 않는다.

import { Injectable } from '@nestjs/common';
import { UserRepository } from '../entity/user.repository';

@Injectable()
export class UserService {
  constructor(private userRepository: UserRepository) {}
}

Custom Repository를 사용하지 않는다면..

리포지토리 클래스를 작성할 필요 없다. TypeOrmModule.forFeature메서드에 엔티티를 전달한다.

@Module({
  imports: [TypeOrmModule.forFeature([User])],
  controllers: [UserController],
  providers: [UserService],
})
export class UserModule {}

그리고 서비스 클래스에서 의존관계 주입 시, @InjectRepository데코레이터를 사용한다.

@Injectable()
export class UsersService {
  constructor(
    @InjectRepository(User)
    private usersRepository: Repository<User>,
  ) {}
}