NestJS ile Ölçeklenebilir ve Yapılandırılmış Node.js Uygulamaları Geliştirme
Günümüzde, hızlı ve ölçeklenebilir web uygulamaları geliştirmek, modern yazılım geliştirme süreçlerinin vazgeçilmez bir parçası haline gelmiştir. Node.js, JavaScript tabanlı bir çalışma ortamı olarak, sunucu tarafı geliştirmede popüler bir seçenek olmuştur. Ancak, büyük ve karmaşık uygulamaların yönetimi, yapılandırılması ve ölçeklendirilmesi, Node.js ile zorlu bir süreç olabilir. İşte tam bu noktada, NestJS devreye giriyor. NestJS, ölçeklenebilir, test edilebilir ve kolayca bakımı yapılabilir sunucu tarafı uygulamaları oluşturmak için tasarlanmış, ilerici bir Node.js framework’üdür.
İçindekiler
- NestJS Nedir?
- NestJS’in Avantajları
- NestJS Temel Kavramlar
- NestJS Proje Kurulumu
- NestJS Modüller
- NestJS Controller’lar
- NestJS Servisler
- Bağımlılık Enjeksiyonu (Dependency Injection)
- Middleware ve Guard’lar
- Veri Tabanı Entegrasyonu
- NestJS Uygulamalarını Test Etme
- NestJS ile Ölçeklenebilirlik
- Sonuç
NestJS Nedir?
NestJS, TypeScript üzerine inşa edilmiş, mimari desenleri ve en iyi uygulamaları benimseyen bir framework’tür. Angular’dan esinlenerek tasarlanmış olup, modüler bir yapı, bağımlılık enjeksiyonu (Dependency Injection) ve yönlendirme (Routing) gibi kavramları içerir. Bu sayede, geliştiricilerin daha organize, sürdürülebilir ve test edilebilir uygulamalar oluşturmasına olanak tanır. NestJS, Express veya Fastify gibi altta yatan HTTP sunucularını kullanabilir, bu da esneklik ve performans açısından avantaj sağlar.
NestJS’in Avantajları
- Yapılandırılmış Geliştirme: NestJS, katı bir mimari sunarak, uygulamanın genel yapısını ve organizasyonunu kolaylaştırır. Bu, ekip çalışmasını ve yeni geliştiricilerin projeye entegre olmasını kolaylaştırır.
- TypeScript Desteği: TypeScript kullanarak, kodun okunabilirliğini, bakımını ve güvenilirliğini artırır. TypeScript, hataları erken yakalamanıza ve daha güvenli kod yazmanıza yardımcı olur.
- Bağımlılık Enjeksiyonu (Dependency Injection): Bağımlılıkları yönetmeyi ve test etmeyi kolaylaştırır. Kodun daha modüler ve esnek olmasını sağlar.
- Modüler Mimari: Uygulamayı modüllere ayırarak, karmaşıklığı azaltır ve yeniden kullanılabilirliği artırır.
- Test Edilebilirlik: NestJS, test edilebilirliği ön planda tutar. Bağımlılık enjeksiyonu ve modüler yapı sayesinde, birim testleri ve entegrasyon testleri yazmak kolaylaşır.
- Ölçeklenebilirlik: NestJS, mikroservis mimarileri için uygun bir çözümdür. Modüler yapısı ve bağımlılık enjeksiyonu sayesinde, uygulamayı kolayca ölçeklendirebilirsiniz.
- Genişletilebilirlik: NestJS, birçok üçüncü taraf kütüphane ve araçla entegre olabilir. Ayrıca, kendi özel modüllerinizi ve middleware’lerinizi oluşturabilirsiniz.
NestJS Temel Kavramlar
NestJS’in temel kavramlarını anlamak, etkili bir şekilde uygulama geliştirmek için önemlidir. Bu kavramlar şunlardır:
- Modüller (Modules): Uygulamanın yapı taşlarıdır. Her modül, ilgili controller’ları, servisleri ve diğer modülleri içerir.
- Controller’lar (Controllers): Gelen istekleri işleyen ve istemciye yanıt veren sınıflardır.
- Servisler (Services): Uygulama mantığını içeren sınıflardır. Veri erişimi, iş kuralları ve diğer karmaşık işlemler servislerde gerçekleştirilir.
- Sağlayıcılar (Providers): Servisler, repository’ler ve diğer yardımcı sınıflardır. Bağımlılık enjeksiyonu aracılığıyla kullanılırlar.
- Middleware’ler (Middleware): Gelen istekleri işleyen ve controller’lara ulaşmadan önce belirli işlemleri gerçekleştiren fonksiyonlardır.
- Guard’lar (Guards): Yetkilendirme ve kimlik doğrulama işlemlerini gerçekleştiren sınıflardır. Controller’lara erişimi kontrol ederler.
- Interceptor’lar (Interceptors): İstekleri ve yanıtları işleyen sınıflardır. Loglama, dönüştürme ve önbelleğe alma gibi işlemleri gerçekleştirebilirler.
- Pipe’lar (Pipes): Gelen veriyi dönüştüren ve doğrulayan sınıflardır.
NestJS Proje Kurulumu
NestJS projesi kurmak için öncelikle Node.js ve npm’in sisteminizde yüklü olduğundan emin olun. Daha sonra, NestJS CLI’yı kullanarak yeni bir proje oluşturabilirsiniz:
npm install -g @nestjs/cli
nest new proje-adi
Bu komut, proje dizinini oluşturacak ve gerekli bağımlılıkları yükleyecektir. Proje dizinine geçtikten sonra, uygulamayı başlatmak için aşağıdaki komutu kullanabilirsiniz:
cd proje-adi
npm run start:dev
Bu komut, uygulamayı geliştirme modunda başlatacak ve dosyalarda yapılan değişiklikleri otomatik olarak algılayarak yeniden başlatacaktır.
NestJS Modüller
NestJS modülleri, uygulamanın farklı bölümlerini organize etmek için kullanılır. Her modül, ilgili controller’ları, servisleri ve diğer modülleri içerir. Modüller, @Module()
dekoratörü ile tanımlanır:
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
imports
dizisi, bu modülün bağımlı olduğu diğer modülleri içerir. controllers
dizisi, bu modülün controller’larını içerir. providers
dizisi, bu modülün servislerini ve diğer sağlayıcılarını içerir.
NestJS Controller’lar
NestJS controller’ları, gelen istekleri işleyen ve istemciye yanıt veren sınıflardır. Controller’lar, @Controller()
dekoratörü ile tanımlanır:
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
}
@Get()
, @Post()
, @Put()
, @Delete()
gibi dekoratörler, farklı HTTP metotlarını işleyen metotları tanımlamak için kullanılır. Controller’lar, servisleri bağımlılık enjeksiyonu aracılığıyla kullanır.
NestJS Servisler
NestJS servisleri, uygulama mantığını içeren sınıflardır. Servisler, @Injectable()
dekoratörü ile tanımlanır:
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
Servisler, veri erişimi, iş kuralları ve diğer karmaşık işlemleri gerçekleştirebilir. Controller’lar, servisleri bağımlılık enjeksiyonu aracılığıyla kullanır.
Bağımlılık Enjeksiyonu (Dependency Injection)
Bağımlılık enjeksiyonu, NestJS’in temel özelliklerinden biridir. Bağımlılıkları yönetmeyi ve test etmeyi kolaylaştırır. Bir sınıfın bağımlılıkları, constructor aracılığıyla enjekte edilir:
import { Injectable } from '@nestjs/common';
import { AppService } from './app.service';
@Injectable()
export class UserController {
constructor(private readonly appService: AppService) {}
// ...
}
Bu örnekte, UserController
sınıfı, AppService
sınıfına bağımlıdır. NestJS, AppService
örneğini otomatik olarak oluşturacak ve UserController
‘ın constructor’ına enjekte edecektir.
Middleware ve Guard’lar
Middleware’ler, gelen istekleri işleyen ve controller’lara ulaşmadan önce belirli işlemleri gerçekleştiren fonksiyonlardır. Guard’lar, yetkilendirme ve kimlik doğrulama işlemlerini gerçekleştiren sınıflardır. Controller’lara erişimi kontrol ederler.
Middleware’ler, @Injectable()
dekoratörü ile tanımlanır ve NestMiddleware
arayüzünü uygular:
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: NextFunction) {
console.log('Request...');
next();
}
}
Guard’lar, @Injectable()
dekoratörü ile tanımlanır ve CanActivate
arayüzünü uygular:
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Observable } from 'rxjs';
@Injectable()
export class AuthGuard implements CanActivate {
canActivate(
context: ExecutionContext,
): boolean | Promise | Observable {
// Yetkilendirme mantığı
return true;
}
}
Veri Tabanı Entegrasyonu
NestJS, çeşitli veri tabanları ile entegre olabilir. En yaygın kullanılan veri tabanı entegrasyonlarından biri, TypeORM’dir. TypeORM, TypeScript için bir ORM (Object-Relational Mapping) kütüphanesidir ve veri tabanı işlemlerini kolaylaştırır.
TypeORM’yi NestJS projesine entegre etmek için öncelikle gerekli paketleri yükleyin:
npm install --save @nestjs/typeorm typeorm mysql2
Daha sonra, AppModule
‘e TypeOrmModule
‘ü ekleyin ve veri tabanı bağlantı bilgilerini yapılandırın:
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
imports: [TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'password',
database: 'mydb',
entities: [__dirname + '/**/*.entity{.ts,.js}'],
synchronize: true,
})],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
Bu yapılandırma, MySQL veri tabanına bağlanacaktır. entities
dizisi, veri tabanı tablolarını temsil eden varlıkları içerir. synchronize
seçeneği, veri tabanı şemasını otomatik olarak oluşturur (yalnızca geliştirme ortamında kullanılmalıdır).
NestJS Uygulamalarını Test Etme
NestJS, test edilebilirliği ön planda tutar. Bağımlılık enjeksiyonu ve modüler yapı sayesinde, birim testleri ve entegrasyon testleri yazmak kolaylaşır. NestJS, Jest ve Supertest gibi popüler test araçlarını destekler.
Birim testleri, tek bir sınıfın veya fonksiyonun davranışını test eder. Entegrasyon testleri, uygulamanın farklı bölümlerinin birlikte nasıl çalıştığını test eder.
NestJS CLI, test dosyalarını otomatik olarak oluşturur. Test dosyaları, .spec.ts
uzantısıyla kaydedilir.
NestJS ile Ölçeklenebilirlik
NestJS, mikroservis mimarileri için uygun bir çözümdür. Modüler yapısı ve bağımlılık enjeksiyonu sayesinde, uygulamayı kolayca ölçeklendirebilirsiniz. Mikroservisler, uygulamanın farklı işlevlerini ayrı ayrı dağıtılabilir ve ölçeklendirilebilir hizmetlere böler.
NestJS, RabbitMQ, Kafka ve gRPC gibi çeşitli mesajlaşma sistemlerini destekler. Bu sistemler, mikroservisler arasındaki iletişimi sağlar.
Ayrıca, NestJS, Docker ve Kubernetes gibi konteynerleştirme ve orkestrasyon araçlarıyla da uyumludur. Bu araçlar, mikroservislerin dağıtımını ve yönetimini kolaylaştırır.
Sonuç
NestJS, ölçeklenebilir, test edilebilir ve kolayca bakımı yapılabilir Node.js uygulamaları geliştirmek için güçlü bir framework’tür. TypeScript desteği, bağımlılık enjeksiyonu, modüler mimari ve diğer özellikler sayesinde, geliştiricilerin daha organize ve sürdürülebilir uygulamalar oluşturmasına olanak tanır. NestJS, modern yazılım geliştirme süreçlerinde önemli bir rol oynamaktadır ve gelecekte de popülerliğini koruyacaktır.