87 lines
2.9 KiB
TypeScript
87 lines
2.9 KiB
TypeScript
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 {}
|