티스토리 뷰

반응형

[nestjs] 3. nestjs 환경에서 기본적인 CRUD(Create Read Update Delete) 완성하기

 

지난시간에 기본적인 TypeORM을 활용하여 데이터베이스연결까지 완성하였으니, 기본적인 CRUD(Create Read Update Delete)를 완성해보자.

 

여기서 테스트 프로젝트에서는 당장은 Update기능을 사용하진 않으니 Update기능을 제외하고 사용해보겠다.

 

[test.module.ts]

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Photo } from './entities/photo.entity';
import { TestController } from './test.controller';
import { TestService } from './test.service';

@Module({
  imports: [TypeOrmModule.forFeature([Photo])],
  providers: [TestService],
  controllers: [TestController],
})
export class TestModule {}

일단 providers에 Service, controllers에 Controller를 넣어주자

 

[test.entity.ts]

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

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

  @Column({ length: 500 })
  name: string;

  @Column({ nullable: true })
  description: string;
}

조금 복잡했던 entity를 다음과 같이 간소화하였다.

 

[test.dto.ts]

export interface ICreatePhotoDto {
  name: string;
  description?: string;
}

export interface IOutputDto {
  ok: boolean;
  error?: string;
}

@Post 시 생성 할 형식 ICreatePhotoDto와

@Delete 및 @Put등에서 사용할 IOutputDto를 생성하였다.

 

[test.service.ts]

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { ICreatePhotoDto, IOutputDto } from './dtos/photo.dto.interface';
import { Photo } from './entities/photo.entity';

@Injectable()
export class TestService {
  constructor(
    @InjectRepository(Photo)
    private readonly repository: Repository<Photo>,
  ) {}

  async create(createTodoDto: ICreatePhotoDto) {
    return this.repository.save(createTodoDto);
  }

  get(): Promise<Photo[]> {
    return this.repository.find();
  }

  getOne(id: number): Promise<Photo> {
    return this.repository.findOne({ id });
  }

  async getName(name: string): Promise<Photo> {
    return this.repository.findOne({ name: name });
  }

  async delete(id: number): Promise<IOutputDto> {
    try {
      console.log(id);
      const result = await this.repository.findOne({ id });
      console.log(result);
      if (result) {
        this.repository.delete({ id });
        return {
          ok: true,
        };
      } else {
        return {
          ok: false,
          error: 'already deleted',
        };
      }
    } catch (e) {
      return {
        ok: false,
        error: e,
      };
    }
  }
}

[test.controller.ts]

import { Body, Controller, Delete, Get, Param, Post } from '@nestjs/common';
import { ICreatePhotoDto, IOutputDto } from './dtos/photo.dto.interface';
import { Photo } from './entities/photo.entity';
import { TestService } from './test.service';

@Controller('test')
export class TestController {
  constructor(private readonly testService: TestService) {}

  @Post()
  async create(@Body() createPhotoDto: ICreatePhotoDto) {
    const returnValue = await this.testService.create(createPhotoDto);
    return returnValue;
  }

  @Get()
  getTest(): Promise<Photo[]> {
    return this.testService.get();
  }

  @Get('/:id')
  getTestOne(@Param('id') id: number): Promise<Photo> {
    return this.testService.getOne(id);
  }

  @Get('/name/:name')
  getTestOneName(@Param('name') name: string): Promise<Photo> {
    return this.testService.getName(name);
  }

  @Delete('/:id')
  delete(@Param('id') id: number): Promise<IOutputDto> {
    return this.testService.delete(id);
  }
}

기본적인 CRUD과정이라 특별한 설명은 생략하겠다.

추가적인 설명이라면

-Promise, async, await는 데이터베이스 처리를 위한 비동기 처리이다.

-IOutputDto는 만들지 않아도 상관없지만, 예외 발생시 설명을 위한 error string 변수를 추가한 것이다.

 

[github commit]

https://github.com/gofogo2/nest-js-api/commit/2d0bf9daa2b692e7487a1097a65917c611df37e4

 

add CRUD cycle · gofogo2/nest-js-api@2d0bf9d

Permalink This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository. Showing 6 changed files with 78 additions and 24 deletions. +0 −8 src/app.service.ts +9 −0 src/test/dtos/photo.dto.interface.ts

github.com

 

[소스코드]

https://github.com/gofogo2/nest-js-api.git

 

GitHub - gofogo2/nest-js-api

Contribute to gofogo2/nest-js-api development by creating an account on GitHub.

github.com

#nestjs #typescript #javascript #js #ts #api #controller #service #typeorm #database #mysql #postgres #sql #nestjs to db #crud #get #put #post #delete #api #api기본적인 로직 

반응형
댓글
반응형