1. Entity
- 말 그대로 엔티티의 테이블 행을 말한다.
2. Generic Repository
- DB 테이블 전체를 관리하는 클래스
- 테이블의 CRUD 작업을 한다: TypeORM 사용
3. Specific Repository Class
- 특정 기능을 요하는 custom class
@Controller('/events')
export class EventsController {
constructor(
@InjectRepository(Event)
private readonly repository: Repository<Event>,
) {}
...
컨트롤러 내부에 메소드를 작성한다.
리팩토링 전
@Get()
findAll() {
return this.events;
}
리팩토링 후
@Get()
async findAll() {
return await this.repository.find();
}
리팩토링 전
@Get(':id')
findOne(@Param('id') id) {
const event = this.events.find((event) => event.id === parseInt(id));
return event;
}
리팩토링 후
@Get(':id')
async findOne(@Param('id') id) {
return await this.repository.findOne(id);
}
리팩토링 전
@Post()
create(@Body() input: CreateEventDto) {
const event = {
...input,
when: new Date(input.when),
id: this.events.length + 1,
};
this.events.push(event);
return event;
}
리팩토링 후
@Post()
async create(@Body() input: CreateEventDto) {
return await this.repository.save({
...input,
when: new Date(input.when),
});
}
리팩토링 전
@Patch(':id')
update(@Param('id') id, @Body() input: UpdateEventDto) {
const index = this.events.findIndex((event) => event.id === parseInt(id));
this.events[index] = {
...this.events[index],
...input,
when: input.when ? new Date(input.when) : this.events[index].when,
};
return this.events[index];
}
리팩토링 후
@Patch(':id')
async update(@Param('id') id, @Body() input: UpdateEventDto) {
// 1. 저장된 entity를 불러와야 한다.
const event = await this.repository.findOne(id);
// 2. entity를 수정한 후 return한다.
return await this.repository.save({
...event,
...input,
when: input.when ? new Date(input.when) : event.when,
});
}
리팩토링 전
@Delete(':id')
@HttpCode(204)
remove(@Param('id') id) {
this.events = this.events.filter((event) => event.id !== parseInt(id));
}
리팩토링 후
@Delete(':id')
@HttpCode(204)
async remove(@Param('id') id) {
const event = await this.repository.findOne(id);
await this.repository.remove(event);
}
repository를 주입하기 위해 모듈에도 임포트 해줘야 한다.
@Module({
imports: [
TypeOrmModule.forRoot(ormConfig),
TypeOrmModule.forFeature([Event]),
],
controllers: [AppController, EventsController],
providers: [AppService],
})
export class AppModule {}
TypeOrmModule.forFeature([엔티티])를 추가해준다.