NestJS + TypeORM : Repository

Outclass·2022년 7월 19일
0

NestJS+GraphQL+TypeORM 

목록 보기
8/16

Nest는 TypeORM과 함께 사용하면 사용의 편의성이 아주 좋아진다.
특히, entity를 생성하기만 해도 몇가지 세팅만 하면 ORM을 아주 간편하게 할 수 있다.
그 중 entity를 관리하는 데 사용되는 Repository를 정리해본다.

Repository란?

먼저 TypeORM의 공식문서의 repository에 관한 설명이다.

Repository is just like EntityManager but its operations are limited to a concrete entity. You can access the repository via EntityManager. - TypeORM 공식문서

작동 범위만 다를 뿐 EntityManager와 같은 역할을 한다는 것 같다. EntityManager의 정의도 한 번 보자

Using EntityManager you can manage (insert, update, delete, load, etc.) any entity. - TypeORM 공식문서

다 본 건 아니지만, TypeORM의 공식문서의 설명은 대체로 간결하고 짤막한 것 같다. 아무튼 정리하자면 Repository의 역할은 Entity에 대한 CRUD를 관리하는 것으로 정의할 수 있겠다.

NestJS에서의 구현

Entity는 각각의 Repository를 가지고 있으며, 이에 접근하려면 아래와 같이 구현한다

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

@Module({
  imports: [
    ...
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: 'root',
      database: 'test',
      //여기에 Entity를 추가
      entities: [User],
      synchronize: true,
    }),
    ...
  ],
})
export class AppModule {}
//내가 사용할 모듈
//ex) users.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UsersService } from './users.service';
import { UsersController } from './users.controller';
import { User } from './user.entity';

@Module({
  //여기에 사용할 entity를 추가해줘야 한다.
  imports: [TypeOrmModule.forFeature([User])],
  providers: [UsersService],
  controllers: [UsersController],
})
export class UsersModule {}
//users.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';

@Injectable()
export class UsersService {
  constructor(
  	//데코레이터를 꼭 넣어줘야 한다.
    @InjectRepository(User)
   	//속성생성
    private users: Repository<User>,
  ) {}

  //메소드 예제
   async createAccount({
    email,
    password,
  }: CreateAccountInput): Promise<Output> {
    try {
      //불러온 repository에서 findOne등의 메소드를 호출하여 사용할 수 있다
      //findOne 문법 변경된 부분 : where명시
      //DB에서 유저 불러오기
      const exists = await this.users.findOne({ where: { email } });
      if (exists) {
        return { ok: false, error: 'There is a user with that email already' };
      }
      //계정생성 예시
      await this.users.save(
        this.users.create({ email, password }),
      );
      return { ok: true };
    } catch (e) {
      return { ok: false, error: "Couldn't create account" };
    }
  }

}
  • 레포지토리 사용을 위해 @InjectRepository() 데코레이터를 넣어줘야 한다
  • 참고로 findOne메소드는 문법이 변경되어 조건에 where을 명시해줘야 한다.

Nest와 TypeORM에 그래도 조금씩 익숙해져 가는 중이다. 사용성이나 여러 기능적인 측면에서 개인적으로는 Sequelize보다 TypeORM이 더 나은 것 같다는 생각이 든다.

profile
When you stop having big dreams that’s when you’ve died, despite not being buried yet.

0개의 댓글