nestjs ๊ธฐ๋ณธ ๊ฐ๋
๋ชจ๋(modules)
๋ฐ์ ํ๊ฒ ๊ด๋ จ๋ ๊ธฐ๋ฅ๋ค์ ๋ชจ์ ๋ง๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ. (์๋์ฐจ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ฐํด, ๋ชธ์ฒด, ์์ง ๋ฑ๋ฑ...)
๊ฐ ์ดํ๋ฆฌ์ผ์ด์ ์๋ ๋ฌด์กฐ๊ฑด ํ๋ ์ด์์ ๋ชจ๋์ด ์๊ณ , ์ต์์ ๋ชจ๋์ ๋ฃจํธ๋ชจ๋์ด๋ผ๊ณ ํจ.
ํด๋์ค์ @Module() ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋ฌ์ ์์ฑํจ.
๋ชจ๋์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธํค์ด๋ฏ๋ก ์ด๋ ค ๋ชจ๋ ๊ฐ ์ฝ๊ฒ ๊ณต๊ธ์์ ๋์ผํ ์ธ์คํด์ค๋ฅผ ๊ณต์ ํ ์ ์๋ค. (ex-๊ณตํต ๋ชจ๋์ ์์ฑํ์ฌ, ๋ค๋ฅธ ๋ชจ๋์์๋ ์ฌ์ฉ ๊ฐ๋ฅ.)
nest g module module_name
nest g mo mo_name
์ปจํธ๋กค๋ฌ(controllers)
๋ค์ด์ค๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ต์ ๋ฐํํ๋ ์ญํ .
๊ฐ ์์ฒญ์ ๊ตฌ๋ถํ๋ ๋ผ์ฐํฐ ์ญํ ์ ํจ.
ํด๋์ค์ @Controller ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋ฌ์ ์์ฑํ๊ณ , ์ธ์๋ก ์์ฒญ์ '๊ฒฝ๋ก' ๋ฅผ ๋ฐ๋๋ค.
- Handler : Http Method ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ๋ฌ๋ฆฐ ๋ฉ์๋. ์ธ์๋ก '๊ฒฝ๋ก' ๋ฅผ ๋ฐ๋๋ค. ํด๋น ์ปจํธ๋กค๋ฌ๋ก ๋ค์ด์จ ์์ฒญ์ handle ํจ.
nest g controller controller_name
nest g co co_name
ํ๋ก๋ฐ์ด๋(providers)
nestjs ์์ ์ฌ์ฉํ๋ ๊ฐ๋ .
์ปจํธ๋กค๋ฌ์ ํ์ํ ๋ง์ ๊ฒ๋ค์ ์ปจํธ๋กค๋ฌ ์์์ ๊ตฌํํ๊ธฐ๋ณด๋ค, ๊ธฐ๋ฅ๋ณ๋ก ๋๋ ๊ตฌํํ ๋ค ์ปจํธ๋กค๋ฌ ์์ ๋ฃ์ด์ฃผ๋๋ฐ ์ด๊ฑธ ํ๋ก๋ฐ์ด๋๋ผ๊ณ ํจ.
์ปจํธ๋กค๋ฌ ์์ ํ๋ก๋ฐ์ด๋๋ฅผ ๋ฃ๋ ๊ฑธ '์ฃผ์ ํ๋ค' ๋ผ๊ณ ํจ.
๋ณดํต ์๋น์ค, ๋ ํฌ์งํ ๋ฆฌ, ํฉํ ๋ฆฌ, ํฌํผ ๋ฑ์ด ์์.
- ์๋น์ค(service)
- @Injectable ๋ฐ์ฝ๋ ์ดํฐ๋ก ๊ฐ์ธ์ ธ์ ์ ๊ณต๋จ. (ํ๋ก๋ฐ์ด๋๋ผ์ ์ปจํธ๋กค๋ฌ์๊ฒ ์ฃผ์ ๋๊ธฐ ๋๋ฌธ.)
- ์๋น์ค๋ ๋ฐ์ดํฐ ์ ํจ์ฑ ์ฒดํฌ, DB ์์ดํ ์์ฑ ๋ฑ์ ์์ ์ ํจ.
- ์๋น์ค๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ฃผ์ ์์ผ์ผ ํจ.
- ์ด ์๋น์ค ์ธ์คํด์ค๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ ์ฌ์ฉ๋ ์ ์์.
-
nest g service service_name nest g s s_name
-
//์ฃผ์ @Controller() export class Controller { constructor(private service: Service) {} //private ์ ๊ทผ์ ํ์ ์ฌ์ฉํ๋ฉด ์๋ฌต์ ์ผ๋ก ํด๋์ค ํ๋กํผํฐ๋ก ์ ์ธ๋จ }
๋ฏธ๋ค์จ์ด(middleware)
์น ๊ฐ๋ฐ์์ ์ผ๋ฐ์ ์ผ๋ก ๋ผ์ฐํธ ํธ๋ค๋ฌ๊ฐ ์์ฒญ ์ฒ๋ฆฌํ๊ธฐ ์ ์ ์ํํ๋ ์ปดํฌ๋ํธ๋ฅผ ์๋ฏธ.
์ฟ ํค ํ์ฑ, ์ธ์ ๊ด๋ฆฌ, ์ธ์ฆ/์ธ๊ฐ, ๋ณธ๋ฌธ(http message body) ํ์ฑ ๋ฑ์ ๋ณดํต ์ํํจ.
์์ธ ํํฐ(exception filters)
์์ธ ์ฒ๋ฆฌ๋ฅผ ๊ณตํต์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ถ๋ถ.
nestjs์์๋ ์์ฒด์ ์ผ๋ก ์์ธ ๋ ์ด๋ฌ๋ฅผ ๋๊ณ ์๋๋ฐ, ์ดํ๋ฆฌ์ผ์ด์ ์ด ์ ๋๋ก ์ฒ๋ฆฌํ์ง ๋ชปํ ์์ธ๋ฅผ ์ฒ๋ฆฌํจ.
์ฆ, ์์ ํ์ง ์์ ์์ธ๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ฒ๋ฆฌํด์ฃผ๋ ์ญํ ์ ํ๋ ๊ธฐ๋ณธ ๋ ์ด์ด๊ฐ ์์.
์ด ์ธ์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ถ๊ฑฐ๋, ์ฒ๋ฆฌํ ๋ฒ์๋ฅผ ์ง์ ํ๊ณ ์ถ๋ค๋ฉด ์์ธ ํํฐ๋ฅผ ์์ฑํ๋ฉด ๋จ.
ํ์ดํ(pipes)
ํด๋์ค์ @Injectable() ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋ฌ์ ์์ฑ
data transformation(ํ์๋ณํ) ๊ณผ data validation(ํ์๊ฒ์ฌ) ์ ์ํด ์ฌ์ฉ๋จ. @Param์ด๋ @Body ๋ฑ์ ์ธ์๋ก ์ ๋ฌ.
ํ์ดํ๋ ์ปจํธ๋กค๋ฌ์ ํธ๋ค๋ฌ๋ก ์ฒ๋ฆฌ๋๊ธฐ ์ , ์ธ์๋ค์ ํ์๋ณํ or ํ์๊ฒ์ฌ ํจ.
- Handler-level Pipes : ํธ๋ค๋ฌ ๋ ๋ฒจ์์ @UsePipes ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ด์ฉํด ์ฌ์ฉ. ํธ๋ค๋ฌ ๋จ์์์๋ง ์ ์ฉ๋จ
- Parameter-level Pipes : ํน์ ํ ํ๋ผ๋ฏธํฐ์๋ง ์ ์ฉ
- Global Pipes : ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด, ํด๋ผ์ด์ธํธ์ ๋ชจ๋ ์์ฒญ์ ์ ์ฉ๋จ. main.ts์ app.useGlobalPipes() ๋ก ์ ์ฉํจ.
์ฐธ๊ณ ) Built-in Pipes : nestjs์์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ง๋ค์ด๋ ํ์ดํ. ์ด 6๊ฐ์ง(ValidationPipe, ParseIntPipe, ParseBoolPipe, ParseArrayPipe, ParseUUIDPipe, ParseValuePipe)
๊ฐ๋(gaurds)
์ธ์ฆ์ ์์ฒญ์๊ฐ ๋๊ตฌ์ธ์ง ์ฆ๋ช , ์ธ๊ฐ๋ ์ธ์ฆ ํต๊ณผํ ์์ฒญ์๊ฐ ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์๊ฒฉ์ด ์๋์ง ํ์ธํจ.
๊ฐ๋๋ ์ธ๊ฐ๋ฅผ ๊ตฌํํ๋ ๊ฐ์ฅ ์ข์ ์ฌ๋ก์.
์ธ๊ฐ๋ฅผ ๋ฏธ๋ค์จ์ด๋ก ๊ตฌํํ ์ ์๋ ์ด์ : ๋ฏธ๋ค์จ์ด๋ ์คํ ์ปจํ ์คํธ(ExecutionContext) ์ ์ ๊ทผํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์์ ์ ์ผ๋ง ์ํํจ. ๋ฐ๋ฉด ๊ฐ๋๋ ์ ๊ทผ ๊ฐ๋ฅํ์ฌ, ๋ค์์ ์คํ๋ ์์ ์ ์๊ณ ์์.
์ธํฐ์ ํฐ(interceptors)
์์ฒญ๊ณผ ์๋ต์ ๊ฐ๋ก์ฑ์ ๋ณํ์ ๊ฐํจ.
๋ผ์ฐํธ ํธ๋ค๋ฌ๊ฐ ์์ฒญ/์๋ต ์ฒ๋ฆฌํ๊ธฐ ์ ์ ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๊ณ ์ถ๋ค๊ฑฐ๋, ์๋ต/์์ฒญ๋จ์์ ๋ฐ์ํ ์์ธ๋ฅผ ์ก์ ๋ณํ์ ๊ฐํ๋ค๊ฑฐ๋..
(ex-404 ์๋ฌ๋ฅผ 400 ์๋ฌ๋ก ๋ณํ...)
nestjs ๋ก์ง ํ๋ฆ
์์ฒญ > ์ปจํธ๋กค๋ฌ > ์๋น์ค > ์๋ต
- main.ts ์์ App Module ์ ์์ฑํ๊ณ ์คํํจ. 3000 port ์์ ๋๊ธฐ. app.module.ts ์๋ ์ปจํธ๋กค๋ฌ์ ์๋น์ค๊ฐ ๋ฑ๋ก๋์ด ์์.
- ํด๋ผ์ด์ธํธ๊ฐ endpoint(localhost:3000/) ๋ก request
- endpoint ๊ฐ '/' ์ธ ์ปจํธ๋กค๋ฌ ํธ์ถ
- ์ปจํธ๋กค๋ฌ์์ ์๋ง์ ๊ฒฝ๋ก๋ก ๋ผ์ฐํ ํ์ฌ ํด๋น ํธ๋ค๋ฌ๋ก ๊ฐ, ์ฐ๊ฒฐ๋ ์๋น์ค๋ฅผ ํธ์ถ
- ์๋น์ค๊ฐ response
์ฆ, ์ปจํธ๋กค๋ฌ๊ฐ ๋ผ์ฐํฐ ์ญํ ์ ํ๊ณ , ๋น์ฆ๋์ค ๋ก์ง์ ์๋น์ค๊ฐ ์ ๊ณต.