
Genişletilebilir ve Bakımı Kolay API’ler için İleri Seviye NestJS Uygulamaları
Genişletilebilir ve Bakımı Kolay API’ler için İleri Seviye NestJS Uygulamaları
NestJS becerilerini bir üst seviyeye taşımak mı istiyorsun? Bu kapsamlı rehber, projelerini ölçeklenebilir, modüler ve bakımı kolay hale getirmek için kullanabileceğin gelişmiş (ama başlangıç dostu) NestJS pratiklerini adım adım açıklıyor.
🚀 Genişletilebilir ve Bakımı Kolay API’ler için İleri Seviye NestJS Uygulamaları
Ancak birçok geliştirici sadece temel özelliklerle yetinir. Bu yazıda, NestJS ile sağlam, bakımı kolay ve gerçek anlamda ölçeklenebilir API’ler inşa etmek için kullanabileceğin ileri seviye ama kolay anlaşılır uygulamaları anlatacağım.
🧱 1. Modüler Mimarinin Gerçek Gücünü Kullan
📌 Modül (Module) nedir?
NestJS'te modüller, uygulamanın farklı özelliklerini organize etmeye yarar. Her modül belirli bir işlevi içerir: örneğin auth
, users
, payments
.
👎 Yeni Başlayanların Hatası:
Tüm mantığı AppModule
içinde tutmak veya çok az sayıda büyük modül kullanmak.
✅ Doğru Yaklaşım: Özellik Bazlı Yapı
src/ ├── auth/ │ ├── auth.controller.ts │ ├── auth.service.ts │ └── auth.module.ts ├── users/ │ ├── users.controller.ts │ ├── users.service.ts │ └── users.module.ts
Avantajları:
- Her özelliği izole etmek kolay
- Kodun okunabilirliği artar
- Takım çalışmasında modüller ayrılabilir
- Gerekirse lazy-loading kullanılabilir
🧠 2. Bağımlılık Enjeksiyonunu (DI) Etkili Kullan
📌 DI Nedir?
NestJS, ihtiyaç duyduğun servisleri senin yerine enjekte eder. Örneğin:
constructor(private userService: UserService) {}
Sen sadece UserService
yazarsın, NestJS onu senin için hazırlar.
✅ Tavsiyeler:
- Ortak servisleri (örn. Logger) tekrar tekrar oluşturma
- Test için servisleri mock’lamak kolaylaşır
- Sık kullanılan kodu özel servislerde toparla
Örnek:
@Injectable() export class AppLogger { log(message: string) { console.log(`[APP] ${message}`); } }
🛡️ 3. Guard, Interceptor ve Pipe'ları Bilinçli Kullan
🛡️ Örnek: Guard ile Yetki Kontrolü
@Injectable() export class AuthGuard implements CanActivate { canActivate(context: ExecutionContext): boolean { const req = context.switchToHttp().getRequest(); return !!req.user; } }
🔄 Örnek: DTO Doğrulama ile Pipe
@UsePipes(new ValidationPipe()) @Post() createUser(@Body() dto: CreateUserDto) { // dto zaten doğrulanmış ve dönüştürülmüş olur }
🛠️ 4. Özel Dekoratörler (Custom Decorators)
📌 Nedir?
Decorator’lar, sınıflara veya parametrelere ekstra işlevler kazandırır. NestJS'te birçok hazır decorator vardır: @Body()
, @Param()
, @Query()
, vs.
✅ Özel Kullanım: @CurrentUser()
export const CurrentUser = createParamDecorator( (_, ctx: ExecutionContext) => { const req = ctx.switchToHttp().getRequest(); return req.user; }, );
Sonra böyle kullan:
@Get() getProfile(@CurrentUser() user) { return user; }
Temiz ve okunabilir kod = daha kolay bakım ve geliştirme.
🌐 5. Ortam Değişkenleri (Environment Variables) Doğrulama
📌 Neden Önemli?
Üretim ortamında yanlış yapılandırılmış bir .env
uygulamanın çökmesine sebep olabilir.
✅ Joi ile doğrulama örneği:
ConfigModule.forRoot({ isGlobal: true, validationSchema: Joi.object({ DATABASE_URL: Joi.string().required(), PORT: Joi.number().default(3000), }), });
Bu sayede:
- Uygulama yanlış konfigürasyonla başlamaz
- Tüm ortam değişkenleri önceden kontrol edilir
📄 6. Küresel Hata Yakalama (Exception Filters)
📌 Neden Gerekli?
Hatalar varsayılan olarak kontrolsüz ve kullanıcı dostu olmayan bir formatta dönebilir.
✅ Örnek:
@Catch(HttpException) export class GlobalHttpExceptionFilter implements ExceptionFilter { catch(exception: HttpException, host: ArgumentsHost) { const ctx = host.switchToHttp(); const response = ctx.getResponse(); const status = exception.getStatus(); const message = exception.getResponse(); response.status(status).json({ statusCode: status, message, timestamp: new Date().toISOString(), }); } }
Tüm uygulama genelinde tutarlı hata formatı sağlar.
🔢 7. API Sürümleme (Versioning)
Yeni özellikler eklerken eski istemcileri bozmamak için API versiyonlama kullan:
app.enableVersioning({ type: VersioningType.URI, }); ts Copy Edit @Controller({ path: 'users', version: '1' }) export class UsersV1Controller {} @Controller({ path: 'users', version: '2' }) export class UsersV2Controller {}
🧪 8. Anlamlı Testler Yaz
Test yazmak:
- Güvenli refactor yapmanı sağlar
- Kodun güvenilirliğini artırır
- Yeni geliştiriciler için onboarding sürecini kolaylaştırır
✅ Örnek: Unit Test
describe('UsersService', () => { let service: UsersService; beforeEach(async () => { const module = await Test.createTestingModule({ providers: [UsersService], }).compile(); service = module.get(UsersService); }); it('should find a user', async () => { expect(await service.findOne(1)).toBeDefined(); }); });
⏱️ 9. Cache, Queue ve Arka Plan İşlemleri
Zaman alan görevleri (ör. e-posta gönderimi, PDF oluşturma) senkron şekilde yapmak performansı düşürür.
✅ Ne Yapabilirsin?
- Redis ile cache işlemleri (
@nestjs/cache-manager
) - BullMQ ile arka plan görevleri (
@nestjs/bull
) - Event’lerle esnek iş akışı (
@nestjs/event-emitter
)
🎯 10. Geliştirici Deneyimini Artır
Kod kalitesini korumak için:
eslint
veprettier
ile otomatik formatlamahusky
ile commit öncesi test çalıştırma@nestjs/swagger
ile otomatik API dökümantasyonu
✅ Sonuç
NestJS, yüzeyde basit ama altında kurumsal düzeyde güçlü bir mimariye sahiptir. Bu yazıda öğrendiğin gelişmiş (ama sade) uygulamalar sayesinde:
- Daha okunabilir
- Daha test edilebilir
- Daha bakımı kolay
- Ve daha profesyonel API’ler geliştirebilirsin.
Unutma: Küçük adımlarla başla, sürekli geliştir. NestJS bu yolculukta sana büyük kolaylık sağlayacak.
🔗 Faydalı Kaynaklar
- NestJS Resmi Belgeleri
- Awesome NestJS GitHub
- Stoplight API Tasarım Kılavuzu