์์ ์ PC ๊ฐ ๋ฐ๋์ด ์๋ก์ด PC์ ํ๋ก์ ํธ๋ฅผ ์ค์ ํด์ผ ํ๋ค.
git์ nestjs-board-app์ ์
๋ก๋ ํด๋์์ gitclone ์ผ๋ก ํ๋ก์ ํธ๋ฅผ ์ด๊ณ
cmd ์ 'nest i -g @nest/cli' ์คํ ํ ํ๋ก์ ํธ๋ฅผ ์ด์ด๋ณด๋ main.ts ์ ์ค๋ฅ๊ฐ ๋ ์์๋ค..
Cannot find module '@nestjs/core' or its corresponding type declarations.
๋ผ๋ ์ค๋ฅ์๊ณ , ์ฝ๊ฒ ํด๊ฒฐ ํ ์ ์์๋ค.
terminal ์ 'npm install @nestjs/core'์ 'npm install @nestjs/common' ์ ์
๋ ฅํ์ฌ ํด๊ฒฐํ์๋ค.
๋ก์ง์ Service์์ ๊ตฌํ. ๋ฐ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๋ํด์ ํ๋ฉด ๋์ง๋ง ์ฒ์๋ถํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐํด์ ํ๋ฉด ํท๊ฐ๋ฆด์์๊ธฐ ๋๋ฌธ์ ์ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ก์ปฌ ๋ฉ๋ชจ๋ฆฌ์ ๋ด์์ ์ฒ๋ฆฌ
<board.service.ts>
import { Injectable } from '@nestjs/common';
@Injectable()
export class BoardsService {
private boards =[];
getAllBoards(){
return this.boards;
}
}
private boards์ private ์ฌ์ฉ ์ด์ : ์ฌ์ฉํ์ง ์์ผ๋ฉด ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ ์ด BoardsService์ ์ ๊ทผํด์ ์ด boards ๋ฐฐ์ด ๊ฐ์ ์์ ํ ์ ์๊ธฐ ๋๋ฌธ
<board.controller.ts>
import { Controller, Get } from '@nestjs/common';
import { BoardsService } from './boards.service';
@Controller('boards')
export class BoardsController {
constructor(private boardService: BoardsService) {}
@Get()
getAllBoard() {
return this.boardService.getAllBoards;
}
}
'npm run start:dev' ๋ก ์คํ, localhost:3000/boards ํ์ธ
=> ํด๋ผ์ด์ธํธ์์ ์์ฒญ์ ๋ณด๋ด๋ฉด ๋จผ์ ์ปจํธ๋กค๋ฌ๋ก ๊ฐ๋ฉฐ ์ปจํธ๋กค๋ฌ์์ ์๋ง์ ์์ฒญ ๊ฒฝ๋ก์
๋ผ์ฐํ
ํด์ ํด๋น ํธ๋ค๋ฌ๋ก ๊ฐ๊ฒ ํ๋ค. ๊ทธ๋ฐ ํ์ ์์ฒญ์ ์ฒ๋ฆฌํด์ฃผ๊ธฐ ์ํด์ ์๋น์ค๋ก ๋ค์ด๊ฐ๋ฉฐ ๊ทธ ์์ฒญ์ ๋ง๋ ๋ก์ง์ ์๋น์ค์์ ์ฒ๋ฆฌํด์ค ํ ์ปจํธ๋กค๋ฌ์ ๋ฆฌํด๊ฐ์ ๋ณด๋ด์คํ ์ปจํธ๋กค๋ฌ์์ ํด๋ผ์ด์ธํธ๋ก ๊ฒฐ๊ณผ๊ฐ์ ๋ณด๋ด์ค๋ค.
์ปจํธ๋กค๋ฌ์์๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ๊ฒฐ๊ณผ๊ฐ์ ๋ฆฌํดํด์ฃผ๋ ์ญํ ์ ํ๋ค.
๊ฒ์๋ฌผ ๋ฐ์ดํฐ์๋ ID๊ฐ ํ์ํ๊ณ ์ด๋ฆ์ด๋ ์ค๋ช
๋ฑ์ด ํ์ ํ๋ค๋ ์ ์๋ฅผ ํ ๋๋ก ์์!
Class๋ฅผ ์ด์ฉํ๊ฑฐ๋ Interface ์ด์ฉ
์ฐ์ Interface ์ฌ์ฉ
<board.model.ts>
export interface Board{
id : string,
title : string,
dedcription: string,
status: BoardStatus; //PUBLIC or PRIVATE
}
export enum BoardStatus {
PUBLIC = 'PUBLIC',
PRIVATE ='PRIVATE'
}
์์ฑํ Board ๋ชจ๋ธ์ ์ด์ฉํด์ ํ์
์ ์ ์ โฌ
<boards.service.ts>
import { Injectable } from '@nestjs/common';
import { Board } from './board.model';
@Injectable()
export class BoardsService {
private boards: Board[] = []; // ๋ฐฐ์ด์ฃผ์
getAllBoards(): Board[] { //๋ฐฐ์ด์ฃผ์
return this.boards;
}
}
<boards.controller.ts>
import { Controller, Get } from '@nestjs/common';
import { BoardsService } from './boards.service';
import { Board } from './board.model';
@Controller('boards')
export class BoardsController {
constructor(private boardsService: BoardsService) {}
@Get('/')
getAllBoard(): Board[] { //๋ฐฐ์ด์ฃผ์
return this.boardsService.getAllBoards();
}
}
๊ฒ์๋ฌผ์ ๊ดํ ๋ก์ง์ ์ฒ๋ฆฌํ๋ ๋ถ๋ถ์ Service , Service ์์ ์ฒ๋ฆฌ ํ Controller์์ ์๋น์ค๋ฅผ ํธ์ถ
id ๋ ๋ชจ๋ ๊ฒ์๋ฌผ์ ์ ๋ํฌ ํด์ผํ๋ค. ๋ง์ฝ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ฃผ๋ ๊ฒฝ์ฐ๋ผ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์์์ ์ ๋ํฌํ ๊ฐ์ ์ฃผ์ง๋ง ์ง๊ธ์ ์์๋ก ๊ฐ์ ์ฃผ์ด์ผํจ
=> uuid ๋ชจ๋์ ์ด์ฉ
npm install uuid --save
service ์ 'import { v1 as uuid } from 'uuid';' ์ถ๊ฐ
<boards.service.ts>
import { Injectable } from '@nestjs/common';
import { Board, BoardStatus } from './board.model';
import { v1 as uuid } from 'uuid';
@Injectable()
export class BoardsService {
private boards: Board[] = [];
getAllBoards(): Board[] {
return this.boards;
}
createBoard(title: string, description: string){
const board: Board={
id: uuid(),
//title: title -> ๊ทธ๋ฅ title๋ก ์๋ต๊ฐ๋ฅ : ์๋ค ๋ณ์๋ช
์ด ๋์ผ
title,
// description: description
description,
status: BoardStatus.PUBLIC
}
//๊ฒ์ํ์ ๊ฒ์๊ธ ์์ฑํ ๊ฒ์ ๋ฃ์ด์ฃผ๊ธฐ
this.boards.push(board);
return board;
}
}
controller ์ ์ ์
ํด๋ผ์ด์ธํธ์์์ ์ ๋ณด ๋ฐ์์ค๊ธฐ
=> @Body body ..
<boards.controller.ts>
import { Body, Controller, Get, Post } from '@nestjs/common';
import { BoardsService } from './boards.service';
import { Board } from './board.model';
@Controller('boards')
export class BoardsController {
constructor(private boardsService: BoardsService) {}
@Get('/')
getAllBoard(): Board[] {
return this.boardsService.getAllBoards();
}
//body ์ ์ฒด ํ๋ฒ์ ๊ฐ์ ธ์ค๊ธฐ
// @Post()
// createBoard(@Body() body) {
// console.log('body', body);
// }
//body ์ ํน์ ๊ฐ๋ง ๊ฐ์ ธ์ค๊ธฐ
// @Post()
// createBoard(@Body('title') title: string, @Body('description') description: string) {
// console.log('title', title);
// console.log('description', description);
// }
@Post()
createBoard(@Body('title') title: string, @Body('description') description: string): Board { //return ๊ฐ์ ํ์
์ Board, Board[]๋ก ์ฃผ๋ฉด ์๋จ : service์ createBoard์ return ๊ฐ์ด board ํ๋์ด๊ธฐ ๋๋ฌธ์
return this.boardsService.createBoard(title, description);
}
}
์์ ์ฃผ์ ์ค์!!
- ๊ณ์ธต๊ฐ ๋ฐ์ดํฐ ๊ตํ์ ์ํ ๊ฐ์ฒด
- DB์์ ๋ฐ์ดํฐ๋ฅผ ์ป์ด Service๋ Controller ๋ฑ์ผ๋ก ๋ณด๋ผ ๋ ์ฌ์ฉํ๋ ๊ฐ์ฒด
- DTO๋ ๋ฐ์ดํฐ๊ฐ ๋คํธ์ํฌ๋ฅผ ํตํด ์ ์ก๋๋ ๋ฐฉ๋ฒ์ ์ ์ํ๋ ๊ฐ์ฒด
- interface๋ class๋ฅผ ์ด์ฉํด์ ์ ์ ๋ ์ ์๋ค. (ํ์ง๋ง ํด๋์ค๋ฅผ ์ด์ฉํ๋๊ฒ์ Nest JS์์๋ ์ถ์ฒ)
ํ๋กํผํฐ(title, description...)๊ฐ ๋ง์ ๋ ํ๋กํผํฐ์ ์ด๋ฆ์ ๋ฐ๊ฟ์ผํ๋ค๋ฉด controller, service ๋ฑ ์ฌ๋ฌ ๊ณณ์์ ๋ฐ๊ฟ์ค์ผํ๋ค.
=> ์ ์ง๋ณด์๊ฐ ํ๋ฆ => DTO ์ฌ์ฉ
ํด๋์ค๋ ์ธํฐํ์ด์ค์ ๋ค๋ฅด๊ฒ ๋ฐํ์์์ ์๋ํ๊ธฐ ๋๋ฌธ์ ํ์ดํ ๊ฐ์ ๊ธฐ๋ฅ์ ์ด์ฉํ ๋ ๋ ์ ์ฉํ๋ค.
=> ํด๋์ค๋ฅผ ์ฌ์ฉํด์ DTO๋ฅผ ์์ฑ
<create-board.dto.ts>
export class createBoardDto{
title: string;
description: string;
}
<boards.controller.ts>
import { Body, Controller, Get, Post } from '@nestjs/common';
import { BoardsService } from './boards.service';
import { Board } from './board.model';
import { createBoardDto } from './dto/create-board.dto';
@Controller('boards')
export class BoardsController {
constructor(private boardsService: BoardsService) {}
@Get('/')
getAllBoard(): Board[] {
return this.boardsService.getAllBoards();
}
//body ์ ์ฒด ํ๋ฒ์ ๊ฐ์ ธ์ค๊ธฐ
// @Post()
// createBoard(@Body() body) {
// console.log('body', body);
// }
//body ์ ํน์ ๊ฐ๋ง ๊ฐ์ ธ์ค๊ธฐ
// @Post()
// createBoard(@Body('title') title: string, @Body('description') description: string) {
// console.log('title', title);
// console.log('description', description);
// }
@Post()
createBoard(
@Body() createBoardDto: createBoardDto
): Board { //return ๊ฐ์ ํ์
์ Board, Board[]๋ก ์ฃผ๋ฉด ์๋จ : service์ createBoard์ return ๊ฐ์ด board ํ๋์ด๊ธฐ ๋๋ฌธ์
return this.boardsService.createBoard(createBoardDto);
}
}
<boards.service.ts>
import { Injectable } from '@nestjs/common';
import { Board, BoardStatus } from './board.model';
import { v1 as uuid } from 'uuid';
import { createBoardDto } from './dto/create-board.dto';
@Injectable()
export class BoardsService {
private boards: Board[] = [];
getAllBoards(): Board[] {
return this.boards;
}
createBoard(createBoardDto: createBoardDto){
// const title = createBoardDto.title;
// const description = createBoardDto.description;
const { title, description }= createBoardDto;
const board: Board={
id: uuid(),
//title: title -> ๊ทธ๋ฅ title๋ก ์๋ต๊ฐ๋ฅ : ์๋ค ๋ณ์๋ช
์ด ๋์ผ
title,
// description: description
description,
status: BoardStatus.PUBLIC
}
//๊ฒ์ํ์ ๊ฒ์๊ธ ์์ฑํ ๊ฒ์ ๋ฃ์ด์ฃผ๊ธฐ
this.boards.push(board);
return board;
}
}
service -> controller
<service.ts>
getBoardIs(id: string): Board{ //๊ฒ์๋ฌผ ํ๋๋ฅผ return ํ๊ธฐ ๋๋ฌธ์ Board[] X
return this.boards.find((board)=>board.id === id);
}
<controller.ts>
@Get('/:id')
getBoardById(@Param('id') id: string): Board{
return this.boardsService.getBoardId(id);
}
//ex) localhost:3000?id=11111 ์ผ ๋๋
findOne(@Param('id') id: string)
//ex) localhost:3000?id=11111&title=abcd ์ผ ๋๋
findOne(@Param() params: string[])
service -> controller
<service.ts>
deleteBoard(id: string): void{ // return ์ ๋ฐ๋ก ์ฃผ์ง ์์๋ ๋๊ธฐ ๋๋ฌธ์ void
this.boards = this.boards.filter((board) => board.id !==id);
}
<controller.ts>
@Delete('/:id')
deleteBoard(@Param('id') id: string): void {
this.boardsService.deleteBoard(id);
}
ํน์ ๊ฒ์๋ฌผ์ ์ํ(PUBLIC ๋๋ PRIVATE)์ ์
๋ฐ์ดํธ ํด์ฃผ๋ ๊ธฐ๋ฅ
<service.ts>
updateBoardStatus(id:string, status: BoardStatus):Board {
const board = this.getBoardId(id);
board.status = status;
return board;
}
<controller.ts>
@Patch('/:id/status')
updateBoardStatus(
@Param('id') id: string,
@Body('status') status: BoardStatus
) {
return this.boardsService.updateBoardStatus(id, status);
}
ํฌ