๋ชฉ๋ก๐ฉโ๐ป ๋ฐฑ์๋(Back-End)/Nest js (38)
๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?

=> ๋ฐ๋ผํ๋ฉด์ ๋ฐฐ์ฐ๋ NestJS ๐งธ PostgresSQL ์ค์นํ๊ธฐ : ๋ฐ์ดํฐ๋ฒ ์ด์ค https://www.postgresql.org/download/windows/ ๐ pgAdmin : ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ณด๋ ํด https://www.pgadmin.org/download/ ๐งธ TypeORM : node.js ์์ ์คํ๋๊ณ TypeScript ๋ก ์์ฑ๋ ๊ฐ์ฒด ๊ด๊ณํ ๋งคํผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ : ๋ชจ๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ ์ฒด๊ณ๋ฅผ ์๋์ผ๋ก ์์ฑ : ํ ์ด๋ธ ๊ฐ์ ๋งคํ (์ผ๋์ผ, ์ผ๋ ๋ค ๋ฐ ๋ค ๋๋ค) ๋ง๋ฆ : ๊ฐ๋จํ CLI ๋ช ๋ น์ ์ ๊ณต npm install pg typeorm @nestjs/typeorm --save ๐ ORM (Object Relational Mapping) : ๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ด..

=> ๋ฐ๋ผํ๋ฉด์ ๋ฐฐ์ฐ๋ NestJS ๐งธ ์ปค์คํ ํ์ดํ๋ฅผ ์ด์ฉํ ์ ํจ์ฑ ์ฒดํฌ : Pipe Transform ์ด๋ ์ธํฐํ์ด์ค๋ฅผ ์๋กญ๊ฒ ๋ง๋ค ์ปค์คํ ํ์ดํ์ ๊ตฌํํด์ค์ผ ํจ : Pipe Transform ์ธํฐํ์ด์ค๋ ๋ชจ๋ ํ์ดํ์์ ๊ตฌํํด์ค์ผ ํ๋ ์ธํฐํ์ด์ค : ๋ชจ๋ ํ์ดํ๋ transform() ๋ฉ์๋ ํ์ : NestJS ๊ฐ ์ธ์๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ๋จ ๐ transform() ๋ฉ์๋ : ๋ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ง : ์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ ์ฒ๋ฆฌ๊ฐ ๋ ์ธ์์ ๊ฐ (value) : ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ ์ธ์์ ๋ํ ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ ๊ฐ์ฒด -> transform() ๋ฉ์๋์์ return ๋ ๊ฐ์ Route ํธ๋ค๋ฌ๋ก ์ ํด์ง (์์ธ๊ฐ ์๊ธฐ๋ฉด ํด๋ผ์ด์ธํธ๋ก ์ ํด์ง) ๐งธ ์ปค์คํ ํ์ดํ๋ก ์ํ ๊ธฐ๋ฅ ๊ตฌํํ๊ธฐ : ์ํ๋ PU..
=> ๋ฐ๋ผํ๋ฉด์ ๋ฐฐ์ฐ๋ NestJS ๐งธ ํน์ ๊ฒ์๋ฌผ์ ์ฐพ์ ๋ ์๋ ๊ฒฝ์ฐ ๊ฒฐ๊ณผ๊ฐ ์ฒ๋ฆฌํ๊ธฐ : ์์ธ ์ธ์คํด์ค ์์ฑํ์ฌ ์๋ฌ ํ์ถํ๊ธฐ // ID๋ก ํน์ ๊ฒ์๋ฌผ ๊ฐ์ ธ์ค๊ธฐ getBoardById(id: string): Board { const found = this.boards.find((board) => board.id === id); // ํน์ ๊ฒ์๋ฌผ์ ์ฐพ์ ๋ ์๋ ๊ฒฝ์ฐ ๊ฒฐ๊ณผ๊ฐ ์ฒ๋ฆฌํ๊ธฐ // ์์ธ ์ธ์คํด์ค ์์ฑํ์ฌ ์๋ฌ ํ์ถ if (!found) { throw new NotFoundException(`Can't find Board with id ${id}`);; } return found; } ๐งธ ์๋ ๊ฒ์๋ฌผ์ ์ง์ธ ๊ฒฝ์ฐ ๊ฒฐ๊ณผ๊ฐ ์ฒ๋ฆฌํ๊ธฐ : ์์ธ ์ธ์คํด์ค ์์ฑํ์ฌ ์๋ฌ ํ์ถํ๊ธฐ // ID๋ก ํน์ ๊ฒ์๋ฌผ ์ญ..

