Programming Project ์ž‘์—…์‹ค/๋‚ด์šฉ ์ •๋ฆฌ

[BackEnd][Node.js][nest.js-PJ] ์‚ฌ๋‚ด ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ ์„œ๋น„์Šค - ๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ : ์ดˆ๊ธฐ ๊ตฌ์„ฑ(Entity, Controller,Module,Repository,Service)

์ฃผ๋‹ˆ์“ฐ๐Ÿง‘‍๐Ÿ’ป 2022. 4. 10. 01:45
728x90
๋ฐ˜์‘ํ˜•

 

 

 

Project Git Hub

 

 

๐Ÿ—‚ ๋ชฉ์ฐจ

โ— [BackEnd][Node.js][nest.js-PJ] ์‚ฌ๋‚ด ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ ์„œ๋น„์Šค - ์ดˆ๊ธฐ ๊ตฌ์„ฑ(Pipe, TypeORM, Configuration, Swagger, Logger)

โ— [BackEnd][Node.js][Nest.js] ์‚ฌ๋‚ด ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ ์„œ๋น„์Šค - ํšŒ์› ๊ฐ€์ž…

โ— [BackEnd][Node.js][Nest.js] ์‚ฌ๋‚ด ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ ์„œ๋น„์Šค - JWT๋ฅผ ์ด์šฉํ•œ Login

โ— [BackEnd][Node.js][Nest.js] ์‚ฌ๋‚ด ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ ์„œ๋น„์Šค - Passport, JWT๋ฅผ ์ด์šฉํ•œ ์ธ๊ฐ€ ์ฒ˜๋ฆฌ

โ— [BackEnd][Node.js][Nest.js] ์‚ฌ๋‚ด ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ ์„œ๋น„์Šค - Custom Decorator

โ— [BackEnd][Node.js][nest.js-PJ] ์‚ฌ๋‚ด ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ ์„œ๋น„์Šค - ๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ : ์ดˆ๊ธฐ ๊ตฌ์„ฑ(Entity, Controller,Module,Repository,Service)

 

 

 

 

๐Ÿ“š ๋ถ€๋ก

โ— [Node.js] Node.js ๊ธฐ์ดˆ
โ— [JavaScript] ๊ธฐ๋ณธ ๋ฌธ๋ฒ• 
โ— [BackEnd][Node.js] ์‚ฌ๋‚ด ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ ์„œ๋น„์Šค - ์ดˆ๊ธฐ ๊ตฌ์„ฑ
โ— [BackEnd][Node.js] ์‚ฌ๋‚ด ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ ์„œ๋น„์Šค - ์ดˆ๊ธฐ ๊ตฌ์„ฑ : DB ์—ฐ๊ฒฐ
โ— [BackEnd][Node.js] ์‚ฌ๋‚ด ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ ์„œ๋น„์Šค - ์ดˆ๊ธฐ ๊ตฌ์„ฑ : DB ์—ฐ๊ฒฐ(Sequelize)

โ— [Web] URL์˜ ์ดํ•ด
โ— 
[Spring] Spring์ด๋ž€?
โ—[Node.js][Nest.js] ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์™€ Data ํ˜•์‹ ๋ณ€ํ™˜ํ•˜๊ธฐ - Pipe
โ—[Node.js][Nest.js] Configuration (์„ค์ •)
โ—
[Node.js][Nest.js]TypeORM
โ— [Node.js][Nest.js] Logger ๊ธฐ๋Šฅ
โ—
[JavaScript] Promise์™€ async ๊ทธ๋ฆฌ๊ณ  await 
โ— 
[Nest.js] API ์„ค๊ณ„ - ์š”์ฒญ, ์‘๋‹ต ๊ฐ์ฒด (Request, Response Object) 
โ— 
[์ •๋ณด๋ณด์•ˆ] JWT(JSON Web Token) ์ด๋ž€? 
โ— 
[Nest.js] Middle Ware(๋ฏธ๋“ค์›จ์–ด)






 

 

 

 

