π NestJS λΈλ‘κ·Έ λ§λ€κΈ° μ리μ¦μ λͺ©μ
μ λ NestJS μ λ¬Έκ°κ° μλλλ€.
μ λν NestJS λ‘ μ΄ν리μΌμ΄μ
μ λ§λ€λ €κ³ νμ§ νλ¬μ΄ μ± λμ§ μμμ΅λλ€.
λ€λ§ μ κ° κ³΅λΆνλ©΄μ μ΅λνκ³ μ΄ν΄ν λ΄μ©μ λ°νμΌλ‘ κ°λ¨ν μ΄ν리μΌμ΄μ
μ λ§λ€λ©° κΈ°λ³Έμ μΈ μ§μμ
μ¬λ¬λΆκ» κ°μ΄ 곡μ νλ κ²μ΄ μ λͺ©μ μ
λλ€.
λλΆλΆμ μ 보λ NestJS Doc , Github λ₯Ό μ°Έκ³ νκ³ μμ΅λλ€.
μ΄ μ리μ¦λ
- CRUD κΈ°λ₯
- Postgresql DataBase μ°κ²°
- Auth
- λ©μμ§ ν
- κΈ°ν κΈ°λ₯ (μΉ΄ν‘ κ³΅μ , μΉ΄ν‘μΌλ‘ λ‘κ·ΈμΈνκΈ° λ±)
μ λ΄μ©μ λ€λ£° κ² μ λλ€.
μ¬μ©νλ IDE λ VSCode μ λλ€.
μ΄ν μΆκ°ν μ¬νμ΄λ μ μ©ν νμ΄ μλ€λ©΄ λ μΆκ°νκ² μ΅λλ€.
κΆκΈν μ¬νμ΄λ μ κ° νλ Έλ€κ³ μκ°νλ λΆλΆμ΄ μλ€λ©΄ μΈμ λ νΌλλ°± ν΄μ£ΌμΈμ.
π΄ NestJS μ΄ν리μΌμ΄μ μμνκΈ°.
NestJS λ Javascript κΈ°λ° Typescript μΈμ΄λ₯Ό μ£Όλ‘ λ€λ£Ήλλ€.
Javascript νκ²½μ μν΄μ Node.js κ° μ€μΉλμ΄ μλμ§ λ¨Όμ νμΈν΄μ£ΌμΈμ.
NestJS μ€μΉλ₯Ό μν΄ λ€μ λͺ λ Ήμ΄λ₯Ό ν°λ―Έλμμ μ€νν΄μ£ΌμΈμ.
$ npm i -g @nestjs/cli
μ€μΉκ° μ μμ μΌλ‘ λμλ€λ©΄ μ΄μ νλ‘μ νΈ ν΄λλ₯Ό λ§λ€μ΄ λ΄
μλ€. project-name μ μνμλλ°λ‘ νλ©΄ λ©λλ€.
μ ν¬λ nestjs-practice λΌκ³ μ§μ΄λ³΄μ£ .
$ nest new nestjs-practice
ν¨ν€μ§ λ§€λμ λ npm μ μ¬μ©νκ² μ΅λλ€. (κ·Έλλ‘ μν° λλ¬μ£Όλ©΄ λ©λλ€.)
πꡬ쑰 μ΄ν΄λ³΄κΈ°
src
app.controller.spec.ts
app.controller.ts
app.module.ts
app.service.ts
main.ts
src ν΄λμλ μ±μ μ½λλ€μ΄ λͺ¨μ¬μλ€κ³ μκ°νμλ©΄ λ©λλ€.
κ° μν μ 보μλ©΄
- app.controller.spec.ts : spec μ΄ λΆμ νμΌλ€μ ν μ€νΈ νμΌμ λλ€. μ§κΈμ 무μνμ λ λ©λλ€.
- app.controller.ts : μ±μ request μ response λ₯Ό λ΄λΉνλ λΌμ°ν κ΄λ ¨ νμΌμ λλ€.
- app.module.ts : μ±μ ꡬμ±νλ ꡬ쑰μ λ©νλ°μ΄ν°λ₯Ό λ΄λΉνλ νμΌμ λλ€.
- app.service.ts : μ±μ λΉμ§λμ€ λ‘μ§μ λ΄λΉνλ νμΌμ λλ€.
μμΌλ‘ λͺ¨λ μ±μ ꡬμ±μμλ€μ μμ κ°μ ννλ‘ λ§λ€μ΄μ§κ±°μμ!!
μ΅μμ ν΄λμ λ€λ₯Έ νμΌλ€μ κ΅¬μ± μμλ₯Ό λ΄λΉνλ λ
μμ΄μμ.
μλ₯Ό λ€λ©΄ typescript νκ²½μ€μ νμΌ λλ ν¨ν€μ§ μμ‘΄μ± κ΄λ¦¬νμΌ κ°μ κ²λ€μ΄μμ.!!
π¨κΈ°λ₯ λ§λ€μ΄λ³΄κΈ°
nest cli λ μ λ§ μ μ©ν κΈ°λ₯λ€μ λ§μ΄ μ§μν©λλ€.
nest generate κΈ°λ₯μ μ΄μ©νλ©΄ μμ£Ό μ¬μ©νλ μ©λμ ν
νλ¦Ώμ μμ±ν μ μμ΅λλ€.
λ€μμ nest generate | g λ₯Ό μ΄μ©ν΄ λ§λ€ μ μλ λͺ
λ Ήμ΄λ€μ
λλ€.
βββββββββββββββββ¬ββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββ
β name β alias β description β
β application β application β Generate a new application workspace β
β class β cl β Generate a new class β
β configuration β config β Generate a CLI configuration file β
β controller β co β Generate a controller declaration β
β decorator β d β Generate a custom decorator β
β filter β f β Generate a filter declaration β
β gateway β ga β Generate a gateway declaration β
β guard β gu β Generate a guard declaration β
β interceptor β in β Generate an interceptor declaration β
β interface β interface β Generate an interface β
β middleware β mi β Generate a middleware declaration β
β module β mo β Generate a module declaration β
β pipe β pi β Generate a pipe declaration β
β provider β pr β Generate a provider declaration β
β resolver β r β Generate a GraphQL resolver declaration β
β service β s β Generate a service declaration β
β library β lib β Generate a new library within a monorepo β
β sub-app β app β Generate a new application within a monorepo β
β resource β res β Generate a new CRUD resource β
βββββββββββββββββ΄ββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββββ
μλ€ λ€λ©΄
nest g module catiscute
μ λͺ λ Ήμ΄λ catiscute λΌλ λͺ¨λμ μλμΌλ‘ μμ±ν΄μ€λλ€. μ΄λμ μ λ§ μ μ©νμ£ ? !!
μμμμ μ κΈ° μ κΈ° CRUD 보μ΄μλμ? resource λΌλ λͺ
λ Ήμ΄λ₯Ό μ΄μ©νμλ©΄ CRUD μ νμν ν
νλ¦Ώμ μ»μ μ μμ΅λλ€.!!!!!
μ°ν ~ λ°μλ°μ μ§μ§ μ΄λ©μ΄μ§ ν©λλ€. μ¬λ¬λΆ μ΄ λͺ
λ Ήμ΄λ‘ λ°λ‘ ν
νλ¦Ώ μ»λ κ±°λ μ§μ§ λλΌμ΄κ±°μμ!!
μ΄μ users λΌλ CRUD κΈ°λ₯μ λ§λ€μ΄λ³΄μ£ .
nest g res users
λ₯Ό μ
λ ₯ν΄λ΄
μλ€. μμ° ν΄λ 보μ΄μλμ?? !! 보μ΄μλμ!!!
ν κ°μ§ λ λ§νμλ©΄ app.module.ts νμΌμ μλμΌλ‘ UsersModule μ΄ μΆκ°λμμ΅λλ€.!!!
μ λ―Έμ³λ° λ―Έμ³λ°... μ§μ§ νΈλ¦¬νλ€ ... π
μ°λ¦¬λ μ΄μ μ μ μ κ΄ν κΈ°λ³Έμ μΈ CRUD κΈ°λ₯μ μνν μ μμ΅λλ€. μ°ν~
ν λ² μ±μ μ€νν΄λ³ΌκΉμ??
npm run start
μ΄λ ?!?!? μ λ μ΄λ° μλ¬κ° λ³μ΅λλ€. nest κ° μμ±ν΄μ€ νμΌμ μ°λ¦¬κ° μ€μΉνμ§ μμ node λͺ¨λμ΄ μλ보λ€μ!!
1 import { PartialType } from '@nestjs/mapped-types';
~~~~~~~~~~~~~~~~~~~~~~
λ€μ λͺ λ Ήμ΄λ₯Ό ν΅ν΄ μ€μΉν΄μ£Όμꡬμ!!
npm install @nestjs/mapped-types --save
μ€μΉκ° λλ©΄ λ€μ
npm run start
μ ν~ μ΄λ²μ μλ¬κ° μμ΅λλ€!!!!! λ‘κ·Έλ₯Ό 보μλ©΄
[Nest] 35604 - 2021-01-22 11:31:13 βF10: AMβ€ [NestFactory] Starting Nest application...
[Nest] 35604 - 2021-01-22 11:31:13 βF10: AMβ€ [InstanceLoader] AppModule dependencies initialized +24ms
[Nest] 35604 - 2021-01-22 11:31:13 βF10: AMβ€ [InstanceLoader] UsersModule dependencies initialized +2ms
[Nest] 35604 - 2021-01-22 11:31:13 βF10: AMβ€ [RoutesResolver] AppController {}: +8ms
[Nest] 35604 - 2021-01-22 11:31:13 βF10: AMβ€ [RouterExplorer] Mapped {, GET} route +4ms
[Nest] 35604 - 2021-01-22 11:31:13 βF10: AMβ€ [RoutesResolver] UsersController {/users}: +1ms
[Nest] 35604 - 2021-01-22 11:31:13 βF10: AMβ€ [RouterExplorer] Mapped {/users, POST} route +0ms
[Nest] 35604 - 2021-01-22 11:31:13 βF10: AMβ€ [RouterExplorer] Mapped {/users, GET} route +9ms
[Nest] 35604 - 2021-01-22 11:31:13 βF10: AMβ€ [RouterExplorer] Mapped {/users/:id, GET} route +0ms
[Nest] 35604 - 2021-01-22 11:31:13 βF10: AMβ€ [RouterExplorer] Mapped {/users/:id, PUT} route +1ms
[Nest] 35604 - 2021-01-22 11:31:13 βF10: AMβ€ [RouterExplorer] Mapped {/users/:id, DELETE} route +0ms
[Nest] 35604 - 2021-01-22 11:31:13 βF10: AMβ€ [NestApplication] Nest application successfully started +2ms
RouteExplorer λ₯Ό 보μλ©΄ users μ κ΄λ ¨λ λ§€νλ€μ λ³Ό μ μμ΅λλ€!!
μ΄μ νΈνμ λΈλΌμ°μ λ₯Ό ν€μκ³ http://localhost:3000 λ‘ μ μνμλ©΄!!
μλ¬΄λ° μ€μ μνμ ¨μΌλ©΄ μ±μ κΈ°λ³Έ ν¬νΈλ 3000 μ λλ€!!
Hello World!
μ¬μ€ μ΄ νμ΄μ§λ₯Ό 보λκ² λͺ©μ μ΄ μλκΈ° λλ¬Έμ λ§ν¬ λ€μ /users λ₯Ό μ
λ ₯ν΄λ΄
μλ€
κ°λ³΄μꡬμ!! http://localhost:3000/users
This action returns all users
κ°λ³΄μꡬμ!! http://localhost:3000/users/1
This action returns a #1 user
λͺ¨μΌλͺ¨μΌ~ λ²μ¨ λκ±°μΌ? μ°λ¦¬ λ νκ²λ μλλ°??
nest μ λ§ νΈν κΈ°λ₯λ€μ΄ λ§μ΅λλ€. λ€λ§ μ°λ¦¬κ° μνλ건 λ¨μν μ λ° λ¬Έμκ° μλλΌ μ§μ§ μ μ μ λ³΄κ² μ£ ?
λ€μ μκ°μλ λ°μ΄ν°λ² μ΄μ€μ μ°κ²°ν΄μ μ§μ§ μ μ μ 보λ₯Ό λ§λ€κ³ κ°μ Έμ€κ³ μμ νκ³ μμ νκ³ λ₯Ό λ°°μλ³΄κ² μ΅λλ€.
π¨ μ’ λ μ΄ν΄λ³΄κΈ°
μ κ·Όλ° μ°λ¦¬ μ¬κΈ°μ λ§μΉλ©΄ μ’ μ°μ°νμμμ? κ·Έλ¬μ μΌ ν©λλ€. κ·Έλ΄κ±°μμ. κ·Έλμ μ€λΉνμ΅λλ€!!
μ½λμ ꡬ쑰λ₯Ό μ‘°κΈ λ μ΄ν΄λ³΄κ² μ΅λλ€.
users
β users.controller.spec.ts
β users.controller.ts
β users.module.ts
β users.service.spec.ts
β users.service.ts
β
ββdto
β create-user.dto.ts
β update-user.dto.ts
β
ββentities
user.entity.ts
spec μ΄ λΆμ νμΌμ ν μ€νΈ νμΌμ λλ€. λ€μμ ν μ€νΈ ν λ μ΄ν΄λ³΄κ² μ΅λλ€!
dto μ κ΄ν λ΄μ©κ³Ό entities μ κ΄ν λ΄μ©μ λ€μλ²μ λ°μ΄ν°λ² μ΄μ€ μ°κ²°νκ³ μμλ³΄κ² μ΅λλ€.
κ·ΈλΌ service, controller, module μ λν΄μ νλ² μ΄ν΄λ³΄μ£ .
πService
Service νμΌμ λΉμ§λμ€ λ‘μ§μ μ²λ¦¬νλ νμΌμ΄λΌκ³ νμ΅λλ€. UserService ν΄λμ€ μμ μ΄ν΄ 보μλ©΄
create, findAll, findOne, update, remove ν¨μλ€μ΄ μμ΅λλ€.
μ¬κΈ°μ 리ν΄νλ λ¬Έμμ΄μ΄ μ°λ¦¬κ° λΈλΌμ°μ μμ λ³Έ λ¬Έμλ€μ΄μ£ ?
κ·Έλ¦¬κ³ ν΄λμ€ μμ @Injectable() μ΄λΌλ Decorator κ° μμ΅λλ€.
Decorator λ κΈ°λ₯μ νμ₯ν λ μ°μΌ μ μλ λμμΈ ν¨ν΄μ λλ€.
λ°μ½λ μ΄ν° ν¨ν΄μ΄ λκ°μ?
Injectable λ°μ½λ μ΄ν°λ λ€λ₯Έ ν΄λμ€μ constructor λ₯Ό ν΅ν΄ μ΄ ν΄λμ€λ₯Ό Inject νκΈ° μν λ°μ½λ μ΄ν°λ‘ DI(Dependency Injection) κΈ°λ₯μ μ¬μ©νκΈ° μν΄ μ°μ λλ€.
Controller νμΌμ 보면 λ μ΄ν΄κ° μ λ κ²λλ€!
πController
Controller νμΌμ λΌμ°ν
μ μ²λ¦¬νλ νμΌμ
λλ€.
μΌλ¨ UsersController ν΄λμ€ μμ constructor λ₯Ό 보μλ©΄. userService μ νμ
λ§ μ§μ νμ΅λλ€.
κ·ΈλΌμλ λΆκ΅¬νκ³ create ν¨μμμ μ΄ this.userService.create λ₯Ό νΈμΆνκ³ μλλ°μ.
μ΄κ² μ΄λ»κ² κ°λ₯ν κ²μ΄λλ©΄ λ°λ‘ Nest μ νλ₯ν DI μμ€ν λλ¬Έμ λλ€.
DI λ κ°λ¨νκ² NestJS μ νμ λ§κ² μ°λ¦¬κ° μ΄λ€ κ°μ μ§μ ν΄μ£Όλ©΄ NestJS κ° μμμ 컨νΈλ‘€ ν΄μ£Όλ κΈ°λ₯μ λλ€.μ°λ¦¬ UserService λΆλΆμμ Injectable λ°μ½λ μ΄ν°λ₯Ό ν΅ν΄ UserService λ₯Ό Injectable ν provider λ‘ μ§μ νμ΅λλ€.λ°λΌμ UserController ν΄λμ€ λ΄μ constructor μμ λ¨μν userService μ νμ μ UserService λ‘ μ§μ ν΄μ€μΌλ‘μNestJSκ° μμμ this.userService μ μμ±κ³Ό μλ©Έμ κ΄λ¦¬νκ² λ©λλ€.
μ λ―Έμ³λ° λ―Έμ³λ°!!! μ λ§ νΈνλ€!!
μμ§ λͺ κ°μ§ λ λ΄μΌν κ²μ΄ μμ΅λλ€.
λ°λ‘ @Controller λ°μ½λ μ΄ν° μ λλ€. λ°μ½λ μ΄ν°μμ "users" λΌκ³ μ§μ ν΄μ£Όκ³ μμ΅λλ€. μ΄ λ§μ λ°λ‘!
/users λΌλ μ£Όμλ‘ μμ²μ΄ λ€μ΄μ€λ©΄ μ΄ ν΄λμ€μμ μ²λ¦¬νκ² λ€
λΌλ λ»μ λλ€. μ°λ¦¬λ UserController λ₯Ό app λͺ¨λμ κ°λ€ λΆμμΌλ μ£Όμλ localhost:3000/users κ° λκ² μ£ ??.
μ΄ν UsersController λ΄μ ν¨μλ₯Ό 보면
@Post, @Get, @Put, @Delete λ°μ½λ μ΄ν°λ€μ΄ 보μ λλ€.
μ΄λ¦μμλ μ μΆν μ μλ―μ΄ /users μ ν΄λΉνλ λ©μλλ‘ λ€μ΄μ€λ©΄ μ΄ ν¨μμμ μ²λ¦¬νκ² λ€. λΌλ λ» μ λλ€.
users μ΄ν λ§€νλ μ§μ ν μ μλλ°μ.
@Get(":id") λΌλ λ°μ½λ μ΄ν°λ /users/:id λ‘ λ€μ΄μ¨ μμ²μ μ΄ ν¨μμμ μ²λ¦¬νκ²λ€ λΌλ λ» μ
λλ€.
μ λ§ μ§κ΄μ μ΄μ£ ?? μ°ν~
':' λ‘ μμνλ λ¬Έμμ΄μ νλΌλ©ν°λΌλ κ°μΌλ‘ μΈμνκ² λ€λ λ»μ λλ€.
findOne μ 보μλ©΄ ν¨μ μΈμ κ°μ @Param('id') μ΄λΌλ λ°μ½λ μ΄ν°λ₯Ό λΆμ¬ :id μμΉμ κ°μ id λΌλ κ°μ ν λΉνλ κ³Όμ μ λ³Ό μ μμ΅λλ€.
λν λΉμ·νκ² @Body λ°μ½λ μ΄ν°λ request body μ λ΄μ©μ λ³μμ ν λΉνκ² λ€λ λ» μ λλ€.
μ λ§ μ½λ€μ½λ€!!
π₯£Module
UsersModule ν΄λμ€λ μ΄ users λΌλ ν΄λ μμ λͺ¨λμ κ΄λ¦¬νλ ν΄λμ€μ
λλ€.
μ΄ λͺ¨λμ controllers λ UsersController ν΄λμ€λ₯Ό ν΅ν΄ κ΄λ¦¬νκ² λ€!
μ΄ λͺ¨λμ providers λ UserService ν΄λμ€λ₯Ό ν΅ν΄ κ΄λ¦¬νκ² λ€ !!
μ 보μλ©΄ λ°°μ΄μ κ°μ΄λ―λ‘ λ³΅μμ κ°μ ν λΉν μ μμ΅λλ€!!
μ΄ UsersModule μ app λͺ¨λμμ imports νκ³ μκΈ° λλ¬Έμ app μ΄ UserModule μ μΈμν μ μλ κ² μ λλ€!!
λ€λ₯Έ κ°μ λν΄μλ μ΄ν ν¬μ€νΈμμ λ€λ£¨κ² μ΅λλ€.
μ μ¬λ¬λΆ μ λ§ μ½κ³ μ§κ΄μ μΌλ‘ λμ΄μμ§ μλμ? μ κ° NestJS λ₯Ό μ’μνκ² λ μ΄μ μ΄κΈ°λ ν©λλ€.!!
λ€μμλ Postgresql λ°μ΄ν°λ² μ΄μ€λ₯Ό μ΄μ©ν΄ μ§μ§ user μ 보λ₯Ό μ μ₯ν΄λ³΄μꡬμ!
νΌλλ°±μ νμ νμμ λλ€!!