Nest는 TypeORM과 함께 사용하면 사용의 편의성이 아주 좋아진다.
특히, entity를 생성하기만 해도 몇가지 세팅만 하면 ORM을 아주 간편하게 할 수 있다.
그 중 entity를 관리하는 데 사용되는 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를 관리하는 것으로 정의할 수 있겠다.
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" };
}
}
}
Nest와 TypeORM에 그래도 조금씩 익숙해져 가는 중이다. 사용성이나 여러 기능적인 측면에서 개인적으로는 Sequelize보다 TypeORM이 더 나은 것 같다는 생각이 든다.