NestJS๋ ํจ์จ์ ์ด๊ณ ํ์ฅ๊ฐ๋ฅํ Node.js ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ํ๋ ์์ํฌ์ด๋ค.
๋ด๋ถ์ ์ผ๋ก Nest๋ Express (๊ธฐ๋ณธ๊ฐ)์ ๊ฐ์ ๊ฐ๋ ฅํ HTTP ์๋ฒ ํ๋ ์ ์ํฌ๋ฅผ
์ฌ์ฉํ๋ฉฐ ์ ํ์ ์ผ๋ก Fastify๋ฅผ ์ฌ์ฉํ๋๋ก ๊ตฌ์ฑ ํ ์๋ ์๋ค.
์ด๋ฌํ ์ดํ๋ฆฌ์ผ์ด์
์ ์ ์ํ ์์ ์ด๋ค.
mkdir nestjs-board-app
nest new ./ ์
๋ ฅ
npm ์ ํ
์คํํด๋ณด๊ณ ์ถ๋ค๋ฉด ํฐ๋ฏธ๋์
npm run start:dev
#start:dev ๋ package.json์ ๋์ด
<๊ฒฐ๊ณผ>
main.ts ์
await app.listen(3000); => 3000๋ฒ ํฌํธ์ด๊ธฐ ๋๋ฌธ์
main.ts์
const app = await NestFactory.create(AppModule);
AppModule์ ๊ฐ๋ฉด
AppController, AppService ๊ฐ ๋ฑ๋ก์ด ๋์ด์๋ค.
ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )์์ ์๋ฒ(nestjs-app)๋ก ์์ฒญ์ ์ฃผ๋ฉด app.controller ๋ก ์จ๋ค.
Get ๋ฉ์๋๋ก ์คํ, app.service ๋ฅผ return
getHello ์คํํ์ฌ ๋ธ๋ผ์ฐ์ ๋ก return
App Module์์ BoardModule๊ณผ AuthModule์ด ์์ผ๋ฉด ๊ฐ ๋ชจ๋์์ Controller Entity Service๋ฑ์ด ์๋ค.
๋ชจ๋์ @Module () ๋ฐ์ฝ๋ ์ดํฐ๋ก ์ฃผ์์ด ๋ฌ๋ฆฐ ํด๋์ค๋ค. @Module () ๋ฐ์ฝ๋ ์ดํฐ๋ Nest๊ฐ ์ ํ๋ฆฌ์ผ์ด์
๊ตฌ์กฐ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ ์ฌ์ฉํ๋ ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ค.
๊ฐ ์์ฉ ํ๋ก๊ทธ๋จ์๋ ํ๋ ์ด์์ ๋ชจ๋ (๋ฃจํธ ๋ชจ๋) ์ด ์๋ค. ๋ฃจํธ ๋ชจ๋์ Nest๊ฐ ์ฌ์ฉํ๋ ์์์ ์ด๋ค.
๋ชจ๋์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธ ํค์ด๋ฏ๋ก ์ฌ๋ฌ ๋ชจ๋๊ฐ์ ์ฝ๊ฒ ๊ณต๊ธ์์ ๋์ผํ ์ธ์คํด์ค๋ฅผ ๊ณต์ ํ ์ ์๋ค. => ์ด๋ ํ ๋ชจ๋ ํ๋๋ฅผ ๋ง๋ค๋ฉด ์ฌ๋ฌ ๋ชจ๋์์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.(๋ฐ ์ด๋ฏธ์ง)
์ฐ์ src ์ app.service, appcontroller, app.spec ํ์ผ ์ญ์ , app.moule์ ๋ด์ฉ ์์ ,
test ํด๋ ์ญ์
<app.module.ts>
import { Module } from '@nestjs/common';
@Module({
imports: [],
})
export class AppModule {}
nest g module boards
nest: using nestcli
g: generate
module: schematic that i want to create
boards: name of the schematic
์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ nest.ps1 ํ์ผ์ ๋ก๋ํ ์ ์๋ค๋ ์๋ฌ๊ฐ ๋ฐ์ํด์
Window PowerShell์ ๊ด๋ฆฌ์ ๊ถํ์ผ๋ก ์ฐ ํget-ExecutionPolicy => Restricted ํ์ธ
Set-ExecutionPolicy Unrestricted Y ์ ๋ ฅ
get-ExecutionPolicy => Unrestricted ํ์ธ
์์ ๊ณผ์ ์ ํ๊ณ ์คํํ๋ ์ ์์ ์ผ๋ก ๋์๋ค.
boards ํด๋ ์์ฑํ์ธ !
BoardsModule import ํ์ธ !
<app.module.ts>import { Module } from '@nestjs/common'; import { BoardsModule } from './boards/boards.module'; @Module({ imports: [BoardsModule], }) export class AppModule {}
์ปจํธ๋กค๋ฌ๋ ๋ค์ด์ค๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ํด๋ผ์ด์ธํธ์ ์๋ต์ ๋ฐํํ๋ค.
@Controller ๋ฐ์ฝ๋ ์ดํฐ๋ก ํด๋์ค๋ฅผ ๋ฐ์ฝ๋ ์ด์ ํ์ฌ ์ ์๋๋ค.
ํธ๋ค๋ฌ๋ @Get, @Post, @Delete ๋ฑ๊ณผ ๊ฐ์ ๋ฐ์ฝ๋ ์ดํฐ๋ก ์ฅ์๋ ์ปจํธ๋กค๋ฌ ํด๋์ค ๋ด์ ๋จ์ํ ๋ฉ์๋์ด๋ค.
nest g controller boards --no-spec
=> boards.controller.ts ์์ฑ
nest: using nestcli
g: generate
controller: controller schematic
boards: name of the schematic
--no-spec: ํ
์คํธ๋ฅผ ์ํ ์์ค ์ฝ๋ ์์ฑ x
ํ๋ก๋ฐ์ด๋๋ Nest์ ๊ธฐ๋ณธ ๊ฐ๋
์ด๋ค. ๋๋ถ๋ถ์ ๊ธฐ๋ณธ Nest ํด๋์ค๋ ์๋น์ค, ๋ฆฌํฌ์งํ ๋ฆฌ, ํฉํ ๋ฆฌ, ํฌํผ๋ฑ ํ๋ก๋ฐ์ด๋๋ก ์ทจ๊ธ๋ ์ ์๋ค. ํ๋ก๋ฐ์ด๋์ ์ฃผ์ ์์ด๋์ด๋ ์ข
์์ฑ์ผ๋ก ์ฃผ์
ํ ์ ์๋ค๋ ๊ฒ์ด๋ค. ์ฆ, ๊ฐ์ฒด๋ ์๋ก ๋ค์ํ ๊ด๊ณ๋ฅผ ๋ง๋ค ์ ์์ผ๋ฉฐ ๊ฐ์ฒด์ ์ธ์คํด์ค๋ฅผ "์ฐ๊ฒฐ"ํ๋ ๊ธฐ๋ฅ์ ๋๋ถ๋ถ Nest ๋ฐํ์ ์์คํ
์ ์์๋ ์ ์๋ค.
=> Controller ์์ ํ์ํ๋ ๋ง์ ๊ฒ๋ค์ Controller ๋ด์์ ๋ค ์ฒ๋ฆฌํ ์ ์์ผ๋ฏ๋ก ๊ธฐ๋ฅ๋ณ๋ก ์๋น์ค, ๋ฆฌํฌ์งํ ๋ฆฌ, ํฉํ ๋ฆฌ, ํฌํผ ๋ฑ์ ๋ฃ์ด์ ์ฌ์ฉํ๋ค .
=> ์ข
์์ฑ์ ์ฃผ์
ํ๋ค.
@Injectable ๋ฐ์ฝ๋ ์ดํฐ๋ก ๊ฐ์ธ์ ธ์ ๋ชจ๋์ ์ ๊ณต๋๋ฉฐ, ์ด ์๋น์ค ์ธ์คํด์ค๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฒด์์ ์ฌ์ฉ ๋ ์ ์๋ค.
์๋น์ค๋ ์ปจํธ๋กค๋ฌ์์ ๋ฐ์ดํฐ์ ์ ํจ์ฑ ์ฒดํฌ๋ฅผ ํ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ดํ
์ ์์ฑํ๋ ๋ฑ์ ์์
์ ํ๋ ๋ถ๋ถ์ ์ฒ๋ฆฌํ๋ค.
์์ ๋ณด๋ฉด Contoller์์ this.appService.getHello(); ์ด๋ฐ์์ผ๋ก Service์ ์ ์ํด๋์ ๋ฉ์๋๋ฅผ Controller์์ ๊ฐ์ ธ์์ ์ฐ๋ ๊ฑธ ๋ณผ ์ ์๋ค.
์์ ๋ณด๋ฉด BoardsService๋ฅผ Constructor ํด๋์ค์์ ๊ฐ์ ธ์ค๊ณ (Injected) ์๋ค. ๊ทธ๋ฐ ํ์ Private ๋ฌธ๋ฒ์ ์ฌ์ฉํ๊ณ ์๋ค. ์ด๋ ๊ฒ ํด์ boardsService๋ฅผ ์ ์ํด์ Controller์์์ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ค.
=> ์ด๋ ๊ฒ ํ ์ ์๋ ์ด์ ๋ ํ์
์คํฌ๋ฆฝํธ์ ๊ธฐ๋ฅ์ ์ด์ฉํด์ ์ข
์์ฑ์ ํ์
์ผ๋ก ํด๊ฒฐํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
Provider๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ด๊ฒ์ Nest์ ๋ฑ๋กํด์ค์ผ์ง ์ฌ์ฉํ ์ ์๋ค.
๋ฑ๋กํ๊ธฐ ์ํด์๋ module ํ์ผ์์ ํ ์ ์์ต๋ค. module ํ์ผ์ providersํญ๋ชฉ์์ ํด๋น ๋ชจ๋์์ ์ฌ์ฉํ๊ณ ์ ํ๋ Provider ๋ฅผ ๋ฃ์ด์ฃผ์๋ฉด ๋ฉ๋๋ค.
nest g service boards --no-spec
=>boards.service.ts ์์ฑ
boards.service.ts ํ์ผ ์์๋ Injectable ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ์์ผ๋ฉฐ ์ด NestJS๋ ์ด๊ฒ์ ์ด์ฉํด์ ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ ์ด ์๋น์ค๋ฅผ ์ฌ์ฉ ํ ์์๊ฒ(Injectable)๋ง๋ค์ด์ค๋ค.
๊ทธ๋ฆฌ๊ณ CLI๋ก Service ์์ฑ์์๋ module์๋ ์๋์ผ๋ก Service๊ฐ ์ถ๊ฐ๋๋ค.
providers: [BoardsService]
Controller class์ constructor ์์์ ์ข
์์ฑ ์ฃผ์
์ด ์ด๋ฃจ์ด์ง๋ค.
Typescriptdml ๊ธฐ๋ฅ์ผ๋ก ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ํ ์ ์๋ค.
(์๋ฐ์คํฌ๋ฆฝํธ์์๋ private๊ฐ์ ์ ๊ทผ ์ ํ์(Access modifier)๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง Typescript์์๋ ์ฌ์ฉ๊ฐ๋ฅํ๋ค.)
1. boardsService ํ๋ผ๋ฏธํฐ์ BoardsService ๊ฐ์ฒด๋ฅผ ํ์
์ผ๋ก ์ง์
2. ์ด boardsService ํ๋ผ๋ฏธํฐ๋ฅผ BoardsController ํด๋์ค ์์์ ์ฌ์ฉํ๊ธฐ ์ํด์ this.boardsService ํ๋กํผํฐ์ boardsService ํ๋ผ๋ฏธํฐ๋ฅผ ํ ๋น
3. ํ์ง๋ง ํ์
์คํฌ๋ฆฝํธ์์๋ ์ ์ธํ ๊ฐ๋ง ๊ฐ์ฒด์ ํ๋กํผํฐ๋ก ์ฌ์ฉ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์
์์ boardsService: BoardsService๋ก ์ ์ธ
4. ์ด๋ ๊ฒ ๊ฐ๊ฒ๋ boardsService ํ๋กํผํฐ๋ฅผ ์ด์ฉํด์ BoardsController ํด๋์ค์์์ ํ์ฉ์ ํ ์๊ฐ ์๋ค.
์ ๊ทผ ์ ํ์(public, protected, private) ์ ์์ฑ์(constructor) ํ๋ผ๋ฏธํฐ์ ์ ์ธ
=>์ ๊ทผ ์ ํ์๊ฐ ์ฌ์ฉ๋ ์์ฑ์ ํ๋ผ๋ฏธํฐ๋ ์๋ฌต์ ์ผ๋ก ํด๋์ค ํ๋กํผํฐ๋ก ์ ์ธ
private์ด ์ ์ธ๋์๊ธฐ ๋๋ฌธ์ boardsService ํ๋กํผํฐ๋ BoardsController ํด๋์ค ๋ด๋ถ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