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();
}
}
- 요청이 컨트롤러로 들어오고 컨트롤러에서 알맞는 요청 경로에 라우팅 하여 해당 핸들러로 간다.
- 이후, 해당 요청에 대한 처리를 위해 서비스로 들어가고 그에 맞는 로직을 서비스에서 처리해준 뒤 컨트롤러에서 리턴값을 보내어 컨트롤러에서 결과값을 받게된다.
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 |