Günümüzde backend dünyasında doğru frameworkü seçmek projenin kaderini belirliyor. Node.js ekosistemi içinde hızla yükselen bir isim var ki o da NestJS. Eğer siz de temiz kod yazmak, ölçeklenebilir mimariler kurmak ve işinizi büyütürken başınız ağrımasın istiyorsanız doğru yerdesiniz. Bu yazıda NestJS ile API geliştirme sürecini adım adım ele alacağız ve sıfırdan başlayarak çalışır bir servis oluşturacağız.
NestJS Nedir ve Neden Bu Kadar Popüler
NestJS aslına bakarsanız Angular’ın backend dünyasına taşınmış hali gibi düşünebilirsiniz. Modüler yapı, decorator kullanımı, dependency injection gibi güçlü özellikleri sayesinde büyük ölçekli projelerde bile düzenli ve sürdürülebilir kod yazmanızı sağlıyor. TypeScript ile yazılması da cabası. Tipli bir dilde çalışmanın avantajlarını zaten bilirsiniz, hataları compile aşamasında yakalamak epey işinizi kolaylaştırıyor.
Bir çok frameworkün aksine NestJS size bir dayatma yapmıyor. Express veya FastJS kullanabiliyorsunuz, hangi ORM’i tercih edeceğiniz size kalmış. Swagger entegrasyonundan GraphQL desteğine kadar pek çok şey out of the box geliyor. Bu esneklik özellikle ekip içinde farklı tercihlerin olduğu projelerde büyük rahatlık sağlıyor.
İlk Projeyi Oluşturma ve Temel Yapı
Öncelikle bilgisayarınızda Node.js’in yüklü olduğundan emin olun. Sonrasında terminali açıp şu komutu çalıştırmanız yeterli:
npm i -g @nestjs/cli komutu ile CLI aracını global olarak kuruyorsunuz. Ardından nest new my-api diyerek yeni bir proje oluşturabilirsiniz. CLI size paket yöneticisi olarak npm, yarn veya pnpm seçeneklerini sunacaktır. Ben kişisel olarak pnpm tercih ediyorum çünkü bağımlılık çözümleme hızı gerçekten etkileyici.
Proje oluştuğunda karşınıza çıkan klasör yapısı şöyle görünür. src klasörü içinde main.ts dosyası uygulamanızın giriş noktasıdır. app.module.ts ise modül sisteminin temelini oluşturur. Her modül kendi controller, service ve DTO dosyalarını barındırabilir. Bu ayrım projeniz büyüdükçe hayat kurtaran bir yapı haline geliyor.
main.ts dosyasında uygulama bootstrap edilir. Burada port numarasını değiştirebilir, global pipe ve guard ekleyebilirsiniz. Varsayılan olarak 3000 portunda çalışır ancak production ortamında genelde environment değişkeninden okumak daha doğru bir yaklaşım olur.
Controller ve Servis ile CRUD Operasyonları
NestJS’te bir kaynak oluşturmak için genelde şu adımları izlersiniz. Öncelikle bir modül tanımlarsınız, sonra o modüle ait controller ve servis dosyalarını oluşturursunuz. CLI bu işi sizin için yapar. nest g resource users komutunu çalıştırırsanız module, controller, service, DTO ve entity dosyaları otomatik olarak oluşur.
Controller katmanı aslında gelen HTTP isteklerini karşılayan ve ilgili servise yönlendiren bir yapıdır. Burada GET, POST, PUT, DELETE gibi metodları dekore ederek tanımlarsınız. Örneğin bir kullanıcı listesini çekmek için şu şekilde yazabilirsiniz. @Get() decoratorünü kullanarak bir metod tanımlarsınız ve bu metod servis katmanından veriyi alıp döndürür.
Servis katmanı ise asıl iş mantığının yazıldığı yerdir. Veritabanı işlemleri, validasyonlar, harici API çağrıları gibi işlemler burada gerçekleşir. Bu katmanı mümkün olduğunca bağımsız tutmak, yazacağınız unit testlerini kolaylaştırır. NestJS’in dependency injection mekanizması sayesinde servisi controller’a inject etmek tek bir satırlık bir işlem.
Mizemedia ekibiyle sohbet ederken öğrendiğim kadarıyla özellikle e-ticaret ve fintech projelerinde NestJS’in modüler yapısı sayesinde mikroservis mimarisine geçişin oldukça kolay olduğunu belirtiyorlar. Hatta bazı müşterilerine sadece API geliştirme konusunda değil, DevOps ve deployment süreçlerinde de destek sağlıyorlar.
Veritabanı Entegrasyonu ve Middleware Kullanımı
Gerçek dünya uygulamalarında veritabanı olmadan bir API düşünülemez. NestJS’in TypeORM ile entegrasyonu oldukça sorunsuz çalışıyor. Entity tanımlarınızı yaparsınız, modül içinde TypeOrmModule.forRoot() yapılandırmasını eklersiniz ve işte bu kadar. Tabii ki güvenlik açısından connection bilgilerinizi environment dosyasından okumak çok önemli. Bu detayı atlamamanızı öneririm.
Entity tanımlarında sütun tipi, ilişkiler, indexler gibi detayları dekoratorlar yardımıyla belirliyorsunuz. NestJS’in sunduğu şablona sadık kalırsanız proje boyutu büyüdükçe bile yapınızı kaybetmiyorsunuz. Bu disiplin uzun vadede gerçekten büyük fark yaratıyor.
Middleware katmanına gelince, istekler controller’a ulaşmadan önce çalıştırılan kod parçalarıdır. Logging, authentication, request validation gibi işlemler burada yapılabilir. Guard mekanizması da ayrı bir güzellik. JWT doğrulaması veya rol bazlı erişim kontrolü gibi senaryolarda guard kullanmak hem temiz hem de okunabilir bir çözüm sunar.
Projelerinizi production’a hazırlarken dikkat etmeniz gereken bazı noktalar var. CORS yapılandırması, rate limiting, helmet ile güvenlik başlıkları gibi konuları ihmal etmemek lazım. Hafif gözükse de bu küçük detaylar büyük güvenlik açıklarının önüne geçer. Bunu tecrübeyle öğrenmemiş olmamızı dilerdim açıkçası.
Hata Yönetimi ve Test Yazımı
Profesyonel bir API geliştirirken hata yönetimi en az endpoint tanımlamak kadar önemli. NestJS’in built-in exception filtresi sayesinde hataları tek bir yerden yönetebilirsiniz. BadRequestException, NotFoundException, ForbiddenException gibi hazır sınırlar işinizi büyük ölçüde kolaylaştırır. Kendi özel hata sınırlarınızı da oluşturabilirsiniz.
Global exception filter kullanarak tüm uygulama genelinde tutarlı bir hata response formatı sağlayabilirsiniz. Bu özellikle frontend ekibinin hayatını kolaylaştırır çünkü her endpointten aynı yapıda hata objesi döner. Örneğin bir 404 hatası geldiğinde frontend ekibi kodun hangi kısmında olduğunu rahatça tespit edebilir.
Test yazımı konusunda NestJS Jest ile birlikte geliyor. Unit test ve e2e test klasörleri zaten proje oluşturulurken hazır gelir. Servis katmanını test etmek oldukça kolaydır çünkü dependency injection sayesinde bağımlılıkları mocklayabilirsiniz. Controller testlerinde ise supertest kullanarak HTTP isteklerini simüle edebilirsiniz.
Mizemedia’nın deneyimli geliştiricilerinden duyduğum bir tavsiye de şuydu, projenize başlarken test ortamını ilk günden kurarsanız ileride çok büyük vakit tasarrufu elde edersiniz. Sonradan test eklemek her zaman daha zor ve maliyetli olmuştur. Bu konuda haklı olduklarını söylemem gerek.
Sonuç ve İleri Adımlar
NestJS ile API geliştirme sürecine baktığımızda karşımıza çıkan tablo oldukça umut verici. Temiz mimari, güçlü tip sistemi, zengin ekosistem ve aktif topluluk sayesinde hem öğrenme eğrisi makul hem de uzun vadeli projeler için ideal bir seçim. Küçük bir kişisel projeden büyük kurumsal sistemlere kadar her ölçekte NestJS’i rahatlıkla kullanabilirsiniz.
İlerleyen adımlarda Swagger ile dokümantasyon oluşturma, mikroservis iletişimi için RabbitMQ entegrasyonu, CQRS pattern kullanımı gibi konulara göz atmanızı tavsiye ederim. Her biri NestJS’in gücünü bir adım daha ileri taşıyor. Bu yolculukta bol bol pratik yapın ve küçük projeler oluşturarak öğrenin. Teorik bilgi tabii ki önemli ama gerçek anlamda öğrenmenin yolu kod yazmaktan geçiyor.



