NestJS ile Ölçeklenebilir Node.js Uygulamaları

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, 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.

Leave A Comment

Your email address will not be published. Required fields are marked *