← Bloga dön

Repository ve Service katmanlarıyla temiz mimari

Yazan 1 dk okuma 🇹🇷 Türkçe
  • #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.