Nest.js ์คํฐ๋๋ฅผ ์์ํ๋ค. ์ฑ
์ด ์์ง๋ง, ์ด๋ ๊ฒ ์ผ์ฐ ์ฌ ์ค ๋ชฐ๋์ด์ ์ด๋ฒ ์ฃผ ๊ณผ์ ๋ ์ธํ๋ฐ ๋ฌด๋ฃ ๊ฐ์๋ฅผ ์น์
3๊น์ง ๋ฃ๊ณ ์ค๋๊ฑธ๋ก ํ๋ค. ๋ง์ ๋ฃ๊ณ ๋ณด๋ ๋๋ฌด ์ด๋ฐ ๋ถ๋ถ์ด๊ธด ํ์ง๋ง, Nest ๋ง๋ณด๊ธฐ์๋ ์ถฉ๋ถํ์!
๊ฐ์ ๋งํฌ
[์ง๊ธ ๋ฌด๋ฃ]๋ฐ๋ผํ๋ฉฐ ๋ฐฐ์ฐ๋ NestJS ๊ฐ์ | John Ahn - ์ธํ๋ฐ
John Ahn | , ๋ ธ๋ ๊ฐ๋ฐ์๋ผ๋ฉด ์ฃผ๋ชฉ!์์ฆ ๋จ๋ NestJS๋ฅผ ์๊ฐํฉ๋๋ค. ๊ฐ์ ์๊ฐ ์๋ ํ์ธ์. ์ด๋ฒ ๊ฐ์์์๋ NestJS์ ๋ํด ๋ค๋ค๋ดค์ต๋๋ค. NestJS๋? [์ฌ์ง] ๊ฐ๋ ฅํ๊ณ ๊น๋ค๋ก์ด ๋ฐฑ์๋ ์์คํ ์ ๋ง๋ค๊ธฐ
www.inflearn.com
๐บNest.js๋?
NestJS๋ ํจ์จ์ ์ด๊ณ ํ์ฅ ๊ฐ๋ฅํ Node.js ์๋ฒ ์ธก ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ๊ธฐ ์ํ ํ๋ ์์ํฌ์ด๋ค. Javascript์ Typescript ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ฉฐ, ๊ฐ์ฒด์งํฅ, ํจ์ํ, ํจ์ํ ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ ์์๋ฅผ ๋ชจ๋ ํ์ฉํ ์ ์๋ค.
๋ด๋ถ์ ์ผ๋ก๋ Express์ ๊ฐ์ HTTP ์๋ฒ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ง๋ง, ์ ํ์ ์ผ๋ก Fastify๋ก ๋์ฒดํ ์๋ ์๋ค. NestJS์ ํฐ ์ฅ์ ์ ๊ธฐ์กด ํ๋ ์์ํฌ ์์ ์ถ์ํ ๊ณ์ธต์ ์ ๊ณตํ๋ฉด์๋, ํ์ํ ๋๋ Express๋ Fastify์ API๋ฅผ ์ง์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋ค๋ ์ ์ด๋ค.
NestJS ์ฒ ํ
Node.js ์ํ๊ณ์๋ ์ด๋ฏธ ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๊ตฌ๊ฐ ์์ง๋ง, ์ํคํ
์ฒ ์ธก๋ฉด์ ๋ฌธ์ ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํด๊ฒฐํด์ฃผ๋ ๊ฒ์ ๋ง์ง ์์๋ค. NestJS๋ Angular์์ ์๊ฐ์ ๋ฐ์, ๊ฐ๋ฐ์๋ค์ด ํ
์คํธํ๊ธฐ ์ฝ๊ณ ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค ์ ์๋๋ก ๊ตฌ์กฐํ๋ ์ํคํ
์ฒ๋ฅผ ์ ๊ณตํ๋ค.
Express๋ง ์ฌ์ฉํ ๋๋ ํ
์คํธ, ๋ก๊น
, ์ ํจ์ฑ ๊ฒ์ฌ ๋ฑ์ ๊ธฐ๋ฅ์ ์ผ์ผ์ด ์ค์ ํด์ผ ํ์ง๋ง, NestJS๋ ์ด๋ฐ ๊ธฐ๋ฅ๋ค์ ๋ช
๋ น์ด ํ๋๋ก ์ฝ๊ฒ ์ถ๊ฐํ ์ ์๊ฒ ํด์ค๋ค.
NestJS ์์ํ๊ธฐ
npm i -g @nestjs/cli
nest new project-name
์ ๋ช ๋ น์ด๋ก NestJS CLI๋ฅผ ์ค์นํ๊ณ ์ ํ๋ก์ ํธ๋ฅผ ์์ฑํ ์ ์๋ค. ์ ํ๋ก์ ํธ๊ฐ ์์ฑ๋๋ฉด ์ด๊ธฐ ํต์ฌ ํ์ผ๊ณผ ํด๋ ๊ตฌ์กฐ๊ฐ ์๋์ผ๋ก ๋ง๋ค์ด์ง๋ค.

