[NestJS] CRUD 구현

올리브수
|2024. 1. 15. 22:58
728x90

In-Memory 방식의 구현

💡 우선 따로 DB 연동은 하지 않고 로컬 메모리와 연결하여 구현한다.

 

📄 boards.service.ts

@Injectable()
export class BoardsService {
  private boards = [];

  getAllBoards() {
    return this.boards;
  }
}

 

📄 boards.controller.ts

import { Controller, Get } from '@nestjs/common';
import { BoardsService } from './boards.service';

@Controller('boards')
export class BoardsController {
  constructor(private boardsService: BoardsService) {}

  @Get()
  getAllBoards() {
    return this.boardsService.getAllBoards();
  }
}
  1. 요청이 컨트롤러로 들어오고 컨트롤러에서 알맞는 요청 경로에 라우팅 하여 해당 핸들러로 간다.
  2. 이후, 해당 요청에 대한 처리를 위해 서비스로 들어가고 그에 맞는 로직을 서비스에서 처리해준 뒤 컨트롤러에서 리턴값을 보내어 컨트롤러에서 결과값을 받게된다.

 

 


Board

  • 구현 요구사항
    • 모든 게시물의 id는 유니크해야한다.
    • 게시물의 상태는 공개글 또는 비공개글로 존재한다.
    • status 필드에는 반드시 ‘public(공개)’ 또는 ‘private(비공개)’ 속성만 올 수 있으므로 enumerate로 구현한다.

 

Model

  • 게시물에 필요한 데이터를 정의하기 위한 모델을 생성한다.
    • Class 를 이용한 구현 : 변수 타입 체킹 및 인스턴스 생성
    • Interface 를 이용한 구현 : 변수 타입 체킹 (구조)

 

Post 구현방법

@Post()
  createBoard(@Body() body) {
    ...
}

@Post()
    createBoard(@Body('title') title: string, @Body('description') description: string){
      ...
}
  • Body 의 전체를 가져올 수 있고 특정 항목만 가져올 수도 있다.

 

 

DTO(Data Transfer Object)

  • 데이터 유효성 체크에 효율적이다.
  • 데이터의 프로퍼티를 명확히 명시해주면 만약 프로퍼티 값이 바뀌게 될 경우 전체를 모두 바꿔줘야하는 번거로운 일이 발생할 수도 있다. → 이를 DTO를 통해 해결 가능 !

 

  • DTO는 Class로 작성한다.
    • 인터페이스와 달리, 런타임에서 작동하기에 파이프 같은 기능을 이용할 때 유용하다.
    • ∴ 클래스를 사용해서 DTO를 작성한다.

 

 


Code

  • Project Structure

 

📄 dto/create-board.dto.ts

export class CreateBoardDto {
  title: string;
  description: string;
}

 

📄 boards.controller.ts

import {
  Controller,
  Get,
  Post,
  Delete,
  Patch,
  Body,
  Param,
} from '@nestjs/common';
import { BoardsService } from './boards.service';
import { Board } from './boards.model';
import { BoardStatus } from './boards.model';
import { CreateBoardDto } from './dto/create-board.dto';

@Controller('boards')
export class BoardsController {
  constructor(private boardsService: BoardsService) {}

  @Get()
  getAllBoards(): Board[] {
    return this.boardsService.getAllBoards();
  }

  @Post()
  createBoard(@Body() createBoardDto: CreateBoardDto): Board {
    return this.boardsService.createBoard(createBoardDto);
  }

  @Get('/:id')
  getBoardById(@Param('id') id: string) {
    return this.boardsService.getBoardById(id);
  }

  @Delete('/:id')
  deleteBoard(@Param('id') id: string) {
    this.boardsService.deleteBoard(id);
  }

  @Patch('/:id/status')
  updateBoardStatus(
    @Param('id') id: string,
    @Body('status') status: BoardStatus,
  ) {
    return this.boardsService.updateBoardStatus(id, status);
  }
}

 

📄 boards.model.ts

export interface Board {
  id: string;
  title: string;
  description: string;
  status: BoardStatus; // 공개 | 비공개
}

export enum BoardStatus {
  PUBLIC = 'PUBLIC',
  PRIVATE = 'PRIVATE',
}

 

📄 boards.module.ts

import { Module } from '@nestjs/common';
import { BoardsController } from './boards.controller';
import { BoardsService } from './boards.service';

@Module({
  controllers: [BoardsController],
  providers: [BoardsService],
})
export class BoardsModule {}

 

📄 boards.service.ts

import { Injectable } from '@nestjs/common';
import { Board, BoardStatus } from './boards.model';
import { v1 as uuid } from 'uuid';
import { CreateBoardDto } from './dto/create-board.dto';

@Injectable()
export class BoardsService {
  private boards: Board[] = [];

  getAllBoards() {
    return this.boards;
  }

  createBoard(createBoardDto: CreateBoardDto) {
    const { title, description } = createBoardDto;

    const board: Board = {
      id: uuid(),
      title, // title: title
      description, // description: description
      status: BoardStatus.PUBLIC,
    };

    this.boards.push(board);
    return board;
  }

  getBoardById(id: string): Board {
    return this.boards.find((board) => board.id === id);
  }

  deleteBoard(id: string): void {
    // id가 다른 것만 남겨둔다. -> 같은 것들은 지움
    this.boards = this.boards.filter((board) => board.id !== id);
  }

  updateBoardStatus(id: string, status: BoardStatus): Board {
    const board = this.getBoardById(id);
    board.status = status;
    return board;
  }
}

 

 

 

728x90

'🏠 Framework > NestJS' 카테고리의 다른 글

[NestJS] TypeORM  (21) 2024.01.15
[NestJS] Pipe 이용  (0) 2024.01.15
[NestJS] NestJS 기본 요소  (20) 2024.01.15
[NestJS] Overview  (0) 2023.06.28