๐Ÿค” ๋‚ด๊ฐ€ ๋งŒ๋‚œ Error

โ— [Node.js][Error] Cannot find module '.dotenv'

 

 

 

 

 

 

 

 

 

๐Ÿš€ ๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ

    ๐Ÿ”ฝ  ์ •๋ฆฌํ•˜๊ธฐ

src ๋ฐ‘์— ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ `app.controller.spec.ts`, `app.controller.ts`, `app.service.ts`๋Š” ์ œ๊ฑฐํ•ด ์ฃผ๋„๋ก ํ•  ๊ฒƒ์ด์—์š”.

 

 

 

app.module.ts

์ง€์šด File๋“ค๋กœ ์ธํ•ด `Exception`์ด ๋ฐœ์ƒํ•œ ๊ฒƒ์ด์—์š”. ์ด ๊ณณ๋„ ์ •๋ฆฌ ํ•ด ์ฃผ๋„๋ก ํ•  ๊ฒƒ์ด์—์š”.

 

app.module.ts

 

 

 

 

 

    ๐Ÿ”ฝ  Module ๋งŒ๋“ค๊ธฐ

        ๐Ÿ“ฆ devInquery.module.ts

`Node.js`๋Š” ๋Œ€๋ถ€๋ถ„ ์ง์ ‘ File์„ ๋งŒ๋“ค๊ธฐ ๋ณด๋‹ค ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜๋Š” ๊ฒƒ ๊ฐ™์€ ๊ฒƒ์ด์—์š”.

 

๋ช…๋ น์–ด

nest g module {Module-name}

 

๐Ÿ’ก ์ฐธ๊ณ  ์‚ฌํ•ญ
๋ช…๋ น์–ด ์ •๋ฆฌ

โ— nest : nestcli๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์„ ์–ธ.
โ— g : generate(์ƒ์„ฑํ•˜๋‹ค) ์ฆ‰, Module์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” Option.
โ— module : Module์„ ๋งŒ๋“ค๊ฒ ๋‹ค๊ณ  ์„ ์–ธ.
โ— {Module-name} : ๋งŒ๋“ค๊ณ  ์‹ถ์€ Module ์ด๋ฆ„ ์„ ์–ธ.

 

$ nest g module {Module-name}

์œ„์— ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋‹ˆ ์•„๋ž˜ File์ด ์ƒ์„ฑ๋œ ๊ฒƒ์ด์—์š”.

 

devInquery Directory ๊ตฌ์กฐ

์œ„์— ๋งŒ๋“  Module์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” `Root` Module์ธ `app.module.ts`์— ๋“ฑ๋กํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด์—์š”. ์ด ๋ถ€๋ถ„์€ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด Module์„ ๋งŒ๋“ค ๋•Œ ์ž๋™์œผ๋กœ ์„ ์–ธ๋ฉ๋‹ˆ๋‹ค.

 

app.module.ts

์ž˜ ๋งŒ๋“ค์–ด์กŒ๋‚˜ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด Server๋ฅผ ์˜ฌ๋ ค ๋ณผ๊ฒƒ์ด์—์š”.

 

$npm run start:dev

Server๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰ ์ค‘์ธ ๊ฒƒ์ด์—์š”.

 

 

 

    ๐Ÿ”ฝ  Controller ๋งŒ๋“ค๊ธฐ

`Contoller`๋Š” `Client` ์ธก์—์„œ ๋ณด๋‚ธ `Request(์š”์ฒญ)`์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ผ์„ ํ•˜๋Š”๋ฐ, Route์— ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

Routing ๋ฐฉ์‹

 

 

๋ช…๋ น์–ด

nest g controller {controller-name} {--no-spec}

์œ„์— ๋ช…๋ น์–ด์—์„œ `--no-spec`์€ ์„ ํƒ์‚ฌํ•ญ์ธ๋ฐ, ์œ„์™€ ๊ฐ™์ด ์ž…๋ ฅํ•˜๋ฉด `Test Code`๋ฅผ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์ง€ ์•Š๋Š” ๊ฒƒ์ด์—์š”.

 

