๐ ๏ธ NestJS ๋ด์ฅ ๊ธฐ๋ฅ ์์ ์ ๋ณต
๐ ํต์ฌ ์์ฝ
• Guards & Interceptors • Pipes & Filters • ๋ฏธ๋ค์จ์ด • ๋ฐ์ฝ๋ ์ดํฐ • ์์ธ ์ฒ๋ฆฌ • ์ ํจ์ฑ ๊ฒ์ฆ • ์บ์ฑ • ์ค์ผ์ค๋ง
NestJS๋ ์ํฐํ๋ผ์ด์ฆ๊ธ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ํ์ํ ๋ค์ํ ๊ธฐ๋ฅ๋ค์ ๋ด์ฅํ๊ณ ์์ด, ๊ฐ๋ฐ์๊ฐ ๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ด๋ ๊ฐ๋ ฅํ ๋ฐฑ์๋ ์๋น์ค๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ๐ ์ด๋ฌํ ๋ด์ฅ ๊ธฐ๋ฅ๋ค์ ๋ฐ์ฝ๋ ์ดํฐ ํจํด๊ณผ ์์กด์ฑ ์ฃผ์ ์ ํตํด ์ ์ธ์ ์ด๊ณ ์ง๊ด์ ์ธ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํนํ ์์ฒญ ๋ผ์ดํ์ฌ์ดํด ๊ด๋ฆฌ๋ฅผ ์ํ Guards, Interceptors, Pipes, Filters ๋ฑ์ ๊ธฐ๋ฅ๋ค์ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ๋ชจ๋ํ๋ฅผ ๊ทน๋ํํ๋ฉฐ, ํก๋จ ๊ด์ฌ์ฌ(Cross-cutting Concerns)๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ถ๋ฆฌํ ์ ์๊ฒ ํด์ค๋๋ค. โก
๐ Guards - ์ธ์ฆ๊ณผ ์ธ๊ฐ
Guards๋ ์์ฒญ์ด ๋ผ์ฐํธ ํธ๋ค๋ฌ์ ๋๋ฌํ๊ธฐ ์ ์ ์คํ๋๋ ๋ณด์ ๊ณ์ธต์ ๋๋ค. ๐ก๏ธ ์ฃผ๋ก ์ธ์ฆ(Authentication)๊ณผ ์ธ๊ฐ(Authorization)๋ฅผ ๋ด๋นํ๋ฉฐ, CanActivate ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํฉ๋๋ค.
์นดํ ๊ณ ๋ฆฌ | Guard ์ ํ | ์ฌ์ฉ ๋ชฉ์ | ์ ์ฉ ๋ฒ์ |
---|---|---|---|
ํต์ฌ ๊ธฐ๋ฅ | AuthGuard | ์ฌ์ฉ์ ์ธ์ฆ ํ์ธ | โ ๊ธ๋ก๋ฒ/์ปจํธ๋กค๋ฌ/๋ฉ์๋ |
ํต์ฌ ๊ธฐ๋ฅ | RolesGuard | ์ญํ ๊ธฐ๋ฐ ์ ๊ทผ ์ ์ด | โ ๋ฉ์๋๋ณ ์ธ๋ฐ ์ ์ด |
์ฑ๋ฅ ๊ด๋ จ | ThrottlerGuard | API ํธ์ถ ์ ํ | โ DDoS ๋ฐฉ์ด |
๊ฐ๋ฐ ๊ฒฝํ | JwtAuthGuard | JWT ํ ํฐ ๊ฒ์ฆ | โ ๋ฌด์ํ ์ธ์ฆ |
๐ Interceptors - ์์ฒญ/์๋ต ๋ณํ
Interceptors๋ AOP(Aspect-Oriented Programming) ํจํด์ ๊ตฌํํ์ฌ ์์ฒญ ์ ํ ์ฒ๋ฆฌ ๋ก์ง์ ๊น๋ํ๊ฒ ๋ถ๋ฆฌํ ์ ์๊ฒ ํด์ค๋๋ค. ๐ NestInterceptor ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ฉฐ, ๋ก๊น , ์บ์ฑ, ์๋ต ๋ณํ ๋ฑ ๋ค์ํ ์ฉ๋๋ก ํ์ฉ๋ฉ๋๋ค.
์นดํ ๊ณ ๋ฆฌ | Interceptor ์ ํ | ๊ธฐ๋ฅ | ์ฅ์ |
---|---|---|---|
๊ฐ๋ฐ ๊ฒฝํ | LoggingInterceptor | ์์ฒญ/์๋ต ๋ก๊น | โ ๋๋ฒ๊น ํธ์์ฑ |
์ฑ๋ฅ ๊ด๋ จ | CacheInterceptor | ์๋ต ์บ์ฑ | โ ์ฑ๋ฅ ์ต์ ํ |
ํต์ฌ ๊ธฐ๋ฅ | TransformInterceptor | ์๋ต ๋ฐ์ดํฐ ๋ณํ | โ ์ผ๊ด๋ API ํ์ |
๊ฐ๋ฐ ๊ฒฝํ | TimeoutInterceptor | ์์ฒญ ํ์์์ ์ฒ๋ฆฌ | โ ์์ ์ฑ ํฅ์ |
๐ง Pipes - ๋ฐ์ดํฐ ๋ณํ๊ณผ ๊ฒ์ฆ
Pipes๋ ๋ผ์ฐํธ ํธ๋ค๋ฌ๊ฐ ์คํ๋๊ธฐ ์ ์ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๊ฑฐ๋ ๊ฒ์ฆํ๋ ์ญํ ์ ํฉ๋๋ค. ๐ง PipeTransform ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ฉฐ, NestJS๋ ์ฌ๋ฌ ์ ์ฉํ ๋ด์ฅ ํ์ดํ๋ฅผ ์ ๊ณตํฉ๋๋ค.
ํนํ ValidationPipe๋ class-validator์ ์ฐ๋๋์ด DTO ๊ธฐ๋ฐ์ ๊ฐ๋ ฅํ ์ ํจ์ฑ ๊ฒ์ฆ์ ์ ๊ณตํฉ๋๋ค. ๐ ์ด๋ฅผ ํตํด API ์ ๋ ฅ๊ฐ์ ํ์ ์์ ์ฑ๊ณผ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
Pipe ์ด๋ฆ | ๊ธฐ๋ฅ | ์ฌ์ฉ ์ฌ๋ก | ์์ |
---|---|---|---|
ValidationPipe | DTO ๊ธฐ๋ฐ ๊ฒ์ฆ | โ ์์ฒญ ๋ฐ๋ ๊ฒ์ฆ | @Body() dto: CreateUserDto |
ParseIntPipe | ๋ฌธ์์ด์ ์ ์๋ก ๋ณํ | โ ๊ฒฝ๋ก ๋งค๊ฐ๋ณ์ | @Param('id', ParseIntPipe) |
ParseUUIDPipe | UUID ํ์ ๊ฒ์ฆ | โ ID ํ์ ๋ณด์ฅ | @Param('uuid', ParseUUIDPipe) |
DefaultValuePipe | ๊ธฐ๋ณธ๊ฐ ์ค์ | โ ์ ํ์ ๋งค๊ฐ๋ณ์ | @Query('page', new DefaultValuePipe(1)) |
๐จ Exception Filters - ์์ธ ์ฒ๋ฆฌ
Exception Filters๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ํ๋ ์์ธ๋ฅผ ์ผ๊ด๋ ํํ๋ก ์ฒ๋ฆฌํ์ฌ ํด๋ผ์ด์ธํธ์๊ฒ ์ ์ ํ ์๋ต์ ์ ๊ณตํฉ๋๋ค. ๐จ ExceptionFilter ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ฉฐ, ์ ์ญ ๋๋ ํน์ ๋ฒ์์์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
NestJS๋ HTTP ์์ธ ํด๋์ค๋ค์ ๋ด์ฅํ๊ณ ์์ด, BadRequestException, UnauthorizedException, NotFoundException ๋ฑ์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค. โก ๋ํ ์ปค์คํ ์์ธ ํํฐ๋ฅผ ํตํด ๋น์ฆ๋์ค ๋ก์ง์ ๋ง๋ ์์ธ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
โก ๊ณ ๊ธ ๋ด์ฅ ๊ธฐ๋ฅ๋ค
NestJS๋ ์ํฐํ๋ผ์ด์ฆ๊ธ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ํ์ํ ๊ณ ๊ธ ๊ธฐ๋ฅ๋ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํฉ๋๋ค:
์นดํ ๊ณ ๋ฆฌ | ๊ธฐ๋ฅ | ์ค๋ช | ์ฃผ์ ๋ฐ์ฝ๋ ์ดํฐ |
---|---|---|---|
์ฑ๋ฅ ๊ด๋ จ | ์บ์ฑ | ๋ฉ๋ชจ๋ฆฌ/Redis ๊ธฐ๋ฐ ์บ์ฑ | @CacheKey(), @CacheTTL() |
๊ฐ๋ฐ ๊ฒฝํ | ์ค์ผ์ค๋ง | Cron ์์ ๋ฐ ๊ฐ๊ฒฉ ์์ | @Cron(), @Interval() |
ํต์ฌ ๊ธฐ๋ฅ | ์ค์ ๊ด๋ฆฌ | ํ๊ฒฝ๋ณ์ ๋ฐ ์ค์ ํ์ผ | @ConfigService() |
ํต์ฌ ๊ธฐ๋ฅ | ์ด๋ฒคํธ ์์คํ | ๋๋ฉ์ธ ์ด๋ฒคํธ ์ฒ๋ฆฌ | @OnEvent(), @EventPattern() |
์ฑ๋ฅ ๊ด๋ จ | ํฌ์ค ์ฒดํฌ | ์๋น์ค ์ํ ๋ชจ๋ํฐ๋ง | @HealthCheck() |
๊ธฐํ/์ฐธ๊ณ | ํ์ผ ์ ๋ก๋ | Multer ๊ธฐ๋ฐ ํ์ผ ์ฒ๋ฆฌ | @UseInterceptors(FileInterceptor()) |
๐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํตํฉ
NestJS๋ ๋ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํตํฉ์ ์ํ ๊ณต์ ํจํค์ง๋ค์ ์ ๊ณตํฉ๋๋ค. ๐๏ธ @nestjs/typeorm, @nestjs/mongoose, @nestjs/sequelize ๋ฑ์ ํตํด ์ํ๋ ORM/ODM์ ์ฝ๊ฒ ํตํฉํ ์ ์์ต๋๋ค.
ํนํ `@InjectRepository()` ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ํตํด ์์กด์ฑ ์ฃผ์ ๋ฐฉ์์ผ๋ก ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์ด ํ ์คํธ์ ๋ชจํน์ด ๋งค์ฐ ํธ๋ฆฌํฉ๋๋ค. โก ๋ํ ํธ๋์ญ์ ๊ด๋ฆฌ, ์ฐ๊ฒฐ ํ๋ง, ๋ง์ด๊ทธ๋ ์ด์ ๋ฑ ์ํฐํ๋ผ์ด์ฆ๊ธ ๊ธฐ๋ฅ๋ ๋ชจ๋ ์ง์๋ฉ๋๋ค.
๐งช ํ ์คํ ์ง์
NestJS๋ ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ(TDD)์ ์ผ๋์ ๋๊ณ ์ค๊ณ๋์์ต๋๋ค. ๐งช Test ๋ชจ๋์ ํตํด ์์กด์ฑ ์ฃผ์ ์ปจํ ์ด๋๋ฅผ ๋ชจํนํ๊ณ , ์ ๋ ํ ์คํธ์ ํตํฉ ํ ์คํธ๋ฅผ ์ฝ๊ฒ ์์ฑํ ์ ์์ต๋๋ค.
`Test.createTestingModule()`์ ์ฌ์ฉํ์ฌ ๊ฒฉ๋ฆฌ๋ ํ ์คํธ ํ๊ฒฝ์ ๊ตฌ์ฑํ ์ ์์ผ๋ฉฐ, Guards, Interceptors, Pipes ๋ฑ ๋ชจ๋ ๋ด์ฅ ๊ธฐ๋ฅ๋ค์ ํ ์คํธํ ์ ์๋ ์ ํธ๋ฆฌํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๐
๐ฏ ๊ฒฐ๋ก
NestJS์ ๋ด์ฅ ๊ธฐ๋ฅ๋ค์ ํ๋์ ์ธ ๋ฐฑ์๋ ๊ฐ๋ฐ์ ํ์ํ ๋ชจ๋ ์์๋ฅผ ํฌ๊ดํ๋ ์์ฑ๋ ๋์ ์ํ๊ณ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๐ Guards, Interceptors, Pipes, Filters๋ฅผ ํตํ ์์ฒญ ๋ผ์ดํ์ฌ์ดํด ๊ด๋ฆฌ๋ถํฐ ์บ์ฑ, ์ค์ผ์ค๋ง, ๋ฐ์ดํฐ๋ฒ ์ด์ค ํตํฉ๊น์ง ๋ชจ๋ ๊ฒ์ด ์ผ๊ด๋ ํจํด์ผ๋ก ์ค๊ณ๋์ด ์์ต๋๋ค.
ํนํ ๋ฐ์ฝ๋ ์ดํฐ ๊ธฐ๋ฐ์ ์ ์ธ์ ํ๋ก๊ทธ๋๋ฐ๊ณผ ์์กด์ฑ ์ฃผ์ ์์คํ ์ ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ํ ์คํธ ์ฉ์ด์ฑ์ ๊ทน๋ํํฉ๋๋ค. โก ์ด๋ฌํ ๋ด์ฅ ๊ธฐ๋ฅ๋ค์ ์ ์ ํ ์กฐํฉํ๋ฉด ๋ณ๋์ ๋ณต์กํ ์ค์ ์์ด๋ ์ํฐํ๋ผ์ด์ฆ๊ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น ๋ฅด๊ฒ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
๊ฒฐ๊ตญ NestJS์ ๋ด์ฅ ๊ธฐ๋ฅ๋ค์ ๋ง์คํฐํ๋ ๊ฒ์ ์์ฐ์ฑ ๋์ ๋ฐฑ์๋ ๊ฐ๋ฐ์ ํต์ฌ์ ๋๋ค. ๐ ๊ฐ ๊ธฐ๋ฅ์ ํน์ฑ๊ณผ ์ ์ ํ ์ฌ์ฉ ์์ ์ ์ดํดํ๊ณ ํ์ฉํ๋ค๋ฉด, ๋์ฑ ๊ฒฌ๊ณ ํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ ์๋น์ค๋ฅผ ๋ง๋ค ์ ์์ ๊ฒ์ ๋๋ค.
'made-by-AI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
nodeJS๊ธฐ๋ฐ ์น๊ฐ๋ฐ ํ๋ ์์ํฌ NestJS ๊ฐ๋จ ์์ฝ (0) | 2025.06.08 |
---|---|
Next.js 15: App Router์ Server Components ์์ ์ ๋ณต (1) | 2025.06.08 |
Cursor๊ฐ ์๊ฐ๋ฅผ ํ๋ Cursor (3) | 2025.06.08 |