CLI๋ฅผ ์ฌ์ฉํ๋ ์ด์
NestJS CLI๋ ๋จ์ํ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ ๊ฒ ์ด์์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ๋ชจ๋, ์ปจํธ๋กค๋ฌ, ์๋น์ค ๋ฑ์ ์ปดํฌ๋ํธ๋ฅผ ์ฝ๊ฒ ์์ฑํ ์ ์๊ณ , ํ๋ก์ ํธ ๋น๋์ ์คํ๋ ๊ฐํธํ๊ฒ ํ ์ ์๋ค. ๋ํ Hot Reload ์ง์์ผ๋ก ๊ฐ๋ฐ ์์ฐ์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์๋ค.
์ฃผ์ ๋ช
๋ น์ด๋ ๋ค์๊ณผ ๊ฐ๋ค:
nest new [ํ๋ก์ ํธ๋ช
] // ์ ํ๋ก์ ํธ ์์ฑ
nest generate [ํญ๋ชฉ] // ์ปดํฌ๋ํธ ์์ฑ
nest build // ํ๋ก์ ํธ ๋น๋
nest start // ์๋ฒ ์คํ
๐ธNestJS ๊ตฌ์กฐ
์ฑ ๊ตฌ์กฐ
์๋ ๊ตฌ์กฐ๋ ๊ฐ์์์ ๋ค๋ฃจ๋ CRUD ํ๋ก์ ํธ์ ๋ํ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์กฐ์ด๋ค.
NestJS ์ ํ๋ฆฌ์ผ์ด์ ์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ๋ฌ ๋ชจ๋๋ก ๊ตฌ์ฑ๋๋ค. ์๋ฅผ ๋ค์ด ๊ฒ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์ ์๋ค:
App module
- ๊ฒ์๊ธ์ ๋ง๋๋ ์ฌ๋์ ๋ํ ์ธ์ฆ ๋ชจ๋(AuthModule)
- AuthController
- UserEntity
- AuthService
- UserRepository
- JWT, PassPort
- ๊ฒ์๊ธ์ ๋ํ ๋ชจ๋(BoardModule)
- BoardController
- BoardEntity
- BoardService
- BoardRepository
- ValidationPipe
ํ๋ก์ ํธ ๊ธฐ๋ณธ ์์ฑ ํ์ผ
NestJS ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ฉด ์ฌ๋ฌ ์ค์ ํ์ผ๋ค์ด ์๋์ผ๋ก ๋ง๋ค์ด์ง๋ค. ๊ฐ ํ์ผ์ ์ญํ ์ ๋ค์๊ณผ ๊ฐ๋ค:
eslintrc.js
: ํน์ ํ ๊ท์น์ ๊ฐ์ง๊ณ ์ฝ๋๋ฅผ ๊น๋ํ๊ฒ ์งค ์ ์๊ฒ ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(๋ฌธ๋ฒ ์ค๋ฅ ์ฒดํฌ ๋ฑ)prettierrc
: ์ฝ๋ ํ์์ ๋ง์ถ๋๋ฐ ์ฌ์ฉ(์๋ฌ๋ ์ฐพ์ง ์๊ณ , ์ฝ๋ ํฌ๋งทํฐ ์ญํ ์ ํจ)nest-cli.json
: nest ํ๋ก์ ํธ๋ฅผ ์ํด ํน์ ํ ์ค์ ์ ํ ์ ์๋ json ํ์ผtsconfig.json
: ์ด๋ป๊ฒ ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ปดํ์ผํ ์ง ์ค์ ํ๋ ํ์ผtsconfig.build.json
:tsconfig.json
์ ์ฐ์ฅ์ ์ ํ์ผ์ผ, ๋น๋๋ฅผ ํ ๋ ํ์ํ ์ค์ ๋ค์ ์์ฑํ๋ ํ์ผ
{
"extends": "./tsconfig.json",
"exclude": ["node_modules", "test", "dist", "**/*spec.ts"] //๋น๋ํ ๋ ํ์์๋ ํ์ผ๋ค ๋ช
์
}
package.json
: ๋ช ๋ น์ด, ์์กด์ฑ ๋ฑ์ด ์์ฑ๋์ด ์๋ ํ์ผsrc
ํด๋:main.ts
๋ ์ฑ์ ์์ฑํ๊ณ ์คํ,app.module.ts
๋ ์ฑ ๋ชจ๋์ ์ ์
NestJS ๋ก์ง ํ๋ฆ
NestJS ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฒญ ์ฒ๋ฆฌ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ๋ค:
- ์์์ (Entry Point)
main.ts
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์์์ ์ผ๋ก, NestFactory๋ฅผ ์ฌ์ฉํด ์ฑ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ HTTP ์๋ฒ๋ฅผ ์์ํ๋ค.
- ๋ชจ๋ (Module)
app.module.ts
- ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฃจํธ ๋ชจ๋๋ก, ์ปจํธ๋กค๋ฌ์ ์๋น์ค๋ฅผ ๋ฑ๋กํ๊ณ ๊ด๋ฆฌํ๋ค.
- ์์กด์ฑ ์ฃผ์ ์ ๊ธฐ๋ฐ์ด ๋๋ค.
- ์ปจํธ๋กค๋ฌ (Controller)
app.controller.ts
- HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ๋ผ์ฐํ ์ ๋ด๋นํ๋ค.
- ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์ ์๋น์ค๋ก ์ ๋ฌํ๋ ์ญํ ์ ํ๋ค.
- ์๋น์ค (Service)
app.service.ts
- ์ค์ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ค.
- ์ปจํธ๋กค๋ฌ๋ก๋ถํฐ ๋ฐ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
- ์์ฒญ-์๋ต ์ฌ์ดํด
- ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ๋ณด๋ด๋ฉด ์ปจํธ๋กค๋ฌ๊ฐ ์ด๋ฅผ ๋ฐ์ ์๋น์ค์ ์ ๋ฌํ๊ณ , ์๋น์ค๊ฐ ์ฒ๋ฆฌํ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์ปจํธ๋กค๋ฌ๋ฅผ ํตํด ํด๋ผ์ด์ธํธ์๊ฒ ์๋ตํ๋ค.
โญ ๊ธฐ๋ณธ์ ์ธ ์์ฒญ ํ๋ฆ์ request -> controller -> service -> controller -> response ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ง๋ค.
๐นNestJS ๋ชจ๋
๋ชจ๋์ @Module()
๋ฐ์ฝ๋ ์ดํฐ๋ก ์ฃผ์์ด ๋ฌ๋ฆฐ ํด๋์ค์ด๋ค. NestJS ์ ํ๋ฆฌ์ผ์ด์
์ ์ต์ํ ํ๋์ ๋ฃจํธ ๋ชจ๋์ด ํ์ํ๋ฉฐ, ์ด ๋ชจ๋์ ์์์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ด ๊ตฌ์ฑ๋๋ค.
๋ชจ๋์ ๊ด๋ จ๋ ๊ธฐ๋ฅ์ ๊ทธ๋ฃนํํ๋ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค. ์๋ฅผ ๋ค์ด ์ฌ์ฉ์ ๊ด๋ฆฌ, ๊ฒ์ํ ๊ด๋ฆฌ ๋ฑ์ ๊ธฐ๋ฅ์ ๊ฐ๊ฐ ๋ณ๋์ ๋ชจ๋๋ก ๋ถ๋ฆฌํ ์ ์๋ค. ๊ฐ ๋ชจ๋์ ์์ ๋ง์ ์ปจํธ๋กค๋ฌ, ์๋น์ค, ๊ธฐํ ํ๋ก๋ฐ์ด๋๋ฅผ ๊ฐ์ง ์ ์๋ค.
NestJS์ ๋ชจ๋์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌ๋๊ธฐ ๋๋ฌธ์, ์ฌ๋ฌ ๋ชจ๋์์ ๋์ผํ ํ๋ก๋ฐ์ด๋ ์ธ์คํด์ค๋ฅผ ๊ณต์ ํ ์ ์๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ๊ณผ ์ํ ๊ด๋ฆฌ ์ธก๋ฉด์์ ํฐ ์ฅ์ ์ด๋ค.
๋ชจ๋์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค:
@Module({
imports: [๊ด๋ จ ๋ชจ๋๋ค],
controllers: [ํด๋น ๋ชจ๋์ ์ปจํธ๋กค๋ฌ๋ค],
providers: [ํด๋น ๋ชจ๋์ ์๋น์ค๋ค],
exports: [๋ค๋ฅธ ๋ชจ๋์์ ์ฌ์ฉํ ์ ์๊ฒ ๋ด๋ณด๋ผ ์๋น์ค๋ค]
})
์ ๋ชจ๋์ CLI๋ฅผ ํตํด ์ฝ๊ฒ ์์ฑํ ์ ์๋ค:
nest g module boards
์ ๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด boards ํด๋๊ฐ ์์ฑ๋๊ณ ๊ทธ ์์ ๋ชจ๋ ํ์ผ์ด ์๋์ผ๋ก ์ถ๊ฐ๋๋ค.
NestJS ์ปจํธ๋กค๋ฌ
์ปจํธ๋กค๋ฌ๋ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ค์ด์ค๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์๋ต์ ๋ฐํํ๋ ์ญํ ์ ํ๋ค. @Controller
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ํ๋ฉฐ, ์ด ๋ฐ์ฝ๋ ์ดํฐ์๋ ํด๋น ์ปจํธ๋กค๋ฌ๊ฐ ๋ด๋นํ ๋ผ์ฐํธ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ ์ ์๋ค.
์๋ฅผ ๋ค์ด @Controller('boards')
๋ก ์ ์ํ๋ฉด ์ด ์ปจํธ๋กค๋ฌ๋ /boards
๊ฒฝ๋ก๋ก ๋ค์ด์ค๋ ๋ชจ๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ฒ ๋๋ค.
์ปจํธ๋กค๋ฌ๋ CLI๋ฅผ ํตํด ์ฝ๊ฒ ์์ฑํ ์ ์๋ค:
nest g controller boards --no-spec
์ฌ๊ธฐ์ --no-spec
์ต์
์ ํ
์คํธ ํ์ผ์ ์์ฑํ์ง ์๋๋ก ์ง์ ํ๋ ๊ฒ์ด๋ค.
NestJS ํธ๋ค๋ฌ
ํธ๋ค๋ฌ๋ ์ปจํธ๋กค๋ฌ ํด๋์ค ๋ด๋ถ์ ์ ์๋ ๋ฉ์๋๋ก, HTTP ์์ฒญ ๋ฉ์๋(@Get
, @Post
, @Delete
๋ฑ)์ ๋์ํ๋ ๋ฐ์ฝ๋ ์ดํฐ๋ก ์ฅ์๋๋ค. ์ด ๋ฉ์๋๋ค์ ํด๋ผ์ด์ธํธ์ ํน์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์ญํ ์ ํ๋ค.
์๋ฅผ ๋ค์ด:
@Get()
getAllBoards() {
return this.boardsService.getAllBoards();
}
์ด ๋ฉ์๋๋ GET ์์ฒญ์ด ์ปจํธ๋กค๋ฌ์ ๊ธฐ๋ณธ ๊ฒฝ๋ก(/boards
)๋ก ๋ค์ด์ฌ ๋ ์คํ๋๋ค.
NestJS ํ๋ก๋ฐ์ด๋
ํ๋ก๋ฐ์ด๋๋ NestJS์ ํต์ฌ ๊ฐ๋
์ค ํ๋๋ก, ๋ค์ํ ์ข
๋ฅ์ ์๋น์ค, ๋ฆฌํฌ์งํ ๋ฆฌ, ํฉํ ๋ฆฌ, ํฌํผ ๋ฑ์ด ๋ชจ๋ ํ๋ก๋ฐ์ด๋๋ก ์ทจ๊ธ๋ ์ ์๋ค. ํ๋ก๋ฐ์ด๋์ ์ฃผ์ ํน์ง์ ์์กด์ฑ ์ฃผ์
(Dependency Injection)์ ํตํด ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ ์ฌ์ฉ๋ ์ ์๋ค๋ ์ ์ด๋ค.
๋ชจ๋์์ ํ๋ก๋ฐ์ด๋๋ฅผ ๋ฑ๋กํ๋ ค๋ฉด @Module
๋ฐ์ฝ๋ ์ดํฐ์ providers
๋ฐฐ์ด์ ์ถ๊ฐํ๋ฉด ๋๋ค:
@Module({
controllers: [BoardsController],
providers: [BoardsService]
})
NestJS ์๋น์ค
์๋น์ค๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋นํ๋ ํ๋ก๋ฐ์ด๋์ด๋ค. @Injectable
๋ฐ์ฝ๋ ์ดํฐ๋ก ํ์๋๋ฉฐ, ์ด๋ฅผ ํตํด NestJS์ ์์กด์ฑ ์ฃผ์
์์คํ
์ ๋ฑ๋ก๋๋ค.
์ปจํธ๋กค๋ฌ๋ HTTP ์์ฒญ๊ณผ ์๋ต์ ์ฒ๋ฆฌํ๋ ์ญํ ์ ์ง์คํ๊ณ , ๋ณต์กํ ์์
์ ์๋น์ค๋ก ์์ํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค. ์๋ฅผ ๋ค์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ, ์ ํจ์ฑ ๊ฒ์ฌ, ๋น์ฆ๋์ค ๋ก์ง ๋ฑ์ ์์
์ ์๋น์ค์์ ์ฒ๋ฆฌํ๋ค.
์๋น์ค๋ CLI๋ฅผ ํตํด ์ฝ๊ฒ ์์ฑํ ์ ์๋ค:
nest g service boards --no-spec
๐์์กด์ฑ ์ฃผ์ (Dependency Injection)
์์กด์ฑ ์ฃผ์
์ NestJS์ ํต์ฌ ๊ธฐ๋ฅ ์ค ํ๋๋ก, ์ปดํฌ๋ํธ ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ํ
์คํธ ์ฉ์ด์ฑ์ ๋์ด๋ ๋ฐฉ๋ฒ์ด๋ค. NestJS์์๋ ํด๋์ค์ ์์ฑ์๋ฅผ ํตํด ์์กด์ฑ์ ์ฃผ์
ํ๋ค.
์๋ฅผ ๋ค์ด, BoardsController์์ BoardsService๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ค:
@Controller('boards')
export class BoardsController {
constructor(private boardsService: BoardsService) {}
@Get()
getAllBoards() {
return this.boardsService.getAllBoards();
}
}
์ฌ๊ธฐ์ private boardsService: BoardsService
๋ TypeScript์ ๋จ์ถ ๊ตฌ๋ฌธ์ผ๋ก, ๋ค์๊ณผ ๊ฐ์ ์๋ฏธ๋ฅผ ๊ฐ๋๋ค:
- BoardsService ํ์ ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์์ฑ์์์ ๋ฐ๋๋ค.
- ์ด ํ๋ผ๋ฏธํฐ๋ฅผ ํด๋์ค์ private ์์ฑ์ผ๋ก ์๋ ์ ์ฅํ๋ค.
์ด๋ ๋ค์ ์ฝ๋์ ๋์ผํ๋ค:
@Controller('boards')
export class BoardsController {
private boardsService: BoardsService;
constructor(boardsService: BoardsService) {
this.boardsService = boardsService;
}
}
์ด๋ ๊ฒ ์์กด์ฑ์ ์ฃผ์
๋ฐ์ผ๋ฉด ์ปจํธ๋กค๋ฌ ๋ด์ ๋ชจ๋ ๋ฉ์๋์์ this.boardsService
๋ฅผ ํตํด ์๋น์ค์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค. NestJS๋ ์๋์ผ๋ก BoardsService์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ BoardsController์ ์์ฑ์์ ์ ๋ฌํด์ค๋ค.
์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ๋์ ๊ณผ์ ์ ๊ฐ์ง๋ค:
- NestJS๊ฐ BoardsController๋ฅผ ์ด๊ธฐํํ ๋, BoardsService์ ์ธ์คํด์ค๊ฐ ํ์ํ๋ค๋ ๊ฒ์ ์ธ์ํ๋ค.
- NestJS๋ BoardsService์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค (๋๋ ์ด๋ฏธ ์กด์ฌํ๋ ์ธ์คํด์ค๋ฅผ ์ฌ์ฌ์ฉํ๋ค).
- ์ด ์ธ์คํด์ค๋ฅผ BoardsController์ ์์ฑ์์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํ๋ค.
- TypeScript์ ๋จ์ถ ๊ตฌ๋ฌธ ๋๋ถ์, ์ด ์ธ์คํด์ค๋ ์๋์ผ๋ก ์ปจํธ๋กค๋ฌ์ boardsService ํ๋กํผํฐ์ ํ ๋น๋๋ค.
- ์ด์ ์ปจํธ๋กค๋ฌ์ ๋ชจ๋ ๋ฉ์๋์์ this.boardsService๋ฅผ ํตํด ์๋น์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์๋ค.
๐NestJS์ ์ฑ๊ธํค ๋ชจ๋ ์์คํ
NestJS์์ ๋ชจ๋๊ณผ ํ๋ก๋ฐ์ด๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธํค ํจํด์ผ๋ก ๊ด๋ฆฌ๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฒด์์ ํด๋น ํด๋์ค์ ์ธ์คํด์ค๊ฐ ๋จ ํ๋๋ง ์์ฑ๋๊ณ ๊ณต์ ๋๋ค๋ ์๋ฏธ์ด๋ค.
์ด๋ฌํ ์ฑ๊ธํค ํน์ฑ์ ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ ์ ๊ณตํ๋ค:
- ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ: ๋์ผํ ์๋น์ค๋ ์ปดํฌ๋ํธ๋ฅผ ์ฌ๋ฌ ๋ฒ ์์ฑํ์ง ์์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๊ฐ์ํ๋ค.
- ์ํ ๊ณต์ : ์ฌ๋ฌ ๋ชจ๋์์ ๋์ผํ ์๋น์ค ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ์ํ ๊ด๋ฆฌ๊ฐ ์ผ๊ด๋๊ฒ ์ด๋ฃจ์ด์ง๋ค.
- ์ฑ๋ฅ ํฅ์: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ด๋ ์ธ๋ถ API ํด๋ผ์ด์ธํธ์ ๊ฐ์ ๋ฆฌ์์ค๋ฅผ ํ ๋ฒ๋ง ์์ฑํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
๋ชจ๋ ๊ฐ์ ํ๋ก๋ฐ์ด๋๋ฅผ ๊ณต์ ํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํ๋ค:
// ๋ชจ๋ A์์ ์๋น์ค ์ ์ ๋ฐ ๋ด๋ณด๋ด๊ธฐ
@Module({
providers: [SharedService],
exports: [SharedService]
})
export class ModuleA {}
// ๋ชจ๋ B์์ ๋ชจ๋ A ๊ฐ์ ธ์ค๊ธฐ
@Module({
imports: [ModuleA],
controllers: [SomeController]
})
export class ModuleB {}
์ด๋ ๊ฒ ํ๋ฉด ModuleB์ ์ปจํธ๋กค๋ฌ๋ ์๋น์ค์์ ModuleA์ SharedService๋ฅผ ์์กด์ฑ ์ฃผ์
์ ํตํด ์ฌ์ฉํ ์ ์๋ค.
์๋ฅผ ๋ค์ด, ์นด์ดํฐ ์๋น์ค๋ฅผ ์ฌ๋ฌ ๋ชจ๋์์ ๊ณต์ ํ๋ ๊ฒฝ์ฐ:
// ๋ชจ๋ A์์ ์ ์ํ ์๋น์ค
@Injectable()
export class SharedService {
private count = 0;
incrementCount() {
this.count++;
return this.count;
}
}
// ๋ชจ๋ A
@Module({
providers: [SharedService],
exports: [SharedService], // ๋ค๋ฅธ ๋ชจ๋์์ ์ฌ์ฉํ ์ ์๋๋ก ๋ด๋ณด๋ด๊ธฐ
})
export class ModuleA {}
// ๋ชจ๋ B
@Module({
imports: [ModuleA], // ModuleA์ ์๋น์ค๋ฅผ ๊ฐ์ ธ์ ์ฌ์ฉ
controllers: [SomeController],
})
export class ModuleB {}
์ด์ ModuleB์ ์ปจํธ๋กค๋ฌ์์ SharedService๋ฅผ ์ฃผ์ ๋ฐ์ ์ฌ์ฉํ ์ ์๋ค:
@Controller('some')
export class SomeController {
constructor(private sharedService: SharedService) {}
@Get('increment')
increment() {
return this.sharedService.incrementCount();
}
}
์ด ์ปจํธ๋กค๋ฌ์์ /some/increment
์๋ํฌ์ธํธ์ ์ ๊ทผํ ๋๋ง๋ค ์นด์ดํฐ๊ฐ ์ฆ๊ฐํ๊ณ , ์ด ์นด์ดํฐ ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฒด์์ ๊ณต์ ๋๋ค. ๋ค๋ฅธ ๋ชจ๋์์ ๊ฐ์ SharedService๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ผํ ์นด์ดํฐ ๊ฐ์ ๋ณผ ์ ์๋ค.
์ฑ๊ธํค ํจํด์ NestJS์ ํต์ฌ ์ค๊ณ ์์น ์ค ํ๋๋ก, ๋ชจ๋๊ณผ ์๋น์ค์ ํจ์จ์ ์ธ ์ฌ์ฌ์ฉ๊ณผ ์์กด์ฑ ๊ด๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ์ค์ํ ๊ฐ๋
์ด๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ, ์บ์ ์๋น์ค, ์ค์ ๊ด๋ฆฌ ๋ฑ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฒด์์ ์ผ๊ด๋ ์ํ๊ฐ ํ์ํ ๊ฒฝ์ฐ์ ํนํ ์ ์ฉํ๋ค.
์ฝ๋๋ฅผ ์ดํดํ๋๊ฒ ์กฐ๊ธ ์ด๋ ต๊ธด ํ๋ค. ์์กด์ฑ ์ฃผ์ ์ด๋ฉฐ ์ฑ๊ธํค ํจํด์ด๋ฉฐ ์ ๋๋ก ๊ณต๋ถํด๋ณธ ์ ์๋ ๋ด์ฉ๋ค์ด ํ๋ชฐ์์ณ์ ์ ๊น ๊ณ ๋น๊ฐ ์์์ง๋ง, ๊ฐ์ ๋ถ๋๋ ์งง๊ณ ์ค๋ช ๋ ์ฌ์์ ๋ฌด์ฌํ ์ฒซ ์ฃผ ๋ฏธ์ ์ ์์ํ ์ ์์๋ค. CLI๋ฅผ ํตํด ๋ชจ๋, ์ปจํธ๋กค๋ฌ, ์๋น์ค๋ฅผ ๋ง๋๋๋ฐ ๋๋ฌด ํธ๋ฆฌํด์ NestJS ์ฒซ์ธ์์ ์ง์ง ์ต๊ณ .