import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { ConfigModule } from '@nestjs/config'; import { ScheduleModule } from '@nestjs/schedule'; import { ThrottlerGuard, ThrottlerModule } from '@nestjs/throttler'; import { CacheModule } from '@nestjs/cache-manager'; import { APP_GUARD } from '@nestjs/core'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { HealthModule } from './modules/health/health.module'; import { UserModule } from './modules/user/user.module'; import { EventsModule } from './modules/events/events.module'; import { NewsModule } from './modules/news/news.module'; import { RankingModule } from './modules/ranking/ranking.module'; import { SaUserModule } from './modules/sa-user/sa-user.module'; import { SaMetaModule } from './modules/sa-meta/sa-meta.module'; import { SaMatchModule } from './modules/sa-match/sa-match.module'; import { NexonModule } from './shared/nexon/nexon.module'; @Module({ imports: [ ScheduleModule.forRoot(), ConfigModule.forRoot({ isGlobal: true, envFilePath: `.env.${process.env.NODE_ENV || 'development'}`, }), // 전역 캐시 매니저 — Redis 도입 시 store 옵션을 redisStore 로 변경 CacheModule.register({ isGlobal: true, ttl: 60_000, // 60초 기본 TTL }), // 전역 Rate Limiter — main.ts 의 express-rate-limit 와 별개로 라우트 단위 제어 가능 ThrottlerModule.forRoot([ { ttl: 60_000, limit: 100, }, ]), TypeOrmModule.forRootAsync({ useFactory: () => { const isProduction = process.env.NODE_ENV === 'production'; return { type: 'postgres', host: process.env.DB_HOST || 'db', port: parseInt(process.env.DB_PORT || '5432', 10), username: process.env.DB_USER || process.env.DB_USERNAME || 'postgres', password: process.env.DB_PASSWORD || 'password', database: process.env.DB_NAME || process.env.DB_DATABASE || 'project_db', autoLoadEntities: true, // 운영 환경에서는 절대 synchronize 사용 금지 (스키마 자동 변경 → 데이터 손실 위험) synchronize: !isProduction, migrationsRun: isProduction, logging: !isProduction, extra: { max: 100, connectionTimeoutMillis: 5000, idleTimeoutMillis: 30000, }, entities: [__dirname + '/**/*.entity{.ts,.js}'], migrations: [__dirname + '/migrations/*{.ts,.js}'], }; }, }), HealthModule, UserModule, NexonModule, EventsModule, NewsModule, RankingModule, SaUserModule, SaMetaModule, SaMatchModule, ], controllers: [AppController], providers: [ AppService, { provide: APP_GUARD, useClass: ThrottlerGuard, }, ], }) export class AppModule {}