$ nest g controller {controller-name} {--no-spec}

์œ„ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด `Controller`๊ฐ€ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด ์ง€๋Š” ๊ฒƒ์ด์—์š”.

 

 

 

๐Ÿ’ก ์ฐธ๊ณ  ์‚ฌํ•ญ
CLI๋ฅผ ํ†ตํ•ด Controller๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋Š” ์ˆœ์„œ

โ— ์ตœ์ดˆ CLI๋Š” ๋ช…๋ น์–ด๋กœ ์ž…๋ ฅ๋œ ์ด๋ฆ„์— ํ•ด๋‹นํ•˜๋Š” Directory๊ฐ€ ์žˆ๋Š”์ง€ ์ฐพ๊ณ , ์žˆ์œผ๋ฉด ๊ทธ ์•ˆ์— ๋งŒ๋“ค๊ณ , ์—†์œผ๋ฉด Directory ์ƒ์„ฑ ๋’ค ๊ทธ ์•ˆ์— ๋งŒ๋“ ๋‹ค.
โ— ํ•ด๋‹น Directory์— Module์„ ์ฐพ๊ณ , Module์•ˆ์— Controller์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๋„ฃ์–ด์ค€๋‹ค.

 

 

 

    ๐Ÿ”ฝ  Providers, Service ๋งŒ๋“ค๊ธฐ

        ๐Ÿ“ฆ ๊ฐœ์š”

โ–บ Providers๋ž€? `Nest.js`์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์œผ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋ณธ `Nest.js` Class๋Š” `Service`, `Repository`, `Factory`, `Helper` ๋“ฑ `Provider`๋กœ ์ทจ๊ธ‰ ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”. `Provider`์˜ ์ฃผ์š” Idea๋Š” `์˜์กด๊ด€๊ณ„(์ข…์†์„ฑ) ์ฃผ์ž…(Dependency Injection - DI)`์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด์—์š”. `Spring Boot`๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์‹  ๋ถ„๋“ค์€ ์•„์ฃผ ์ต์ˆ™ํ•œ ์šฉ์–ด ์ธ ๊ฒƒ์ด์—์š”.

์ฆ‰, ๊ฐ์ฒด๋Š” ์„œ๋กœ ๋‹ค์–‘ํ•œ ๊ด€๊ณ„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ธ์Šคํ„ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ธฐ๋Šฅ์€ ๋Œ€๋ถ€๋ถ„ `Nest.js` Runtime System์— ์œ„์ž„๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”. 

 

`Controller`๋Š” ์—ฌ๋Ÿฌ `Service`๋ฅผ DIํ•˜์—ฌ ํ•ด๋‹น Service์˜ Method๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ๋ฅผ ๋ถ€ํƒํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

โ–บ Service๋ž€? ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” `Service`๋Š” `Spring`์—๋„ ํ•„์ˆ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฐœ๋…์ธ ๊ฒƒ์ด์—์š”. `Nest.js`์—์„œ๋Š” `@Injectable` Decorator๋กœ ๊ฐ์‹ธ์ ธ Module์— ์ œ๊ณต๋˜๊ณ , ์ด `Service` ์ธ์Šคํ„ด์Šค๋Š” Application ์ „์ฒด์—์„œ ์ด์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”. 

`Service`๋Š” `Controller`์—์„œ Data์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ•˜๊ฑฐ๋‚˜, Data Base์— Item ์ƒ์„ฑ ๋“ฑ์„ ํ•˜๊ธฐ ์œ„ํ•ด `Repository`์—๊ฒŒ ์ž‘์—…์„ ์œ„์ž„ํ•˜๋Š” ๋“ฑ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

 

        ๐Ÿ“ฆ ์ƒ์„ฑํ•˜๊ธฐ

๋ช…๋ น์–ด

nest g service {service-name} {--no-spec}

๋ช…๋ น์–ด์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์œ„์— ํ–ˆ์œผ๋‹ˆ ์ƒ๋žตํ•  ๊ฒƒ์ด์—์š”.

 

 

