~/zafer
Tüm yazılara dön
2 dk okuma

NestJS'te Özellik Modülleriyle Uygulamayı Parçalara Ayırmak

// apps/api/src/app.module.ts
@Module({
  imports: [
    ConfigModule.forRoot({ isGlobal: true, envFilePath: [...] }),
    PrismaModule,
    StorageModule,
    ProjectsModule,
    PostsModule,
    SettingsModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

Her kaynak (posts, projects, settings, storage) kendi klasöründe kendi controller/service/module üçlüsüne sahip. AppModule bunları tek tek import ediyor — kendisi iş mantığı içermiyor, sadece bir araya getiriyor.

Modül sınırı neden dosya klasörlemekten fazlası

NestJS'te bir modül sadece bir klasörleme kolaylığı değil — @Module({ controllers, providers, exports }) decoratorı, o özelliğin bağımlılık grafiğini (dependency graph) tanımlıyor. PostsModule, PostsService'i providers'a koyup export etmediği sürece, başka bir modül PostsService'i inject edemez. Bu sınır, "her şey her şeye erişebilir" durumunu engelliyor — ProjectsModule'ün PostsService'e ihtiyacı yoksa, onu asla göremiyor bile.

PrismaModule/StorageModule neden ayrı, posts/projects gibi bir "kaynak" değilken

Prisma ve MinIO storage, iş kaynağı değil altyapı — her feature modülünün ihtiyaç duyabileceği paylaşılan servisler. Ayrı modül olarak var olmaları, PostsModule ve ProjectsModule'ün ikisinin de PrismaService'i kendi providers'ında tekrar tanımlamak yerine, tek bir PrismaModule'den import edip aynı (tekil) PrismaService instance'ını paylaşmasını sağlıyor.

Yeni bir kaynak eklemek ne gerektiriyor

Yeni bir Comments kaynağı eklemek istersen: comments.controller.ts, comments.service.ts, comments.module.ts üçlüsünü oluşturup AppModule'ün imports listesine tek satır eklemek yeterli. Var olan hiçbir modülün içine dokunmadan sistem genişliyor — modüler sınırların asıl kazancı bu: değişikliğin etki alanı, dosya sayısıyla değil, modül sınırlarıyla ölçülüyor.