๋ชฉ๋ก๐ฉ๐ป ๋ฐฑ์๋(Back-End)/Nest js (38)
๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
=> NestJs JWT - Access Tokens & Refresh Tokens - Ultimate Guide ๐ฅ๏ธ ์ด๊ธฐ ํ๊ฒฝ ์ค์ nest new AuthNest npm add -D prisma@latest npm add @prisma/client npx prisma studio npx prisma init โก๏ธ Prisma : SQL ์ฝ๋๋ฅผ ์ฐ์ง ์๊ณ , js์ฝ๋(typescript๋ ๊ฐ๋ฅ)๋ฅผ ์์ฑํด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ ํ ์ ์๋๋ก ์ฐ๊ฒฐํด์ฃผ๋ ์๋น์ค ์ฐจ์ธ๋ Node.js์ TypeScript ORM! ๊ธฐ์กด ORM์ ๊ฐ์ฒด ์งํฅ ๋ฐฉ์์ผ๋ก ๊ด๊ณํ ๋ฐ์ดํฐ ๋ฒ ์ด์ค ํ ์ด๋ธ์ ๋งคํ Prisma shcema์ ์ ์ธ์ ์ธ ๋ชจ๋ธ์ ์ ์ํด์ ๋ณต์กํ ๋ชจ๋ธ ์ธ์คํด์ค๋ฅผ ๊ด๋ฆฌํ๋๋ฐ ์์ ํ๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ Prisma Cli..
=> ๋ฐ๋ผํ๋ฉด์ ๋ฐฐ์ฐ๋ NestJS ๐งธ ์ค์ (Configuration) runtime ๋์ค์ ๋ฐ๋๋ ๊ฒ์ด ์๋, ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ํ ๋ ๋ก๋๊ฐ ๋์ด ๊ทธ ๊ฐ๋ค์ ์ ์ ์ค์ ํ์ผ์ ์ฌ๋ฌ๊ฐ์ง ํ์ผ ํ์์ ์ฌ์ฉ (XML, JSON, YAML, Environmant, Varaiables) ๐งธ Codebase VS Environment Variables (ํ๊ฒฝ๋ณ์) XML, JSON, YAML : Codebase ์ ํด๋น & ํ๊ฒฝ ๋ณ์ => ๋๋๋ ์ด์ : ๋น๋ฐ๋ฒํธ์ API KEY ๊ฐ์ ๋จ๋ค์๊ฒ ๋ ธ์ถ๋๋ฉด ์๋๋ ์ ๋ณด๋ฅผ ์ฃผ๋ก ํ๊ฒฝ ๋ณ์๋ก ์ฒ๋ฆฌ ๐ Codebase : ์ผ๋ฐ์ ์ผ๋ก Port ์ฒ๋ผ ๋ ธ์ถ๋๋ ์๊ด ์๋ ์ ๋ณด๋ค ๐ Environment Variables (ํ๊ฒฝ๋ณ์) : ๋น๋ฐ๋ฒํธ, API ์ฒ๋ผ ๋ ธ์ธจ๋๋ฉด ์๋๋..
=> ๋ฐ๋ผํ๋ฉด์ ๋ฐฐ์ฐ๋ NestJS ๐งธ ๋ก๊ทธ ์ด๋์์ ๋ฌธ์ ๊ฐ ๋๋์ง, ๋น ๋ฅด๊ฒ ์ ํํ๊ฒ ํ์ ํ๊ธฐ ์ํด ๋ก๊ทธ๊ฐ ์ค์ํจ ๐ ๋ก๊ทธ์ ์ข ๋ฅ - Log : ์ค์ํ ์ ๋ณด์ ๋ฒ์ฉ ๋ก๊น - Warning : ์น๋ช ์ ์ด๊ฑฐ๋ ํ๊ดด์ ์ด์ง ์์ ์ฒ๋ฆฌ๋์ง ์์ ๋ฌธ์ - Error : ์น๋ช ์ ์ด๊ฑฐ๋ ํ๊ดด์ ์ธ ์ฒ๋ฆฌ๋์ง ์์ ๋ฌธ์ - Debug : ์ค๋ฅ ๋ฐ์์ ๋ก์ง์ ๋๋ฒ๊ทธํ๋ ๋ฐ ๋์์ด ๋๋ ์ ์ฉํ ์ ๋ณด (๊ฐ๋ฐ์ ์ฉ) - Berbose : ์์ฉ ํ๋ก๊ทธ๋จ์ ๋์์ ๋ํ ํต์ฐฐ๋ ฅ ์ ๊ณตํ๋ ์ ๋ณด (์ด์์ ์ฉ) ๐ ๋ก๊ทธ ๋ ๋ฒจ ๐งธ ๋ก๊ทธ ์ ์ฉํ๊ธฐ expressjs ๋ฅผ ์ฌ์ฉํ ๋๋ Wiston ์ด๋ ๋ชจ๋ ์ด๋ค nestjs ์๋ ์ด๋ฏธ build-in ๋ logger ํด๋์ค ์์ ๐ main.ts import { NestFactory } from '@n..
=> ๋ฐ๋ผํ๋ฉด์ ๋ฐฐ์ฐ๋ NestJS ๐งธ ์์ ์ด ์์ฑํ ๊ฒ์๋ฌผ์ ์ญ์ ํ๊ธฐ ํ์ฌ๋, ๊ฒ์๋ฌผ์ ๊ฐ์ ธ์ฌ ๋ ์ด๋ ํ ์ ์ ์ธ์ง์ ์๊ด์์ด ๋ชจ๋ ๊ฒ์๋ฌผ์ ๊ฐ์ ธ์ด ๊ฒ์๋ฌผ์ ๊ฐ์ ธ์ฌ ๋ ํด๋น ์ ์ ๊ฐ ์์ฑํ ๊ฒ์๋ฌผ๋ง ๊ฐ์ ธ์ค๋๋ก ํ๋ค ๐ boards.controller.ts // ๋ค์ด์ค๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ํด๋ผ์ด์ธํธ์ ์๋ต์ ๋ฐํํจ // @Controller ๋ฐ์ฝ๋ ์ดํฐ๋ก ํด๋์ค๋ฅผ ๋ฐ์ฝ๋ ์ด์ ํ์ฌ ์ ์ํจ // Handler : @Get, @Post, @Delete ๋ฑ๊ณผ ๊ฐ์ ๋ฐ์ฝ๋ ์ดํฐ๋ก ์ฅ์ ๋ ์ปจํธ๋กค๋ฌ ํด๋์ค ๋ด์ ๋จ์ํ ๋ฉ์๋ import { Body, Controller, Delete, Get, Param, ParseIntPipe, Patch, Post, UseGuards, UsePipes, ValidationPipe } f..
=> ๋ฐ๋ผํ๋ฉด์ ๋ฐฐ์ฐ๋ NestJS ๐งธ ํด๋น ์ ์ ์ ๊ฒ์๋ฌผ๋ง ๊ฐ์ ธ์ค๊ธฐ (getAllBoards) ํ์ฌ๋, ๊ฒ์๋ฌผ์ ๊ฐ์ ธ์ฌ ๋ ์ด๋ ํ ์ ์ ์ธ์ง์ ์๊ด์์ด ๋ชจ๋ ๊ฒ์๋ฌผ์ ๊ฐ์ ธ์ด ๊ฒ์๋ฌผ์ ๊ฐ์ ธ์ฌ ๋ ํด๋น ์ ์ ๊ฐ ์์ฑํ ๊ฒ์๋ฌผ๋ง ๊ฐ์ ธ์ค๋๋ก ํ๋ค ๐ boards.controller.ts // ๋ค์ด์ค๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ํด๋ผ์ด์ธํธ์ ์๋ต์ ๋ฐํํจ // @Controller ๋ฐ์ฝ๋ ์ดํฐ๋ก ํด๋์ค๋ฅผ ๋ฐ์ฝ๋ ์ด์ ํ์ฌ ์ ์ํจ // Handler : @Get, @Post, @Delete ๋ฑ๊ณผ ๊ฐ์ ๋ฐ์ฝ๋ ์ดํฐ๋ก ์ฅ์ ๋ ์ปจํธ๋กค๋ฌ ํด๋์ค ๋ด์ ๋จ์ํ ๋ฉ์๋ import { Body, Controller, Delete, Get, Param, ParseIntPipe, Patch, Post, UseGuards, UsePipes, Vali..
=> ๋ฐ๋ผํ๋ฉด์ ๋ฐฐ์ฐ๋ NestJS ๐งธ ์ ์ ์ ๊ฒ์๋ฌผ์ ๊ด๊ณ ํ์ฑ ํด์ฃผ๊ธฐ ํ์ฌ ์ ์ ๋ ๊ฒ์๋ฌผ์ ์์ฑํ ๋ ๊ทธ ๋์ ๊ด๊ณ ์ค์ ์ด ์์ ๊ฒ์๋ฌผ ์์ฑ ์, ์ด๋ค ์ ์ ๊ฐ ์์ฑํ๋์ง ์ ๋ณด ๋ฃ์ด์ผ ํจ ๐ ์ ์ ์ ๊ฒ์๋ฌผ ๋ฐ์ดํฐ์ ๊ด๊ณ ํ์ฑ 1) ๊ด๊ณ๋ฅผ ํ์ฑํ๊ธฐ ์ํด์ ์ํฐํฐ์ ์๋ก ๊ฐ์ ํ๋๋ฅผ ๋ฃ์ด์ผ ํจ 2) ํ๋ผ๋ฏธํฐ - Type - InverseSide (board ์์ ์ ์ ๋ก ์ ๊ทผํ๋ ค๋ฉด board.user ๋ก ์ ๊ทผํด์ผ ํจ) - Option (eager : true ์ผ ๋ user ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ๋ board ๋ ๊ฐ์ด ๊ฐ์ ธ์ด) user (OneToMany) => board (ManyToOne) ๐งธ ๊ฒ์๋ฌผ ์์ฑํ ๋ ์ ์ ์ ๋ณด ๋ฃ์ด์ฃผ๊ธฐ ๊ฒ์๋ฌผ ์์ฑ ์์ฒญ -> ํค๋ ์์ ์๋ ํ ํฐ์ผ๋ก ์ ์ ์ ๋ณด-> ์ ์ ์ ๋ณด์ ๊ฒ์๋ฌผ..
=> ๋ฐ๋ผํ๋ฉด์ ๋ฐฐ์ฐ๋ NestJS ๐งธ ์ธ์ฆ๋ ์ ์ ๋ง ๊ฒ์๋ฌผ ๋ณด๊ณ ์ธ ์ ์๊ฒ ํ๊ธฐ ๐ ์ ์ ์๊ฒ ๊ฒ์๋ฌผ ์ ๊ทผ ๊ถํ ์ฃผ๊ธฐ ์ธ์ฆ์ ๊ดํ ๋ชจ๋์ board ๋ชจ๋์ ์ธ ์ ์์ด์ผ ํ๋ฏ๋ก, board module ์์ ์ธ์ฆ ๋ชจ๋ imports ํ ๐ UseGuards (AuthGuard()) ์ฌ๋์ด ์์ฒญ์ ์ค ๋ ์ฌ๋ฐ๋ฅธ ํ ํฐ์ ๊ฐ์ง๊ณ ์์ฒญ์ ์ฃผ๋์ง ๋ณธ ํ์ ๊ฒ์๋ฌผ์ ์ ๊ทผ ํ ๊ถํ ์ค AuthGuard (์ธ์ฆ ๋ฏธ๋ค์จ์ด) ๋ ๊ฐ๊ฐ์ ๋ผ์ฐํธ ๋ณ๋ก ์ค ์ ์๊ณ , ํ๋ฒ์ ํ๋์ ์ปจํธ๋กค๋ฌ ์์ ๋ค์ด์๋ ๋ชจ๋ ๋ผ์ฐํฐ ์ค ์ ์์ ๐ boards.controller.ts // ๋ค์ด์ค๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ํด๋ผ์ด์ธํธ์ ์๋ต์ ๋ฐํํจ // @Controller ๋ฐ์ฝ๋ ์ดํฐ๋ก ํด๋์ค๋ฅผ ๋ฐ์ฝ๋ ์ด์ ํ์ฌ ์ ์ํจ // Handler : @Get..
=> ๋ฐ๋ผํ๋ฉด์ ๋ฐฐ์ฐ๋ NestJS ๐งธ ์ปค์คํ ๋ฐ์ฝ๋ ์ดํฐ ์์ฑํ๊ธฐ ๐ get-decorator.ts import { ExecutionContext, createParamDecorator } from "@nestjs/common"; import { User } from "./user.entity"; // ์ปค์คํ ๋ฐ์ฝ๋ ์ดํฐ ์์ฑํจ // req.user ๊ฐ ์๋ user ํ๋ผ๋งํฐ๋ก ๋ฐ๋ก ์ ์ ๊ฐ์ฒด ๊ฐ๊ณ ์ค๊ธฐ export const GetUser = createParamDecorator((data, ctx: ExecutionContext): User => { const req = ctx.switchToHttp().getRequest(); return req.user; }) ๐ auth.controller.ts ..