[Nest.js] CRUD

채연·2023년 7월 16일
0

Node.js

목록 보기
14/16

create, research, update, delete 기능 구현하기

드디어 !!!

스웨거를 만들어보았다!!

전달 받기만 했었던 Swagger를 내가 직접 만들어볼 줄이야

내용 정리 Start!

Todo Module 생성

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TodoModule } from './todo/todo.module';

@Module({
  imports: [TodoModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

제일 처음 nest.js를 받으면 App.Module을 기반으로 모두 진행이 되도록 짜여져있을텐데, 우리는 Todo를 만들 것이므로 TodoModule을 가져와주고 import에 적용시켜준다!

폴더구조는 대충 이런식!

-> 이게 정답인지는 아직 모르겠지만 배워가면서 수정해나가야 할 것 같다

Todo Module

import { Module } from '@nestjs/common';
import { TodoController } from './controller/todo.controller';
import { TodoService } from './service/todo.service';
import { PrismaService } from '../prisma.service';

@Module({
  controllers: [TodoController],
  providers: [TodoService, PrismaService],
})
export class TodoModule {}

Todo Module에서는 Controller, Service 를 불러와준다.

nest.js는 MVC 패턴과 비슷한 구조를 가지는데, Controller는 클라이언트의 요청을 처리하고 응답을 반환하는 역할을 하며, Service는 비즈니스 로직을 수행하는 역할을 한다.

Create

Service에서 로직을 수행하면 Controller에서 적용시키는 식으로 진행이 되므로, Service 코드부터 작성해보겠닷

Service

import { BadRequestException, Injectable } from '@nestjs/common';
import { PrismaService } from '../../prisma.service';
import { Todo } from '@prisma/client';

@Injectable()
export class TodoService {
  // prisma를 사용할 것이므로 prisma 적용
  constructor(private prismaService: PrismaService) {}

  // 추가
  async addTodoItem(data: Todo): Promise<Todo> {
    // title은 필수 값이므로, title이 안 들어오면 Badrequest 에러를 띄워줌
    if (!data || !data.title) {
      throw new BadRequestException('Title is required to add a todo item.');
    }

    // title이 존재한다면 data에 title을 담고, 나머지는 선택 값으로 넣어준다. 값이 없으면 null 처리
    return this.prismaService.todo.create({
      data: {
        title: data.title,
        content: data.content || null,
        is_done: data.is_done || null,
      },
    });
  }
}

Controller

클라이언트에서 받은 값을 토대로 Service 로직을 적용시켜준다.

import { Controller, Post, Body } from '@nestjs/common';
import { TodoService } from '../service/todo.service';
import { Todo } from '@prisma/client';

@Controller('api/v1/todos')
export class TodoController {
  constructor(private readonly todoService: TodoService) {}
  
  // post 메소드 사용
  @Post()
  
  // client가 body로 전해준 값을 data에 저장시킴
  // 참고로 get 같이 파라미터에 오는 것들은 @Params
  async addTodoItem(@Body() data: Todo): Promise<Todo> {
    
    // addTodoItem(아까 service에서 만든 함수) 로 data를 보냄
    return this.todoService.addTodoItem(data);
  }
}

이렇게 하면 Create 뚝딱!

나머지 코드

나머지들도 같은 방식으로 적용시켜준다.

딱히 어려운 내용도 없고, 그냥 코드만 보면 어떻게 처리되는지 알 것 같아서 이것들은 따로 정리 하지 않으려 한다 (정리하는 시간이 아까운 느낌,,)

todo.controller.ts

import {
  Controller,
  Get,
  Delete,
  Post,
  Put,
  Body,
  Param,
} from '@nestjs/common';
import { TodoService } from '../service/todo.service';
import { Todo } from '@prisma/client';

@Controller('api/v1/todos')
export class TodoController {
  constructor(private readonly todoService: TodoService) {}

  // 전체 조회
  @Get()
  async fetchAllTodos(): Promise<Todo[]> {
    return this.todoService.fetchAllTodos();
  }

  // 단일 조회
  @Get(':id')
  async fetchTodoItem(@Param('id') id: number): Promise<Todo | null> {
    return this.todoService.fetchTodoItem(id);
  }

  @Delete(':id')
  async deleteTodoItem(@Param('id') id: number): Promise<Todo | null> {
    return this.todoService.deleteTodoItem(id);
  }

  @Post()
  async addTodoItem(@Body() data: Todo): Promise<Todo> {
    return this.todoService.addTodoItem(data);
  }

  @Put(':id')
  async updateTodoItem(
    @Param('id') id: number,
    @Body() data: Todo,
  ): Promise<Todo | null> {
    return this.todoService.updateTodoItem(
      id,
      data.title,
      data.content,
      data.is_done,
    );
  }
}

todo.service.ts

import { BadRequestException, Injectable } from '@nestjs/common';
import { PrismaService } from '../../prisma.service';
import { Todo } from '@prisma/client';

@Injectable()
export class TodoService {
  constructor(private prismaService: PrismaService) {}

  // 전체 조회
  async fetchAllTodos(): Promise<Todo[]> {
    return this.prismaService.todo.findMany();
  }

  // 단일 조회
  async fetchTodoItem(id: number): Promise<Todo | null> {
    return this.prismaService.todo.findUnique({ where: { id: Number(id) } });
  }

  // 삭제
  async deleteTodoItem(id: number): Promise<Todo | null> {
    return this.prismaService.todo.delete({ where: { id: Number(id) } });
  }

  // 아이템 수정
  async updateTodoItem(
    id: number,
    title: string,
    content: string,
    is_done: boolean,
  ): Promise<Todo | null> {
    return this.prismaService.todo.update({
      where: { id: Number(id) },
      data: {
        title: title,
        content: content,
        is_done: is_done,
      },
    });
  }

  // 추가
  async addTodoItem(data: Todo): Promise<Todo> {
    console.log(data);
    if (!data || !data.title) {
      throw new BadRequestException('Title is required to add a todo item.');
    }

    return this.prismaService.todo.create({
      data: {
        title: data.title,
        content: data.content || null,
        is_done: data.is_done || null,
      },
    });
  }
}
profile
Hello Velog

0개의 댓글