$ nest g service {service-name} {--no-spec}

 

 

๋ฐ˜์‘ํ˜•

 

`Service`๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋งŒ๋“ค์–ด ์ง„ ๊ฒƒ์ด์—์š”.

 

dev-inquery.module.ts

๋˜ํ•œ, Module์„ ํ™•์ธํ•ด ๋ณด๋ฉด ์ž๋™์œผ๋กœ `Controller`์™€ `providers`๋ผ๊ณ  ๋ช…๋ช…๋œ `Service`๊ฐ€ ๋“ฑ๋ก๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

 

dev-inquery.service.ts

`Service` class ์•ˆ์„ ์‚ดํŽด๋ณด๋ฉด `@Injectable()`์ด ์žˆ๋Š” ๊ฒƒ์ด์—์š”. `Nest.js`๋Š” ์ด๊ฒƒ์„ ์ด์šฉํ•ด์„œ ๋‹ค๋ฅธ `Component`์—์„œ ํ•ด๋‹น `Service`๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ (Injectable) ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๊ฒƒ์ด์—์š”.

 

 

 

 

        ๐Ÿ“ฆ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…(DI)

`Controller`์—์„œ `Service`๊ฐ€ ์ด์šฉ๋  ์ˆ˜ ์žˆ๊ฒŒ DI(Dependency Injection)์„ ํ•ด ์ค„ ๊ฒƒ์ด์—์š”.

 

dev-inquery.controller.ts

`Spring Boot`์—์„œ๋Š” `Contorller`์—์„œ `Service`๋ฅผ DIํ•˜๊ธฐ ์œ„ํ•ด Member ๋ณ€์ˆ˜๋กœ `Service` ๊ฐ์ฒด ์ž๋ฃŒํ˜• ํƒ€์ž… ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ , ์ด๋ฅผ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด `this.{service-name} = {service-name}`์„ ํ•˜์—ฌ DI๋ฅผ ํ•˜๊ฑฐ๋‚˜, `final`๋กœ ์„ ์–ธํ•˜์—ฌ `@RequireArgsConstructor`๋ฅผ ์ด์šฉํ•˜๋Š” ๋“ฑ์˜ ๋ฐฉ์‹์„ ์ผ์—ˆ๋Š”๋ฐ, `Nest.js`๋Š” ์ด๋ ‡๊ฒŒ `constructor`๋ผ๋Š” Keyword๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค๊ณ , `private`์ด๋ผ๋Š” ์ ‘๊ทผ ์ œํ•œ์ž๋ฅผ ์„ ์–ธํ•ด์„œ `Service` ๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•ด์ฃผ๋ฉด ๋˜๋Š” ๊ฒƒ์ด์—์š”.

์œ„์™€ ๊ฐ™์€ Code๋Š” ๋ฐ”๋กœ `TypeScript`๊ฐ€ ๋„์™€์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•œ ๋ฌธ๋ฒ•์ธ๋ฐ, `JavaScript`์—์„œ๋Š” `private`์™€ ๊ฐ™์€ ์ ‘๊ทผ ์ œํ•œ์ž(Access Modifier)๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์—†์ง€๋งŒ, `TypeScript`์—์„œ๋Š” ์ด์šฉ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด์—์š”.

๋งŒ์•ฝ 6๋ฒˆ์งธ ์ค„์— `private`์„ ์„ ์–ธํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์„ ์–ธ์„ ํ•ด์ค˜์•ผ ํ•  ๊ฒƒ์ด์—์š”.

 

dev-inquery.controller.ts

์ด๊ฑด ๋งˆ์น˜ Annotation์„ ์“ฐ์ง€์•Š๊ณ , ์ƒ์„ฑ์ž DI๋ฅผ ํ•˜๋Š” `Spring Boot`์™€ ๋ชจ์Šต์ด ํก์‚ฌํ•˜๋„ค์š”. ๋ฌผ๋ก  `Spring Boot`์—์„œ ์œ„์™€ ๊ฐ™์ด ํ•˜๋ ค๊ณ  ํ•œ๋‹คํ•ด๋„ `@Autowired` ๊ฐ™์€ Annotaion์„ ์ƒ์„ฑ์žํ•œํ…Œ ๋ถ™ํ˜€์ค˜์•ผ ํ•˜์ง€๋งŒ ๋ง์ด์—์š”.

