Yükleniyor...

Node.js Rehberi: Modern Backend Geliştirme ve Mimari Tasarım

Yazar: Burak Balkı | Kategori: Backend Development | Okuma Süresi: 9 dk

Node.js ekosistemini, mimarisini ve modern backend geliştirme tekniklerini içeren kapsamlı teknik rehber. Event Loop'tan clustering stratejilerine kadar prof...

## Node.js Nedir? Temel Mimari ve Çalışma Mantığı **Node.js**, Chrome'un V8 JavaScript motoru üzerine inşa edilmiş, asenkron ve olay tabanlı (event-driven) bir JavaScript çalışma ortamıdır (runtime). Geleneksel sunucu tarafı teknolojilerinin aksine, Node.js **non-blocking I/O** modelini kullanarak tek bir iş parçacığı (single-thread) üzerinde binlerce eşzamanlı bağlantıyı yönetebilir. Bu özellik, onu gerçek zamanlı uygulamalar ve mikro hizmet mimarileri için ideal kılar. Node.js'in kalbinde **Libuv** kütüphanesi ve **Event Loop** mekanizması yer alır. Bu yapı, girdi/çıktı işlemlerinin tamamlanmasını beklemeden diğer işlemlerin devam etmesine olanak tanır. Aşağıdaki tablo, Node.js ile geleneksel çok iş parçacıklı (multi-threaded) modeller arasındaki farkı özetlemektedir: | Özellik | Node.js (Single-Threaded) | Geleneksel (Multi-Threaded) | | :--- | :--- | :--- | | I/O Modeli | Non-blocking (Asenkron) | Blocking (Senkron) | | Kaynak Kullanımı | Düşük (Verimli) | Yüksek (Her istek için yeni thread) | | Ölçeklenebilirlik | Yatay ve Dikey Kolay | Karmaşık ve Maliyetli | | Uygunluk | I/O Yoğunluklu Uygulamalar | CPU Yoğunluklu Uygulamalar | ## Node.js Kurulumu ve Geliştirme Ortamının Hazırlanması Node.js geliştirmeye başlamak için resmi web sitesinden LTS (Long Term Support) sürümünü indirmeniz önerilir. Kurulum tamamlandıktan sonra terminal üzerinden versiyon kontrolü yapabilirsiniz. ```bash node -v npm -v ``` Proje başlatmak için `npm init` komutu kullanılır. Bu komut, projenin bağımlılıklarını ve meta verilerini içeren `package.json` dosyasını oluşturur. ## Node.js Modül Sistemi: CommonJS ve ES Modules Node.js başlangıçta **CommonJS** (require/module.exports) yapısını kullanırken, modern sürümlerde **ES Modules** (import/export) desteği tam hale gelmiştir. ### CommonJS Örneği: ```javascript // math.js const add = (a, b) => a + b; module.exports = { add }; // app.js const { add } = require('./math'); console.log(add(5, 10)); ``` ### ES Modules Örneği: ```javascript // math.mjs export const multiply = (a, b) => a * b; // app.mjs import { multiply } from './math.mjs'; console.log(multiply(4, 5)); ``` ## Asenkron Programlama: Callback, Promises ve Async/Await Node.js ekosisteminde asenkron yapı yönetimi hayati önem taşır. Modern geliştirmede `async/await` yapısı, kodun okunabilirliğini artırır ve hata yönetimini kolaylaştırır. ```javascript const fs = require('fs').promises; async function readFileContent() { try { const data = await fs.readFile('config.json', 'utf8'); const config = JSON.parse(data); console.log('Sunucu Portu:', config.port); } catch (err) { console.error('Dosya okuma hatası:', err); } } readFileContent(); ``` ## Express.js ile REST API Geliştirme ve Middleware Yapısı **Express.js**, Node.js için en popüler web çatısıdır. Middleware (ara yazılım) mimarisi sayesinde istek ve yanıt döngüsü üzerinde tam kontrol sağlar. ```javascript const express = require('express'); const app = express(); // JSON gövde analizi için middleware app.use(express.json()); // Logging middleware app.use((req, res, next) => { console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`); next(); }); app.get('/api/users', (req, res) => { res.json([{ id: 1, name: 'Ahmet' }, { id: 2, name: 'Ayşe' }]); }); app.listen(3000, () => console.log('Sunucu 3000 portunda aktif.')); ``` ## Dosya Sistemi (fs) ve Stream Yönetimi Büyük veri setlerini işlerken tüm veriyi belleğe yüklemek yerine **Streams** kullanmak bellek verimliliği sağlar. Node.js'te `fs` modülü hem senkron hem asenkron yöntemler sunar. ```javascript const fs = require('fs'); // Stream ile büyük dosya okuma ve yazma const readableStream = fs.createReadStream('large_log.txt'); const writableStream = fs.createWriteStream('backup_log.txt'); readableStream.pipe(writableStream); readableStream.on('end', () => { console.log('Dosya kopyalama işlemi başarıyla tamamlandı.'); }); ``` ## Node.js Olay Döngüsü (Event Loop) Derinlemesine İnceleme Event Loop, Node.js'in tek bir iş parçacığı üzerinde çalışmasına rağmen nasıl I/O işlemlerini bloklamadığını açıklar. Altı ana aşamadan oluşur: 1. **Timers**: `setTimeout` ve `setInterval` geri çağırmaları. 2. **Pending Callbacks**: Ertelenmiş I/O geri çağırmaları. 3. **Idle, Prepare**: Dahili kullanım. 4. **Poll**: Yeni I/O olaylarının alınması. 5. **Check**: `setImmediate` geri çağırmaları. 6. **Close Callbacks**: Kapatma olayları (örn: `socket.on('close', ...)`). > **Önemli Not:** Event Loop'u bloklayan uzun süreli senkron işlemler (örn: çok büyük bir döngü veya karmaşık matematiksel hesaplama) tüm sunucunun yanıt vermesini durdurur. ## Veritabanı Entegrasyonu: MongoDB ve PostgreSQL Node.js, hem NoSQL hem de SQL veritabanlarıyla mükemmel uyum sağlar. Mongoose (MongoDB için) ve Sequelize veya Prisma (SQL için) en çok tercih edilen araçlardır. ```javascript // Mongoose ile basit bir model tanımı ve bağlantı const mongoose = require('mongoose'); async function connectDB() { await mongoose.connect('mongodb://localhost:27017/my_app'); const User = mongoose.model('User', { name: String, email: String }); const newUser = new User({ name: 'Can', email: 'can@example.com' }); await newUser.save(); console.log('Kullanıcı kaydedildi.'); } ``` ## Güvenlik ve Kimlik Doğrulama: JWT Kullanımı Modern web uygulamalarında Stateless (durumsuz) kimlik doğrulama için **JSON Web Token (JWT)** standarttır. ```javascript const jwt = require('jsonwebtoken'); const generateToken = (userId) => { return jwt.sign({ id: userId }, 'gizli_anahtar_123', { expiresIn: '1h' }); }; const verifyToken = (token) => { try { return jwt.verify(token, 'gizli_anahtar_123'); } catch (err) { return null; } }; ``` ## Node.js Performans Optimizasyonu ve Clustering Node.js tek bir çekirdek üzerinde çalışır. Çok çekirdekli işlemcilerden tam verim almak için `cluster` modülü kullanılarak uygulama instance'ları çoğaltılabilir. ```javascript const cluster = require('cluster'); const http = require('http'); const numCPUs = require('os').cpus().length; if (cluster.isMaster) { for (let i = 0; i < numCPUs; i++) { cluster.fork(); } } else { http.createServer((req, res) => { res.writeHead(200); res.end('Worker ' + process.pid + ' yanıt veriyor.'); }).listen(8000); } ``` ## Hata Yönetimi ve Logging Stratejileri Uygulama hatalarını yakalamak için global hata yakalayıcılar ve **Winston** veya **Pino** gibi profesyonel logging kütüphaneleri kullanılmalıdır. ```javascript process.on('uncaughtException', (err) => { console.error('Beklenmedik Hata:', err); // Uygulamayı güvenli şekilde kapat veya yeniden başlat process.exit(1); }); ``` ## Node.js Best Practices ve Modern Geliştirme Standartları 1. **Environment Variables Kullanın:** Hassas bilgileri `.env` dosyalarında tutun. 2. **Linter ve Formatter:** ESLint ve Prettier kullanarak kod standartlarını koruyun. 3. **Dependency Management:** `npm audit` ile güvenlik açıklarını düzenli kontrol edin. 4. **Testing:** Jest veya Mocha ile birim ve entegrasyon testleri yazın. 5. **Gereksiz Paketlerden Kaçının:** Her küçük işlem için kütüphane eklemek yerine Node.js yerleşik modüllerini tercih edin. ## Sık Sorulan Sorular 1. **Node.js bir framework müdür?** Hayır, Node.js bir framework değil, JavaScript kodlarını sunucu tarafında çalıştırmayı sağlayan bir runtime (çalışma ortamı) sistemidir. 2. **Node.js CPU yoğunluklu işler için uygun mu?** Genellikle hayır. Tek iş parçacıklı yapısı nedeniyle ağır matematiksel işlemler Event Loop'u bloklayabilir. Ancak Worker Threads kullanılarak bu kısıt aşılabilir. 3. **NPM ve NPX arasındaki fark nedir?** NPM paketleri yüklemek ve yönetmek için kullanılır; NPX ise paketleri yerel olarak kurmadan doğrudan çalıştırmayı sağlar. 4. **Node.js güvenli midir?** Node.js çekirdeği güvenlidir, ancak kullanılan üçüncü taraf paketler (NPM) güvenlik açığı barındırabilir. Düzenli denetim şarttır. 5. **Microservices mimarisinde neden Node.js tercih edilir?** Hafif yapısı, hızlı başlatma süresi ve JSON formatıyla doğal uyumu, onu mikro servisler için ideal kılar. ## Özet ve Sonuç Node.js, modern backend dünyasında hızı, ölçeklenebilirliği ve geniş ekosistemiyle vazgeçilmez bir yere sahiptir. Bu rehberde temel mimariden başlayarak, Express.js kullanımı, veritabanı yönetimi ve performans optimizasyonu gibi kritik konuları ele aldık. Doğru mimari yaklaşımlar ve best practice uygulamalarıyla Node.js, kurumsal düzeyde yüksek performanslı uygulamalar geliştirmenize olanak tanır.