-
Notifications
You must be signed in to change notification settings - Fork 2
๐ NestJS ๊ธฐ๋ณธ ๊ฐ๋ โ Modules
NestJS ์ฑ์ ์์ฑํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋กย app.controller.ts
,ย app.module.ts
,ย app.service.ts
ย ๋ฑ์ผ๋ก ๋ณด์ผ๋ฌํ๋ ์ดํธ๊ฐ ๊ตฌ์ฑ๋์ด ์๊ณ ์ด๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ด ๊ตฌ๋๋๋ค
src
|- main.ts # Nest ์ฑ์ ์คํํ์ผ
|- app.module.ts # ์คํํ์ผ์์ ๋ฑ๋ก, ์ฌ์ฉํ๋ root ๋ชจ๋ํ์ผ
|- app.controller.ts # Nest ์ฑ์ root ๊ธฐ๋ณธ ์ปจํธ๋กค๋ฌ
|- app.service.ts # Nest ์ฑ์ root ๊ธฐ๋ณธ ๋น์ฆ๋์ค ์๋น์ค
์ด์ค ์ค์ ๊ฐ๋ ์ค ํ๋์ธ Module์ ๊ดํ ์ ๋ฆฌ๋ฅผ ์ํ ํฌ์คํธ์ด๋ค
๊ฐ๋จ ์์ ๋ฅผ ํตํด ๋ชจ๋์ด ์ด๋ป๊ฒ ์ฌ์ฉ์ด ๋๋์ง๋ฅผ ์ดํด๋ณด์
// app.module.ts
import { Module } from '@nestjs/common';
import { CatsModule } from './cats/cats.module';
@Module({
imports: [CatsModule],
})
export class AppModule {}
์ฐ์ NestJS์์ ๋ชจ๋์ @Module
์ด๋ผ๋ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ํตํ์ฌ ์ ์๋๋ค
ํด๋น ์์ ์์ AppModule
์ root์ ์์นํด ์๋ module๋ก์จ ์ง์
์ ์ ์ญํ ์ ๋ด๋นํ๊ฒ ๋๋ค. ๋ AppModule
์ด CatsModule
์ importํ์ฌ ์ฌ์ฉ ํ ์ ์๋ ๊ฒ์ ๋ณผ์๊ฐ ์๋ค
๊ทธ๋ ๋ค๋ฉด ์ฌ๊ธฐ์ import ๋๋ CatsModule
์ ์ด๋ค ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์๊น?
// cats.module.ts
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
@Module({
controllers: [CatsController],
providers: [CatsService],
exports: [CatsService]
})
export class CatsModule {}
CatsModule
์์ฒด์์๋ ๋ณ๋์ ๋ค๋ฅธ import๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์๋ค
๋ค๋ง CatsModule
์์์ controllers์ providers ์ต์
์ด ์๊ณ ๊ฐ๊ฐ CatsController
์ CatsService
๋ฅผ ๊ฐ๋ ๊ฒ์ ๋ณผ ์ ์๋ค
๊ฒฐ๊ตญ Module์ด๋ผ๋ ๊ฒ์ ์ฝ๊ฒ ๋งํ์๋ฉด ๊ตฌํํ๋ cats์ controller์ service, repository ๋ฑ provider๋ค์ ํ๋์ 'cats' ๋ชจ๋๋ก ๋ฌถ์ด์ฃผ๋ ์ญํ ์ ํ๋ค (Provider๋ค์ ์ฌ์ฉํ๊ณ ํ๋ก๊ทธ๋จ์ ์ง์ ์ ์ญํ ์ ํ๋ controller๋ค์ provider๋ ๋ถ๋ฆฌ๋์ด ๊ตฌ๋ถ์ด ๋๋ค)
๊ทธ๋ฌ๊ณ ๊ทธ๋ ๊ฒ ์ ์ ๋ CatsModule์ AppModule์์ importํ์ฌ ์ฌ์ฉ์ด ๋๋ ๊ฒ์ด๋ค
์ ์ฒด์ ์ธ ๊ตฌ์กฐ๋ฅผ ๋ชจ๋๋ก ํจ๊ณผ์ ์ผ๋ก ๋ณผ ์ ์๋ค:
๊ธฐ๋ณธ์ ์ผ๋ก @Module
๋ฐ์ฝ๋ ์ดํฐ ์์๋ ํ๋์ ๊ฐ์ฒด๋ง ๋ค์ด๊ฐ๋๋ฐ ์ด ๊ฐ์ฒด ๋ด attribute๋ค์ ๋ค์๊ณผ ๊ฐ์ด ์ ๋ฆฌ ํ ์๊ฐ ์๋ค (์ฐธ๊ณ ๋ก attribute๋ค์ ์ฌ๋ฌ๊ฐ๊ฐ ํ์ํ ๊ฒฝ์ฐ ๋ฐฐ์ด๋ก ์ ์๋ฅผ ํ ์๊ฐ ์๋ค)
-
providers
: Nest์ Injector์ ์ํด ์ธ์คํด์คํ ๋์ด ํด๋น ๋ชจ๋์์ ๊ณต์ ๋ ์ ์๋ provider๋ค -
controllers
: ๋ชจ๋ ๋ด์์ ์ธ์คํด์คํ ๋์ด์ผํ ๊ธฐ๋ฅ์ ๋ถํฉํ๋ controller list -
import
: ํด๋น ๋ชจ๋ ๋ด์์ ํ์ํ provider๋ฅผ exportํ๋ ๋ชจ๋์ ์ธ๋ถ์์ ๊ฐ์ ธ์ค๋ ๋ชฉ๋ก (์ฃผ๋ก ๋ชจ๋๋ง์ import ํ๋ค) -
export
: ํด๋น ๋ชจ๋์์ ์ ๊ณตํ๊ธฐ์, ํด๋น ๋ชจ๋์ importํ๋ ๋ค๋ฅธ ๋ชจ๋์์ ์ฌ์ฉํ ์ ์๋ provider์ ์งํฉ
Module์ import ํ๊ณ ๊ทธ๋๋ก ๋ค์ re-exportํ๋ ๋ฐฉ๋ฒ์ด ์๋๋ฐ, ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค
@Module({
imports: [CommnonModule],
exports: [CommonModule],
})
export class CoreModule {}
๊ฐ์ ธ์จ ๋ชจ๋์ ๋ฐ๋ก exportํ๋ฉด ์ข์ ์ ์ด ๋ญ๊น? ์ฃผ์ ์ฅ์ ์ผ๋ก๋
- ์ค๋ณต import ๋ฌธ ์ ๊ฑฐ
- ์์กด์ฑ ๊ด๋ฆฌ ๋จ์ํ๋ฅผ ํตํ ์ฝ๋ ์ ์ง ๋ณด์ ์ฉ์ด
- ๋ชจ๋ ๊ตฌ์กฐ์ ์ผ๊ด์ฑ ์ ์ง
๊ฐ ์๋ค
// core.module.ts
@Module({
imports: [
ConfigModule,
LoggerModule,
DatabaseModule
],
exports: [
ConfigModule,
LoggerModule,
DatabaseModule
]
})
export class CoreModule {}
// feature.module.ts
@Module({
imports: [CoreModule] // ํ์ํ ๋ชจ๋ ๋ชจ๋์ ํ ๋ฒ์ ์ํฌํธ
})
export class FeatureModule {}
ํด๋น ์์์์ CoreModule
์ด ConfigModule
, LoggerModule
, DatabaseModule
์ ๋ชจ๋ ๋ฐ์์์ ๋ฐ๋ก export๋ฅผ ํ๋ ๊ฒ์ ๋ณผ์๊ฐ ์๋ค
์ด๋ ๊ฒ ๋ ๊ฒฝ์ฐ์ FeatureModule
์์๋ ์๊ธฐ๋ ๋ชจ๋๋ค์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ CoreModule
ํ๋๋ง import ํ๋ฉด ๋๋ ๊ฒ์ด๋ ์ ๋ฐ์ ์ผ๋ก import์ ๊ดํ ๊ด๋ฆฌ๊ฐ ์ฉ์ดํด์ง ๊ฒ์ ๋ณผ์๊ฐ ์๋ค
Single Module Approach: ํ๋์ root module (์ฃผ๋ก app.module.ts)์์ ๋ชจ๋ ๊ธฐ๋ฅ์ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ ๋งํ๋ค
// app.module.ts
@Module({
imports: [
TypeOrmModule.forFeature([User, Order, Product, Payment]),
ConfigModule.forRoot(),
],
controllers: [
UserController,
OrderController,
...
],
providers: [
UserService,
OrderService,
ProductService,
...
],
})
export class AppModule {}
- ์ค์ ์ด ๊ฐ๋จํ๊ณ ๋น ๋ฅธ ๊ฐ๋ฐ์ด ๊ฐ๋ฅํ๋ค
- ์์กด์ฑ ๊ด๋ฆฌ๊ฐ ๋จ์ํ๋ค
- ๋ค๋ง ์ ํ๋ฆฌ์ผ์ด์ ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉด ๊ด๋ฆฌ ์ฐจ์์์ ์ด๋ ค์์ง ์๋ ์๋ค
- ๋ํ ๊ธฐ๋ฅ๋ณ ๋ถ๋ฆฌ๊ฐ ์ด๋ ค์ ์ง ์๋ ์๋ค
- ๋น๊ต์ ์์ ํ๋ก์ ํธ์ ์ ํฉํ๋ค
Multiple Module Approach : ์ฌ๋ฌ ๋ชจ๋๋ก ๋ถ๋ฆฌํ์ฌ ๋๋ฉ์ธ๋ณ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ์์ ๋งํ๋ค
์ฌ๋ฌ ๋ชจ๋๋ก ๋ถ๋ฆฌํ์ฌ ๋๋ฉ์ธ๋ณ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ์์ ๋งํ๋ค
// user.module.ts
@Module({
imports: [TypeOrmModule.forFeature([User])],
controllers: [UserController],
providers: [UserService],
exports: [UserService],
})
export class UserModule {}
// product.module.ts
@Module({
imports: [TypeOrmModule.forFeature([Product])],
controllers: [ProductController],
providers: [ProductService],
})
export class ProductModule {}
// app.module.ts
@Module({
imports: [
ConfigModule.forRoot(),
UserModule,
ProductModule,
...
],
})
export class AppModule {}
- ๋๋ฉ์ธ ๋ณ๋ก ๋ช ํํ ๊ฒฝ๊ณ๊ฐ ์ค์ ์ด ๋์ด์๊ณ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ๋ค
- ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ์ด ํฅ์ ๋๋ค
- ๋ค๋ง ์ด๊ธฐ ์ค์ ์ด ๋ณต์กํ๊ณ ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋๊ฐ ๋ง์์ง๋ค๋ ๋จ์ ์ด ์กด์ฌํ๋ค
๐ ffmpeg๋ stderr๋ก ๋๋ฒ๊น
์ ํ๋ ์ด์
๐ HLS ํ๋กํ ์ฝ์ ๊ดํ ์ ๋ฆฌ ๋ฐ FFmpeg ์ฌ์ฉ๊ธฐ
๐ ๋นํธ๋ tsconfig.json์ด ์ธ ๊ฐ?
๐ NestJS ๊ธฐ๋ณธ ๊ฐ๋
- Modules
๐ Socket.io ์ต(๊ฐ)์ ํ
๐ ๋์ปค์ nginx์ ์ฌ์ฉ๊ธฐ
๐ ๋ถํํ
์คํธ๋ฅผ ํด๋ณด์
๐ FSD ์ฌ์ฉ๊ธฐ, ๊ทผ๋ฐ ์ด์ ๋๋ง์ ๊ท์น์ ๊ณ๋ค์ธ
๐ CICD ๊ตฌ์กฐ ์์
๐ ์จ๋ฒ ๋จ์๋ก ์คํธ๋ฆฌ๋ฐ ํ๊ธฐ (with HLS)
๐ HLS๋ก ์์
์ฃผ๊ณ ๋ฐ๊ธฐ
๐ vite + react + typescript ํ๊ฒฝ์์ path alias ์ค์
๐ React Scan์ด ๋ญ์ฃ ?
๐ ๋ก์ปฌ ํ๊ฒฝ ๊ฐ๋ฐ ๋ชจ๋ ๋ฐฐํฌ
๐ ์จ๋ฒ ์ ์ฒด๋ฅผ ์คํธ๋ฆฌ๋ฐํ๋ค๊ณ ? (with HLS)
๐ ์ฝ๋์ ์์ ์ฑ์ ๋์ด๊ธฐ ์ํด ํ
์คํธ์ฝ๋๋ฅผ ์์ฑํด๋ณด์
๐ ์๋ก๊ณ ์นจ ์ HLS ERROR
๐ input ํ๊ทธ์ ํ๊ธ ์
๋ ฅ ํ, Enter๋ฅผ ๋๋ฅด๋ฉด ํจ์๊ฐ ๋๋ฒ ํธ์ถ๋๋ ์ค๋ฅ
๐ nginx proxy pass๋ฅผ ๋ฐ๊ฟจ๋๋ ์๊ธด ์๋ฌ - ์ค์จ๊ฑฐ ์ธ์ ๋ฌธ์
๐ ๋ฐฐํฌ ํ๊ฒฝ์์ ํด๋ผ์ด์ธํธ-์๋ฒ WS handshake
๐ ๋ ๋๋ง ๋ฒ์ธ์ ํ๋!
๐ ๊ทธ๋ผ์ด๋ ๋ฃฐ
๐ฅ ํ์ ์๊ฐ
๐ ์ฝ๋ & ๊น ์ปจ๋ฒค์
๐ณ ๊น branch ์ ๋ต
๐ ๋
ธ์
๋ฌธ์ ์ ์ฅ์
๐จ ํผ๊ทธ๋ง
๐งโ๐ป ๊ธฐํ ๊ณต์ ๋ฐํ ์๋ฃ
๐ค 2์ฃผ์ฐจ ๋ฐํ ์๋ฃ
๐ ๋ฐฑ๋ก๊ทธ
๐ 1์ฃผ์ฐจ
๐ 2์ฃผ์ฐจ
๐ 3์ฃผ์ฐจ
๐ 4์ฃผ์ฐจ
๐ 5์ฃผ์ฐจ
๐๏ธ 1์ฃผ์ฐจ
๐๏ธ 2์ฃผ์ฐจ
๐๏ธ 3์ฃผ์ฐจ
๐๏ธ 4์ฃผ์ฐจ
๐๏ธ 5์ฃผ์ฐจ
โจ 1์ฃผ์ฐจ
โจ 2์ฃผ์ฐจ
โจ 3์ฃผ์ฐจ
โจ 4์ฃผ์ฐจ