Repository ve Service katmanlarıyla temiz mimari
- #mimari
- #typescript
- #backend
Dayframe’i (web, yönetim paneli ve API’yi tek monorepo’da topladığım verimlilik uygulaması) kurarken en çok işime yarayan kararlardan biri, kod tabanını net katmanlara ayırmak oldu: Repository ve Service.
Neden ikiye ayırıyoruz?
Temel kural basit:
- Tüm veritabanı erişimi repository’den geçer. Service katmanı asla doğrudan SQL/ORM çağırmaz.
- Tüm iş mantığı service’ten geçer. Controller’lar sadece isteği alır, service’i çağırır, cevabı döner.
Bu ayrım sayesinde iş mantığını test etmek için gerçek bir veritabanına ihtiyacın kalmıyor — repository’i sahteleyip (mock) service’i izole biçimde test edebiliyorsun.
Pratikte nasıl görünüyor?
// repository: yalnızca veri erişimi
class TaskRepository {
findById(id: string) {
return db.task.findUnique({ where: { id } });
}
}
// service: iş mantığı, doğrulama, kurallar
class TaskService {
constructor(private tasks: TaskRepository) {}
async complete(id: string) {
const task = await this.tasks.findById(id);
if (!task) throw new Error('Task not found');
// ...iş kuralları burada
}
}
Girdi doğrulamayı Zod ile sınırda yapıyorum; oturum yönetimini ise HMAC imzalı stateless cookie ile hallediyorum. Katmanlar net olunca, yeni bir özellik eklerken “bunu hangi dosyaya yazacağım?” sorusu ortadan kalkıyor.
Kısa ama işe yarayan bir kalıp — değerini özellikle proje büyüdükçe gösteriyor.