์œ„ Code๋ฅผ ๋ถ„์„ํ•ด ๋ณด๋ฉด 9๋ฒˆ์งธ ์ค„์— `devInqueryService` Parameter์— `DevInqueryService` ๊ฐ์ฒด๋ฅผ ์ž๋ฃŒํ˜• Type์œผ๋กœ ์ง€์ •ํ•ด ์ฃผ๋Š” ๊ฒƒ์ด์—์š”. JAVA์™€ ๋น„๊ตํ•˜๋ฉด ์•ž ๋’ค๊ฐ€ ๋ฐ”๋€ ๋ชจ์Šต์ธ ๊ฒƒ์ด์—์š”.

11๋ฒˆ์งธ ์ค„์— `devInqueryService` Parameter๋ฅผ `DevInqueryController`์—์„œ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ `this.devInqueryService Property`์— `devInqueryService` Parameter๋ฅผ ํ• ๋‹นํ•ด ์ฃผ๋Š” ๊ฒƒ์ด์—์š”.

๊ทธ๋Ÿฐ ๋’ค 7๋ฒˆ์งธ ์ค„์— `TypeScript`์—์„œ๋Š” ์„ ์–ธํ•œ ๊ฐ’๋งŒ ๊ฐ์ฒด์˜ `Property`๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ„์™€ ๊ฐ™์ด ์„ ์–ธํ•ด ์ค€ ๊ฒƒ์ด์—์š”.

์ด๋ ‡๊ฒŒ ์–ป์–ด์˜จ `devInqueryService Property`๋ฅผ ์ด์šฉํ•˜์—ฌ `DevInqueryController` Class ์•ˆ์—์„œ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋ž๋‹ˆ๋‹ค.

 

์˜ˆ์‹œ ์ฝ”๋“œ

 

์ฐธ๊ณ ๋กœ `private`์„ ์„ ์–ธํ•˜๋ฉด `devInqueryService Property`๋Š” `DevInqueryController` Class์—์„œ๋งŒ ์ด์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด์—์š”.

 

 

 

 

    ๐Ÿ”ฝ  Model ๋งŒ๋“ค๊ธฐ

`Spring Boot JPA`์—์„œ๋Š” `Entity` Class๋ฅผ `Interface`๋กœ ๋งŒ๋“ค์ง€ ์•Š์ง€๋งŒ, `Nest.js`์—์„œ๋Š” `Interface`๋กœ ๊ตฌํ˜„ํ•ด๋„ ๋˜๋Š” ๊ฒƒ์ด์—์š”.

 

 

Q&A๊ฒŒ์‹œํŒ(DevInquery) Entity

ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€ ๊ธฐ๋Šฅ์—๋Š” ๋น„๋ฐ€๊ธ€ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๊ฒƒ์ด์—์š”. ๋น„๋ฐ€๊ธ€์€ `enum` Class๋ฅผ ์ด์šฉํ•ด์„œ ์œ„์™€ ๊ฐ™์ด ๋งŒ๋“ค์–ด ์ค€ ๊ฒƒ์ด์—์š”.

์ฆ‰, `secretAt(๋น„๋ฐ€๊ธ€ ์—ฌ๋ถ€)`์—๋Š” `String` Type 'N'๊ณผ 'Y'๋งŒ ์ž…๋ ฅ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

๐Ÿ’ก ์ฐธ๊ณ  ์‚ฌํ•ญ
Decorator ์„ค๋ช…

