- TypeORM은 PostgreSQL, Oracle, Microsoft SQL Server, SQLite 뿐만 아니라 NoSQL 도 지원한다.
- 선택한 데이터베이스에 대해 연결된 클라이언트 API라이브러리를 설치만 해주면 된다.
- 이 중에서 MySQL을 연동 해보자.
step 1
$ yarn add @nestjs/typeorm typeorm mysql2
step 2
// app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'root',
database: 'test',
entities: [],
synchronize: true,
}),
],
})
export class AppModule {}
- 여기서 synchronize는 production 일 경우에는 false 옵션으로 꼭 바꿔주자! 안그러면 production data가 손실 될 수 있다.
- 중요한 정보는 env로 관리하자!
step 3
- 위 과정에 완료되면, TypeORM DataSource 및 EntityManager 객체를 전체 프로젝트에 주입할 수 있다. (모듈을 가져올 필요 없이)
- example
// app.module.ts
import { DataSource } from 'typeorm';
@Module({
imports: [TypeOrmModule.forRoot(), UsersModule],
})
export class AppModule {
constructor(private dataSource: DataSource) {}
}
Repository Pattern
- TypeORM은 Repository 디자인 패턴을 지원하며, 각 Entity에는 자체 Repository가 있다.
- 이를 계속하려면 하나 이상의 Entity가 필요하다. User Entity를 정의해보자.
// user.entity.ts
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
username: string;
@Column()
password: string;
}
- User Entity는 다른 디렉토리에 존재한다. 이 디렉토리에서는 UserModule과 관련된 모든 파일이 있다. 모델 파일을 보관할 위치를 결정은 가능하지만, 해당 모듈 디렉토리에 해당 도메인 근처에 생성하는것이 좋다.
- User Entity를 사용하려면 모듈 forRoot() 메서드 옵션에 Entity 배열에 삽입해서 TypeORM에게 사용을 알려줘야한다.
// user.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({
imports: [TypeOrmModule.forFeature([User])],
providers: [UsersService],
controllers: [UsersController],
})
export class UsersModule {}
- 위의 모듈은 forFeature() 메서드를 사용하여 현재 범위에 등록된 저장소를 정의한다.
- 이를 통해 @InjectRepository() 데코레이터를 사용하여 UserRepository를 UserService에 주입해줄 수 있다.