=> ๋ฐ๋ผํ๋ฉด์ ๋ฐฐ์ฐ๋ NestJS ๐งธ NestJS PIPE : ํ์ดํ๋ @Injectable () ๋ฐ์ฝ๋ ์ดํฐ๋ก ์ฃผ์์ด ๋ฌ๋ฆฐ ํด๋์ค : data transformation ๊ณผ data validation ์ ์ํด์ ์ฌ์ฉ๋จ : ์ปจํธ๋กค๋ฌ ๊ฒฝ๋ก ์ฒ๋ฆฌ๊ธฐ์ ์ํด ์ฒ๋ฆฌ๋๋ ์ธ์์ ๋ํด ์๋ํจ : Nest ๋ ๋ฉ์๋๊ฐ ํธ์ถ๋๊ธฐ ์ง์ ์ ํ์ดํ๋ฅผ ์ฝ์ ํ๊ณ ํ์ดํ๋ ๋ฉ์๋๋ก ํฅํ๋ ์ธ์๋ฅผ ์์ ํ๊ณ ์ด์ ๋ํด ์๋ํจ ๐ data transformation : ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ํ๋ ํ์์ผ๋ก ๋ณํ ๐ data validation : ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ํ๊ฐํ๊ณ ์ ์ํ ๊ฒฝ์ฐ ๋ณ๊ฒฝ๋์ง ์์ ์ํ๋ก ์ ๋ฌ (๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ฌ ์ฒ๋ฆฌ) ๋ผ์ฐํฐ ํธ๋ค๋ฌ (Router Handler) ๊ฐ ์ฒ๋ฆฌํ๋ ์ธ์์ ๋ํด ์๋ํจ ํ์ดํ๋ ๋ฉ์๋๋ฅผ ๋ฐ๋ก ์ง์ ์..
=> ๋ฐ๋ผํ๋ฉด์ ๋ฐฐ์ฐ๋ NestJS ๐งธ ํน์ ๊ฒ์๋ฌผ์ ์ํ ์ ๋ฐ์ดํธ : ํน์ ๊ฒ์๋ฌผ์ ์ํ (public, private) ๋ฅผ ์ ๋ฐ์ดํธ ํด์ฃผ๋ ๊ธฐ๋ฅ์ ๊ตฌํ ๐ src/boards/boards.service.ts // ํน์ ๊ฒ์๋ฌผ์ ์ํ ์ ๋ฐ์ดํธ updateBoardUpdate(id: string, status: BoardStatus): Board { // ํน์ ๊ฒ์๋ฌผ ์ฐพ๊ธฐ const board = this.getBoardById(id); board.status = status; return board; } ๐ src/boards/boards.controller.ts // ํน์ ๊ฒ์๋ฌผ์ ์ํ ์ ๋ฐ์ดํธ @Patch("/:id/status") updateBoardSatus( @Param("id") id: st..
=> ๋ฐ๋ผํ๋ฉด์ ๋ฐฐ์ฐ๋ NestJS ๐งธ ID ๋ก ํน์ ๊ฒ์๋ฌผ ๊ฐ์ ธ์ค๊ธฐ find ์ฌ์ฉํ์ฌ id ์ด์ฉํ๊ธฐ // ID๋ก ํน์ ๊ฒ์๋ฌผ ๊ฐ์ ธ์ค๊ธฐ getBoardById(id: string): Board { return this.boards.find((board) => board.id === id); } ๐งธ ID ๋ก ํน์ ๊ฒ์๋ฌผ ์ญ์ ํ๊ธฐ filter ์ฌ์ฉํ์ฌ id ์ด์ฉํ๊ธฐ return ์ ์ฐ๊ธฐ ๋๋ฌธ์ void ์ฌ์ฉํจ // ID๋ก ํน์ ๊ฒ์๋ฌผ ์ญ์ ํ๊ธฐ deleteBoard(id: string): void { this.boards = this.boards.filter((board) => board.id !== id); }
=> ๋ฐ๋ผํ๋ฉด์ ๋ฐฐ์ฐ๋ NestJS ๐งธ DTO (Data Transfer Object) ๋ : ๊ณ์ธต๊ณผ ๋ฐ์ดํฐ ๊ตํ์ ์ํ ๊ฐ์ฒด : DB ์์ ๋ฐ์ดํฐ๋ฅผ ์ป์ด Service ๋ Controller ๋ฑ์ผ๋ก ๋ณด๋ผ ๋ ์ฌ์ฉํ๋ ๊ฐ์ฒด : DTO ๋ ๋ฐ์ดํฐ๊ฐ ๋คํธ์ํฌ๋ฅผ ํตํด ์ ์ก๋๋ ๋ฐฉ๋ฒ์ ์ ์ํจ : Interface ๋ class ๋ฅผ ์ด์ฉํ์ฌ ์ ์ ๋จ : ๋ฐ์ดํฐ ์ ํจ์ฑ์ ์ฒดํฌํ๋ ๋ฐ ํจ์จ์ + ๋ ์์ ์ ์ธ ์ฝ๋๋ก ๋ง๋ค์ด์ค : class ๋ ๋ฐํ์์์ ์๋ํ๊ธฐ ๋๋ฌธ์ ํ์ดํ ๊ธฐ๋ฅ ์ด์ฉ ์ ์ ์ฉํจ ๐ src/boards/dto/create-board.dto.js export class CreateBoardDto { title: string; description: string; } ๐ src/boards/boards...

=> ๋ฐ๋ผํ๋ฉด์ ๋ฐฐ์ฐ๋ NestJS ๐งธ ๊ฒ์๋ฌผ ์์ฑํ๊ธฐ (CRUD ์ C) : Controller : request, response ๋ Controller ์์ ์ฒ๋ฆฌํจ : Express ์์๋ bodyParser ๋ชจ๋์ ์ด์ฉํด์ req.body ์์ผ๋ก ํด๋ผ์ด์ธํธ์์ ๋ณด๋ด์จ ๊ฐ์ ๋ฐ์์ด : @Body body๋ฅผ ์ด์ฉํ์ฌ request ์์ ๋ณด๋ด์จ ๊ฐ์ ๊ฐ์ ธ์ด ๐ src/boards/boards.controller.ts // ๋ค์ด์ค๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ํด๋ผ์ด์ธํธ์ ์๋ต์ ๋ฐํํจ // @Controller ๋ฐ์ฝ๋ ์ดํฐ๋ก ํด๋์ค๋ฅผ ๋ฐ์ฝ๋ ์ด์ ํ์ฌ ์ ์ํจ // Handler : @Get, @Post, @Delete ๋ฑ๊ณผ ๊ฐ์ ๋ฐ์ฝ๋ ์ดํฐ๋ก ์ฅ์ ๋ ์ปจํธ๋กค๋ฌ ํด๋์ค ๋ด์ ๋จ์ํ ๋ฉ์๋ import { Body, Cont..