โ— @Entity() : ํ•ด๋‹น Class๊ฐ€ Entity์ž„์„ ํ‘œํ˜„. Data Base DDL 'CREATE TABLE {Table-name}'์— ํ•ด๋‹น.
โ— PrimaryGeneratedColumn() : ํ•ด๋‹น Property (JAVA: Memeber ๋ณ€์ˆ˜)๊ฐ€ ํ•ด๋‹น Entity์˜ Primary Key ๊ฐ’์ž„์„ ํ‘œํ˜„.
โ— @Column() : Data Base ๊ธฐ์ค€ Table์˜ ๊ฐ ์—ด์„ ํ‘œํ˜„.

 

 

 

    ๐Ÿ”ฝ  Repository ๋งŒ๋“ค๊ธฐ

โ–บRepository๋ž€?

`Repository`๋Š” `Entity` ๊ฐ์ฒด์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋ฉฐ, ์‹ค์ œ Data Base์™€ ์—ฐ๊ฒฐ๋˜์–ด SQL๋ฌธ์„ ๋˜์ง€๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

๊ณต์‹ ๋ฌธ์„œ

 

dev-inquery ๊ณ„์ธต๋„

๋จผ์ € ์ฃผ๋‹ˆํ•˜๋ž‘์€ ์œ„์™€ ๊ฐ™์ด `dev-inquery.repository`๋ฅผ ๋งŒ๋“ค์–ด ์ค€ ๊ฒƒ์ด์—์š”.

 

dev-inquery.repository.ts

์ •๋ง `JPA`์™€ ๊ฑฐ์˜ ๋˜‘๊ฐ™์€ ๊ฒƒ์ด์—์š”. ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค๋ฉด `JPA`๋Š” `Interface`๋กœ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ, `TypeORM`์€ Class๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด์—์š”.

์ƒ์„ฑ ์‹œ `Repository` Class๋ฅผ `Extense` ํ•ด์ฃผ๋Š”๋ฐ, ์ด๋ฅผ ํ†ตํ•ด `Find`, `Insert`, `Delete` ๋“ฑ๊ณผ ๊ฐ™์€ Method๋ฅผ ํ†ตํ•ด `Entity`๋ฅผ Control ํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

`@EntityRepository()`๋Š” Class๋ฅผ ์ด์šฉ์ž ์ •์˜(Custom) ์ €์žฅ์†Œ๋กœ ์„ ์–ธํ•˜๋Š”๋ฐ ์ด์šฉ๋˜๋Š” ๊ฒƒ์ด์—์š”. ์ด์šฉ์ž ์ง€์ • ์ €์žฅ์†Œ๋Š” ์ผ๋ถ€ ํŠน์ • `Entity`๋ฅผ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜, ์ผ๋ฐ˜ ์ €์žฅ์†Œ ์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

์œ„ `Repository`๋ฅผ ๋‹ค๋ฅธ ๊ณณ์—์„œ๋„ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด (Injectable) `dev-inquery.module.ts`์—์„œ `import`ํ•ด์ค˜์•ผ ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

dev-inquery.module.ts

21๋ฒˆ์งธ ์ค„์— `Repository`๋ฅผ `import` ํ•ด์ค€ ๊ฒƒ์ด์—์š”.

 

๋งˆ์ง€๋ง‰์œผ๋กœ `app.module.ts`์— `TypeORM`์— ๋Œ€ํ•œ ์„ค์ • File์„ `imports` ์‹œ์ผœ์ค˜์•ผ ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

app.module.ts

 

 

 

๋ฌธ์ œ ๋ฐœ์ƒ!!

์œ„์— ๋Œ€ํ•œ `Exception` ๋‚ด์šฉ์€ `์ด ๊ณณ`์— ์ •๋ฆฌ ํ•ด์„œ ์ค€๋น„ํ•ด ๋‘˜๊ฒŒ์š”!

 

 

 

 

์ด์ œ ๊ธฐ๋ณธ ์ค€๋น„๋Š” ๋๋‚œ ๊ฒƒ์ด์—์š”.

๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ๊ฒŒ์‹œํŒ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

 

 

 

์ด์ „ ๊ธ€ : [BackEnd][Node.js][Nest.js] ์‚ฌ๋‚ด ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ ์„œ๋น„์Šค - Custom Decorator

 

 

 

 

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•