2022. 4. 9. 19:21ใProgramming Project ์์ ์ค/๋ด์ฉ ์ ๋ฆฌ
Project Git Hub
๐ ๋ชฉ์ฐจ
โ [BackEnd][Node.js][Nest.js] ์ฌ๋ด ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค - ํ์ ๊ฐ์
โ [BackEnd][Node.js][Nest.js] ์ฌ๋ด ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค - JWT๋ฅผ ์ด์ฉํ Login
โ [BackEnd][Node.js][Nest.js] ์ฌ๋ด ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค - Custom Decorator
๐ ๋ถ๋ก
โ [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'
๐ Nest.js Project ์์ํ๊ธฐ
๐ฝ ๊ฐ์
์๋ ํ์ธ์? ์ฃผ๋ํ๋์ ์ด์ ํฌ์คํ ์์ `Node.js`, `Express.js`, `Sequelize`๋ฅผ ์ด์ฉํ์ฌ Project๋ฅผ ์งํํด๋ณด๋ ค ํ์๊ณ , ์ด์ ๋ํ ์ด๊ธฐ ๊ตฌ์ฑ์ ๋ํด ๊ธ์ ์์ฑ ํ์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ, ์ฐพ์๋ณด๋ `Nest.js`๊ฐ ์ฃผ๋ํ๋์๊ฒ๋ ๋๋ฌด๋๋ ์ ๋ง๋ Framwork๋ผ๊ณ ์๊ฐ์ด ๋ ๊ฒ์ด์์.
๊ทธ ์ด์ ๋ ์ฃผ๋ํ๋์ `JAVA` ๊ธฐ๋ฐ์ `Spring Boot`๋ฅผ ์ด์ฌํ ๊ณต๋ถ ์ค์ด์๋๋ฐ, `Node.js`๋ ๊ณต๋ถํ๋ฉด ์ข์๋งํ ์ด์ ๊ฐ ์๊ฒจ์ ํ๋ฒ ๊ณต๋ถ๋ฅผ ํด๋ณด๋ ๋ ์ค `Express.js`๋ฅผ ๊ณต๋ถํ๋ฉด์ ์ดํดํ๋ ๊ฒ๋ณด๋ค ์ผ๋จ `Nest.js`๋ฅผ ํตํด `Spring Boot`์ ๋น์ทํ ๋ฐฉ๋ฒ์ผ๋ก `Node.js`๋ฅผ ๊ณต๋ถํ๋ ๊ฒ์ด ์ข๋ค๊ณ ํ๋จํ ๊ฒ์ด์์.
์ด๋ฒ ํฌ์คํ
์๋ฆฌ์ฆ๋ ์ง๋ `Spring Boot`์ `Maven`๊ณผ `MyBatis`๋ฅผ ์ด์ฉํ `[BackEnd][Maven-PJ] ์ฌ๋ด ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค ์๋ฆฌ์ฆ`๋ฅผ `Node.js`์ `Nest.js`๋ก ๋ฐ๊ฟ์ ์ฝ๋ฉ์ ํด๋ณด๋ฉด์ ๊ณต๋ถ๋ฅผ ํ๋ ค๊ณ ํ๋ ๊ฒ์ด์์.
๊ทธ๋ฐ ์ด์ ๋ก ์ด๋ฒ ํฌ์คํ ๋ถํฐ ๋ค์ ์ฒ์๋ถํฐ Project๋ฅผ ๊ตฌ์ฑํ๊ณ , ์งํ์ ํด๋ณด๋ ค ํฉ๋๋ค.
์ฐธ๊ณ ๋ก `Spring Boot` Project ์์๋ `RESTFul `ํ๊ฒ ๋ง๋ค์ง ์์์๊ณ , ๋ช๊ฐ์ง ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์ธ๊ธํ์๋๋ฐ, ์ด๋ฒ Project๋ ์ผ๋จ ๋์ผํ๊ฒ ๊ตฌ์ถ์ ํ๊ณ , ๋์ค์ `Refectoring`์ ์งํํ ๊ฒ์ด์์.
๐ฆ Nest.js๋?
`Nest.js`๋ ํจ์จ์ ์ด๊ณ , ํ์ฅ ๊ฐ๋ฅํ `Node.js` Server ์ธก Application ๊ตฌ์ถ์ ์ํ Framwork์ธ ๊ฒ์ด์์.
ํ๋ก๊ทธ๋ ์๋ธ `JavaScript`๋ฅผ ์ด์ฉํ๊ณ , `TypeScript`๋ก Build ๋ฐ ์๋ฒฝ ์ง์๋๋ฉฐ (๊ฐ๋ฐ์๊ฐ ์์ `JavaScript` ๋ฌธ๋ฒ์ผ๋ก Coding ๊ฐ๋ฅ) `OOP(Object Oriented Programming)`, `FP(Functional Programming)`, `FRP(Functional Reactive Programming)` ์์๋ฅผ ์ด์ฉํ ์ ์๊ฒ ํด ์ฃผ๋ ๊ฒ์ด์์.
`Nest.js`๋ ์ ์จ `Spring Boot`์ ์ ์ฌํ๋ค๊ณ ํ๋๋ฐ, ๊ฒ์ํ ๋ฑ์ ๋ง๋ค ๋ `Spring Boot`์ ๋์ผํ `MVC Pattern`์ ์ด์ฉํ ์ ์๋ ๊ฒ์ด์์.
์ฃผ๋ํ๋์ ๊ฒ์๊ธ์ ๊ดํ Module๊ณผ ์ธ์ฆ, ์ธ๊ฐ์ ๋ํ Module์ ์ด์ฉํ ๊ฒ์ด๊ณ , ๊ฐ Module์ ๊ตฌ์ฑํ๋ `Controller`, `Service`, `Repository` ๋ฑ์ ์ด์ฉํด์ ์๋น์ค๋ฅผ ๊ตฌ์ถํ ๊ฒ์ด์์.
๐ฆ Nest.js ๋ด๋ถ ๊ตฌ์ฑ
`Nest.js`๋ ๋ด๋ถ์ ์ผ๋ก `Express.js(Default Value)`์ ๊ฐ์ ๊ฐ๋ ฅํ `HTTP Server Framwork`๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์ ํ์ ์ผ๋ก `Fastify`๋ฅผ ์ด์ฉํ ์ ์๋๋ก ๊ตฌ์ฑ ํ ์ ์๋ ๊ฒ์ด์์.
๐ก ์ฐธ๊ณ ์ฌํญ
Fastify๋?
`Fastify`๋ฅผ ์ด์ฉํ๋ ๊ฐ์ฅ ๋ํ์ ์ธ ์ด์ ๋ ํจ์จ์ ์ธ Server๋ ๋ฎ์ ๋น์ฉ์ผ๋ก ๋์ ์๋ต์ฑ์ ๋ณด์ฌ ์ด์ฉ์ ๊ฒฝํ์ ํฅ์์์ผ์ผ ํ๋๋ฐ, ์ด๋ฅผ ์ํด ๋ณด์์ฑ์ ์ ์งํ๊ณ , ๊ฐ๋ฐ์์ ๊ฐ๋ฐ ๋ถํธํจ์ ์ต์ํํ๋ฉด์ ์ ๋ง์ ์ด์ฉ์๋ค์ ์์ฒญ์ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํด ์ค ํ์๊ฐ ์๋ค.
`Fastify`๋ ์ต์ํ์ ์ค๋ฒํค๋์ ๊ฐ๋ ฅํ ํ๋ฌ๊ทธ์ธ ์ํคํ ์ฒ๋ก ์ต๊ณ ์ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ ๊ณตํ๋๋ฐ ์ค์ ์ ๋ `Web Framwork`
์ฆ, `Nest.js`, `Express.js`์ ๊ฐ์ `Web Framwork`์ด๋ค.
`Hapi`์ `Express`๋ฅผ ์ฐธ๊ณ ํด ๋ง๋ค์ด์ก์ผ๋ฉฐ, ํ์ฌ ๊ฐ์ฅ ๋น ๋ฅธ `Web Framwork` ์ค ํ๋์ด๋ค.
`Nest.js`๋ ์ด๋ฌํ ๊ณตํต `Node.js` Framework (`Express.js`, `Fastify`)์์ ์ถ์ํ ์์ค์ ์ ๊ณตํ์ง๋ง, API๋ฅผ ๊ฐ๋ฐ์์๊ฒ ์ง์ ๋ ธ์ถํ๋ ํน์ง์ด ์๋ ๊ฒ์ด์์. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ๊ธฐ๋ณธ Platform์์ ์ฌ์ฉํ ์ ์๋ ์ ๋ง์ ํ์ฌ Module์ ์์ ๋กญ๊ฒ ์ด์ฉํ ์ ์๋ต๋๋ค.
๐ฆ Nest.js ์ฒ ํ
`Node.js ๋ฐ Server ์ธก JavaScript`๋ฅผ ์ํ ํ๋ฅญํ Library๋ฅผ ์งํฅํ๋ ๊ฒ์ด์์.
๋ค๋ฅธ Library๋ ๋ง์ด ์กด์ฌํ์ง๋ง, ์ด๋ค ์ค ์ด๋ค ๊ฒ๋ ์ํคํ ์ด์ ์ฃผ์ ๋ฌธ์ ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํด๊ฒฐํ์ง ๋ชปํ๋ ๋จ์ ์ด ์๋ ๊ฒ์ด์์.
`Nest.js`๋ ๊ฐ๋ฐ์์ ๊ฐ๋ฐํ์ด ๊ณ ๋๋ก Test ๊ฐ๋ฅํ๊ณ , ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ, ๋์จํ ๊ฒฐํฉ์ ์ถ๊ตฌํ๊ณ , ์ ์ง ๊ด๋ฆฌ๊ฐ ์ฌ์ด Application์ ๋ง๋ค ์ ์๋ ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ Application ์ํคํ ์ฒ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด์์.
์ด ์ํคํ ์ฒ๋ `Angular`์์ ์๊ฐ์ ๋ฐ์๋ค๊ณ ํด์!
Nest JS ๊ณต์ ๋ฌธ์
๐ฆ Nest.js ๊ธฐ๋ณธ ๊ตฌ์กฐ
์ด ๋ฆ | ์ค ๋ช |
eslintrc.js | ๊ฐ๋ฐ์๋ค์ด ํน์ ํ ๊ท์น์ ๊ฐ์ง๊ณ Code๋ฅผ ๊น๋ํ๊ฒ ์งค ์ ์๊ฒ ๋์์ฃผ๋ Library. TypeScript๋ฅผ ์ฐ๋ Guide Line์ ์ ์ํด์ฃผ๊ณ , ๋ฌธ๋ฒ์ ๋ฌธ์ ๊ฐ ์์ผ๋ฉด ์๋ ค์ฃผ๋ ์ญํ ๋ฑ ์ํ |
prettierrc | ์ฃผ๋ก Code ํ์์ ๋ง์ถ๋๋ฐ, ์ด์ฉ. ์์๋ฐ์ดํ(')๋ฅผ ์ฌ์ฉํ ์ง ํฐ ๋ฐ์ดํ(")๋ฅผ ์ฌ์ฉํ ์ง ํน์ Indent ๊ฐ์ 2 ํน์ 4๋ก ์ค์ง ๋ฑ๋ฑ์ ์ด์ฉ. Error๋ฅผ ์ฐพ๋ ๊ฒ์ด ์๋ Code ํฌ๋งทํฐ ์ญํ ์ํ. |
nest-cli.json | nest Project๋ฅผ ์ํด ํน์ ํ ์ค์ ์ ํ ์ ์๋ json File. |
tsconfig.json | ์ด๋ค ๋ฐฉ์์ผ๋ก TypeScript๋ฅผ Compileํ ์ง ์ค์ ํ๋ ๋ถ๋ถ. |
tsconfig.build.json | tsconfig.json์ ์ฐ์ฅ์ ์์ ํ์ผ. bvuild๋ฅผ ํ ๋, ํ์ํ ์ค์ ์ ํ๋ ๋ถ๋ถ. "excludes"์์๋ Build ํ ๋, ํ์ ์๋ File๋ค ๋ช ์. |
package.json | build : ์ด์ ํ๊ฒฝ์ ์ํ Build. Format : Lint Error ๋ฐ์ ์ ์์ . start : Application ์คํ. |
src | ๋๋ถ๋ถ์ ๋น์ฆ๋์ค ๋ก์ง์ด ํ์์ ๊ตฌ์ฑ. main.ts : Application ์์ฑ ๋ฐ ์คํ (JAVA์ ๊ฒฝ์ฐ Main()์ด ์๋ Class) app.module.ts : Application Module ์ ์ |
๐ฆ Nest.js Module
App Module ์์ ๊ฒ์ํ Module๊ณผ ํ์ ๊ด๋ จ Module์ด ์๋ค๋ฉด ๊ฐ Module์์ `Controller`, `Entity`, `Service`๋ฑ์ด ์๋ ๊ฒ์ด์์.
Module์ `@Module()`์ด๋ผ๋ `Decorator(JAVA์ Annotation)`์ด ๋ฌ๋ฆฐ Class์ธ ๊ฒ์ด์์.
`@Module()` Decorator๋ `Nest.js`๊ฐ Application ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ฑํ๋๋ฐ, ์ด์ฉํ๋ `Meta Data`๋ฅผ ์ ๊ณตํ๋ต๋๋ค.
๊ฐ Application์๋ ํ๋ ์ด์์ Module(Root Module)์ด ์กด์ฌํ๋๋ฐ, Root Module์ `Nest.js`๊ฐ ์ด์ฉ๋๋ ์์์ ์ธ ๊ฒ์ด์์.
Module์ ๋ฐ์ ํ๊ฒ ๊ด๋ จ๋ ๊ธฐ๋ฅ ์งํฉ์ผ๋ก ๊ตฌ์ฑ ์์๋ฅผ ๊ตฌ์ฑํ๋ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์ ์ ์ํ๋ ๊ฒ์ด์์.
(๊ธฐ๋ฅ๋ณ ๊ตฌํ :์ User Module, Oders Module, Chat Module)
๊ฐ์ ๊ธฐ๋ฅ์ ํด๋นํ๋ ๊ฒ๋ค์ ํ๋์ Module Directory์์ ๋ฃ์ด ๊ตฌํํ๋ ๊ฒ์ด์์.
Module์ ๊ธฐ๋ณธ์ ์ผ๋ก `์ฑ๊ธ ํค`์ด๋ฏ๋ก, ์ฌ๋ฌ Module ์ฌ์ด์ ์ฝ๊ฒ ๊ณต๊ธ์๊ฐ ๋์ผํ ์ธ์คํด์ค๋ฅผ ๊ณต์ ํ ์ ์๋ ๊ฒ์ด์์.
์ฃผ๋ํ๋์ ์ด๋ฒ `Node.js` Project์์ ํต์ฌ ๊ธฐ๋ฅ์ผ๋ก ์ ํํ Q&A ๊ฒ์ํ๊ณผ ์ธ์ฆ, ์ธ๊ฐ ๋ฐ ํ์ ๊ฐ์ ์ ๋ํด์ ํฌ์คํ ์ ์์ฑํ๋ ค ํ๋ ๊ฒ์ด์์. `Spring Boot` Project๋ ์ด ๋ ๊ฐ์ง ๊ธฐ๋ฅ๋ง ํฌ์คํ ์ ๋จ๊ธธ ๊ฒ์ด๊ณ , ๋๋จธ์ง๋ ์ถ๊ฐ ๊ฒ์ํ๋ค์ด๋ผ ๋ฐ๋ก ํฌ์คํ ์ ๋จ๊ธฐ์ง๋ ์์ ๊ฒ์ด์์. ์์ฑ๋ Code๋ `Git Hub`์ ์ฌ๋ ค ๋๋๋ก ํ๊ฒ ์ต๋๋ค!
๐ ์ด๊ธฐ ๊ตฌ์ฑ
๐ฝ ์ค์น
๐ฆ Node.js
์์ ๊ณต์ Site์ ๋ค์ด๊ฐ๋ฉด ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ํ๋ฉด์ด ๋์ค๋ ๊ฒ์ด์์.
์ด ๊ณณ์์ ์์ ์ ์ด์์ฒด์ (OS)์ ๋ง๋ LTS Version์ ์ค์นํ๋ฉด ๋๋ ๊ฒ์ด์์.
์ฃผ๋ํ๋์ `MacOS`๋ฅผ ํ์ฌํ `MacBook`์ ์ฐ๊ณ ์๋ ๊ฒ์ด์์.
์ค์น๊ฐ ๋ค ๋๊ณ ๋๋ฉด ์๋ ๋ช ๋ น์ด๋ก ์ค์น๊ฐ ๋์๋์ง ํ์ธํ ์ ์๋ ๊ฒ์ด์์.
๋ช ๋ น์ด
node -v
๐ฆ Nest.js - Nest.js CLI๋ก Nest.js ์ค์นํ๊ธฐ
`Spring Boot`์ ๊ฒฝ์ฐ ์ด๊ธฐ ํ๊ฒฝ ์ค์ ์ ํ ๋, `Spring initalizr` ๋ฑ์ ์ด์ฉํด์ File๋ค์ ๋ฃ์ด์ฃผ๋๋ฐ, `Node.js`์ ๊ฒฝ์ฐ ๋ช ๋ น์ด ๊ธฐ๋ฐ์ผ๋ก ์ด๊ธฐ ํ๊ฒฝ ๊ตฌ์ฑ์ ํ๋ ์ฐจ์ด์ ์ด ์๋ ๊ฒ์ด์์. ์๋ฌด๋๋ `Node.js`๋ CLI๋ฅผ ์ด๋์ ๋ ๋ค๋ฃฐ ์ค ์์์ผ ํธํ๊ฒ ์ด์!
์ฐธ๊ณ ๋ก ์๋ ๋ช ๋ น์ด๋ค์ Project Directory์์ ์ ๋ ฅํด์ค์ผ ํ๋ค๋ ๊ฑธ ์์ผ๋ฉด ์๋๋ ๊ฒ์ด์์.
๋ช ๋ น์ด
npm install -g @nestjs/cli
๋จผ์ ์์ ๋ช ๋ น์ด๋ฅผ ํตํด `Nest.js`์ CLI๋ฅผ ๋ฐ์์ค์ผ ํ๋ ๊ฒ์ด์์.
Mac OS๋, Linux์ ๊ฐ์ OS์์๋ ์์ ๊ฐ์ `๊ถํ ๋ฌธ์ `๋ก ์ธํด ์ค์น๊ฐ ์๋ ์ ์๋ ๊ฒ์ด์์.
๊ทธ ์ด์ ๋ `root` ๊ถํ์ด ์๋๊ธฐ ๋๋ฌธ์ธ๋ฐ, ์ด๋ด๋๋ ์๋์ ๊ฐ์ด ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅ ํด ์ฃผ๋ฉด ๋๋ ๊ฒ์ด์์.
๋ช ๋ น์ด
sudo npm install -g @nestjs/cli
๋ช ๋ น์ด
nest new {Projcet-Name}
๊ทธ๋ฐ ๋ค ์์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด Project ์ด๋ฆ์ ๋ง๋ ํ์ผ๊ณผ ๋ชจ๋๋ค์ด ๋ด๋ ค ๋ฐ์ ์ง๋ฉด์ ์ด๊ธฐ ํ๊ฒฝ ๊ตฌ์ฑ์ด ์๋ฃ ๋๋ ๊ฒ์ด์์.
์์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด `Package Manager`๋ฅผ ์ด๋ค ๊ฑธ ์ฌ์ฉํ๊ฒ ๋๊ณ ๋ฌป๋๋ฐ, ์ฃผ๋ํ๋์ `npm`์ ์ด์ฉํ ๊ฒ์ด์์.
์ฐธ๊ณ ๋ก Project ์ด๋ฆ์ Directory๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ์์์ ์์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด Project ์ด๋ฆ Directory ์์ ๋๊ฐ์ Directory๊ฐ ๋ ์๊ธฐ๊ณ , ๊ทธ ์์ ํ์ผ๋ค์ด ์๊ธฐ๋๋ฐ, ์ด ๋ถ๋ถ์ ์ฃผ์ํด์ผ ํ๋ ๊ฒ์ด์์.
`Nest.js`๊ฐ ์ค์นํด์ค์ ๊ณ ๋ง๋ค๊ณ ํ๋ค์!
์ด๊ธฐ ํ๊ฒฝ ๊ตฌ์ฑ์ด ์๋ฃ๋๋ฉด ์์ ๊ฐ์ด ํ์ผ๋ค์ด ์์ฑ ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ ๊ฒ์ด์์.
๋ช ๋ น์ด
nest --version
`Nest.js`๊ฐ ์ ๋๋ก ์ค์น ๋์๋์ง ํ์ธ ํด๋ณด๊ณ ์ถ๋ค๋ฉด ์์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด ๋๋ ๊ฒ์ด์์.
๐ฆ Pipe
๋จผ์ `Pipe`์ ๋ํ ์์ธํ ๋ด์ฉ์ `์ด ๊ณณ`์ ์ค๋น ํด ๋ ๊ฒ์ด์์.
๋ช ๋ น์ด
npm install class-validator class-transformer --save
`Pipe`๋ฅผ ์ด์ฉํ๊ธฐ ์ํด์๋ `class-validator`, `class-transformer` Module์ด ํ์ํ ๊ฒ์ด์์.
์์ ๊ฐ์ด ์ค์น ํด ์ฃผ์๋ฉด ๋ฉ๋๋ค.
Documentation Page
๐ฆ TypeORM - Data Base ์ฐ๋
๋จผ์ `TypeORM`์ ๋ํ ์์ธํ ๋ด์ฉ์ `์ด ๊ณณ`์ ์ค๋น ํด ๋ ๊ฒ์ด์์.
์ต์ด ์ค์ File์ ๋ง๋ค๊ธฐ ์ํด `/src` ๋ฐ์ `config` Directory๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ๋ฐ์ `typeorm.config.ts`๋ฅผ ๋ง๋ค์ด ์ด ๊ณณ์์ Data Base ์ค์ ์ ํด ์ค ๊ฒ์ด์์.
์ฐธ๊ณ ๋ก ์ฃผ๋ํ๋์ ๋ฐ์์ `Configuration`์ ์ด์ฉํ์ฌ ๋ฏผ๊ฐ ์ ๋ณด๋ฅผ ์จ๊ธธ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ `typeorm.config.ts`์์ ์ง์ ์ ์ธ Data Base ์ ๋ณด๋ฅผ ์ ๋ ฅํ์ง ์์ ๊ฒ์ด์์.
์ต์ด ๋๋ฒ์งธ ์ค์ ๋ฐ์์ ์ธ๊ธํ ์ค์ ๋ด์ฉ๋ค์ `import` ํด์ฃผ๊ณ , 4๋ฒ์งธ ์ค์์ ํด๋น ์ค์ ํ์ผ์ `db`๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง ๋ด์ฉ (๋ฐ ๊ทธ๋ฆผ ์ฐธ๊ณ )์ ๋ด์ฉ์ ๊ฐ์ ธ์ dbConfig์ ๋ฃ์ด์ค ๊ฒ์ด์์.
6๋ฒ์งธ ์ค์ `export` Keyword๋ฅผ ํตํด `@nestjs/typorm` Module๋ฅผ `improt` ํ ์ธ์คํด์ค `TypeOrmModuleOptions` ๊ฐ์ฒด ์๋ฃํ Type์ผ๋ก ๊ฐ๋ ์์ํ(const) ๊ฐ์ฒด('{}') `typeORMConfig`๋ฅผ ๋ค๋ฅธ ๊ณณ์์๋ ์ฌ์ฉํ ์ ์๊ฒ ๋ด๋ณด๋ด๊ธฐ ํ๊ณ , Data Base ์ค์ ๊ฐ๋ค์ ๋ฃ์ด์ค ๊ฒ์ด์์. `process.env.**`๋ ๋์ค์ AWS์ ๊ฐ์ Cloud ํ๊ฒฝ์์ Data Base๋ฅผ ์ด์ฉํ ๋, ํด๋น ๋ด์ฉ์ ๊ฐ์ ธ์ค๊ฒ ํ๊ธฐ ์ํจ์ด๊ณ , `dbConfig.**`์ ๋ฐ์์ ์ธ๊ธํ ์ค์ ๋ด์ฉ์์ ๊ฐ์ ๊ฐ์ ธ์ ์ฃผ๋ ๊ฒ์ด์์.
`Spring Boot`์์๋ `application.yml`, `application.properties`์ ๊ฐ์ `@Value()`๋ฅผ ํตํด ๊ฐ์ ธ์ฌ ์ ์๋๋ฐ, ์ด๊ฒ๊ณผ ๋งค์ฐ ์ ์ฌํ ๊ธฐ๋ฅ์ธ ๊ฒ์ด์์.
17๋ฒ์งธ ์ค์ `entities`๋ `Entity` ๊ฐ์ฒด๋ฅผ ์ฐพ๊ธฐ ์ํ ์ค์ ์ด๊ณ , 29๋ฒ์งธ ์ค์๋ Application์ด ์คํํ ๋, ์ค์ ๊ฐ์ ๋ฐ๋ผ true, false๊ฐ ๋ฐ๋๋๋ก ํ ๊ฒ์ด์์.
๐ฆ Configuration (์ค์ )
๋จผ์ `Configuration`์ ๋ํ ์์ธํ ๋ด์ฉ์ `์ด ๊ณณ`์ ์ค๋น ํด ๋ ๊ฒ์ด์์.
`development.yml` ์์๋ Data Base Management System์ IP, ์ด์ฉ์ IP, Password๋ฅผ ๋ฃ์ด์ค ๊ฒ์ด์์.
๋ง์ง๋ง `synchronize`๋ฅผ true๋ก ์ค์ ํ๋ฉด `Spring Boot`์ `JPA` ๊ธฐ๋ฅ์ผ๋ก `ddl-auto`๋ฅผ ํตํด `Entity`๋ฅผ ์ฝ์ด ์๋์ผ๋ก Table์ ๋ง๋ค์ด์ฃผ๊ณ , ๋ณ๊ฒฝํด์ฃผ๋๋ฐ, ์ด์ ๋์ผํ ๊ธฐ๋ฅ์ ํ๋ ๊ฒ์ด์์.
์ฃผ๋ํ๋์ ์ด ์ ์ ์งํํ๊ณ ์๋ `Spring Boot` Project๋ก ์ธํด ์ด๋ฏธ DB Table๋ค์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ false๋ก ์ค์ ํด ์ค ๊ฒ์ด์์.
์ด์ ํ๊ฒฝ์์ ์ด์ฉํ Data Base๊ฐ ์๋ค๋ฉด ํด๋น ์ ๋ณด๋ฅผ ๋ฃ์ด์ฃผ๊ณ , `synchronize`๋ false๋ก ์ค์ ์ ํ๋๋ฐ, ๊ทธ ์ด์ ๋ ์ด์์ด๋ผ๋ฉด ์ค์ ์๋น์ค๋ฅผ ๊ตฌ๋ํ๋ ํ๊ฒฝ์ด๊ณ , `synchronize`๊ฐ true ๋ผ๋ฉด `Entity` ๋ณ๊ฒฝ์ด ์์ ๋, ๊ฐ๋ฐ์๊ฐ ์๋ํ์ง ์์ DB ๋ณ๋์ด ๋ฐ์ํ ์ํ์ด ๋๊ธฐ ๋๋ฌธ์ธ ๊ฒ์ด์์.
์ด์ `main.ts`์์ ์ ์ค์ ๋ค์ด ์ธ์๋๋๋ก ํด ์ค์ผ ํ๋ ๊ฒ์ด์์.
3๋ฒ์งธ ์ค์ ์ค์ ํ์ผ์ `import`ํ๊ณ , 8๋ฒ์งธ ์ค์ ํด๋น ์ค์ Module ๊ฐ์ฒด์์ `get()`์ ํตํด `default.yml`์ ์ ์ธ๋ server ๋ด์ฉ์ ๊ฐ์ ธ์ ์์ํ ๋ณ์ serverConfig์ ๋ฃ์ด์ค ๊ฒ์ด์์.
serverConfig ๋ณ์ ์์๋ port ๋ฒํธ๊ฐ ์๊ณ , ๊ทธ ๋ฒํธ๋ฅผ ์์ํ ๋ณ์ port์ ๋ฃ์ด์ค ๋ค Application์ด ๋์ํ ๋, 8080 Port๋ก ๋์ํ๊ฒ ํด ์ค ๊ฒ์ด์์.
์ด์ Server๊ฐ ์ ์์ ์ผ๋ก ๊ตฌ๋๋๋์ง ํ์ธ ํด ๋ณผ ๊ฒ์ด์์.
๐ฆ Swagger ์ค์
`Swagger`๊ฐ ๋ฌด์์ธ์ง ์๊ณ ์ถ์ผ์ ๋ถ๋ค์ ์ํด ๊ฐ์๋ฅผ `์ด ๊ณณ`์ ์ค๋น ํด ๋ ๊ฒ์ด์์.
`Swagger`๋ `Nest.js`์์ ์ด์ฉํ ์ ์๋๋ก Module์ด ์ ๊ณต ๋๊ณ ์๋ ๊ฒ์ด์์.
๋ช ๋ น์ด
npm install @nestjs/swagger swagger-ui-express --save
๋ง์ฝ `Nest.js(fastify)`์ ์ด์ฉํ๋ค๋ฉด `swagger-ui-express` ๋์ `fastify-swagger`๋ฅผ ์ค์นํ์ฌ์ผ ํ๋ ๊ฒ์ด์์.
๋ช ๋ น์ด
npm install @nestjs/swagger fastify-swagger --save
์ฃผ๋ํ๋์ ์๋ ๋ช ๋ น์ด๋ฅผ ํตํด์ ์ค์น ํด ์ค ๊ฒ์ด์์.
์ต์ด Swagger๋ฅผ ์ด์ฉํ๊ธฐ ์ํด์ ์ค์ Class๋ฅผ ๋ง๋ค์ด์ค์ผ ํ๋ ๊ฒ์ด์์.
`DocumnetBuilder()`๋ฅผ ํตํด ๋ฌธ์์ ๊ธฐ๋ณธ์ ๊ตฌ์ฑํ ์ ์๋๋ก ํด ์ฃผ์๊ณ , `Builder Pattern`์ ์ด์ฉํด์ ์ ๋ชฉ, ๋ด์ฉ, ๋ฒ์ ์ ์ค์ ํด ์ค ๊ฒ์ด์์.
๊ทธ๋ฐ ๋ค API๋ฌธ์๋ฅผ ๋ง๋ค์ด์ฃผ๊ธฐ ์ํด `createDocumnet()`๋ฅผ ํธ์ถํด์ Appication์ ๋ํ ๋ด์ฉ์ ๋ฃ์ด์ฃผ๊ณ , ๋ฌธ์์ ๊ตฌ์ฑ ๋ด์ฉ์ ํจ๊ป ๋ฃ์ด ์ค ๋ค ์์ํ ๋ณ์ document์ ๋ฃ์ด์ค ๊ฒ์ด์์.
๊ทธ๋ฐ ๋ค `setup()`์ ํธ์ถํ์ฌ ๊ฐ๋ฐ์๊ฐ Web Browser์ ํตํด Swagger ๋ฌธ์๋ฅผ ํ์ธํ ์ ์๋ URI Path๋ฅผ ๋ฃ์ด์ค ๊ฒ์ด์์.
๊ทธ๋ฆฌ๊ณ ์ 13๋ฒ์งธ ์ค๊ณผ ๊ฐ์ด main.ts์ swaggerConfig ์ค์ ์ฝ๋๋ฅผ ์
๋ ฅํด ์ฃผ์ด์ผ ํด์.
๐ Nest.js Project Server ๊ตฌ๋ํ๊ธฐ
12 ~ 15๋ฒ์งธ ๊น์ง ์ ์ฌํ ์ง์ผ๋ณผ ํ์๊ฐ ์๋ ๊ฒ์ด์์.
12๋ฒ์งธ ์ค์ `nest.js` Application ๊ตฌ๋ ๋ช ๋ น์ด์ธ nest start๊ฐ ๋ค์ด ์๊ณ , 13 ~ 15๋ฒ์งธ ์ค๊น์ง๋ ๊ฐ ํ๊ฒฝ(๊ฐ๋ฐ, ์ด์ ๋ฑ)์ ๋ง๋ ๋์์ ํ๋๋ก ๋ช ๋ น์ด๊ฐ Value๋ก ๋ฑ๋ก๋์ด ์๊ณ , Key๋ก ์ด๋ฆ์ ๋ช ์ํ ๋ค ๊ฐ์ฒด Type์ผ๋ก ์ ์ธ๋์ด ์๋ ๊ฒ์ด์์.
๋ช ๋ น์ด
npm run start:dev
ํ ์์ Project๋ ๊ฐ๋ฐ ๋จ๊ณ์ด๊ธฐ ๋๋ฌธ์ ์์ ๋ช ๋ น์ด๋ฅผ ํตํด Server๋ฅผ ๊ตฌ๋ํ ๊ฒ์ด์์.
Server๊ฐ ์ ์์ ์ผ๋ก ๋์ํ์๊ณ , ์ค์ ๋ด์ฉ๋ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌ๊ฐ ๋๊ณ ์์์ ์ ์ ์๋ ๊ฒ์ด์์.
์์ ๊ฐ์ด ์ด๊ธฐ ๊ตฌ์ฑํ `Swagger API` ๋ฌธ์์ ์ ์ ์ํ ๊ฒ์ ๋ณผ ์ ์๋ ๊ฒ์ด์์.
์ด์ ๊ฐ๋ฐ์ ํ๋ฉด์ `Controller` ๋ฑ์์ `Decorator(JAVA : Annotaion)`์ ์ด์ฉํด์ ๋ฌธ์๋ฅผ ๊ณ์ ์์ฑํด ๋๊ฐ๋ฉด ๋๋ ๊ฒ์ด์์.
๋ค์ ๊ธ : [BackEnd][Node.js][Nest.js] ์ฌ๋ด ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค - ํ์ ๊ฐ์