WebAPI : Katmanlı Mimari Tasarımı(NTier)

Katmanlı mimari nedir ve yazılım dünyasında neden bu kadar yaygın olarak tercih ediliyor? Bu mimarinin sunduğu avantajlar nelerdir?
Katmanlı Mimari
Günlük yaşamda, iş ve özel hayat gibi farklı alanları birbirinden ayırmak ve her alanı kendi dinamikleri içerisinde değerlendirmek yaygın bir yaklaşımdır. Benzer şekilde, yazılım geliştirme süreçlerinde de farklı işlevlerin birbirinden bağımsız olarak ele alınması, sistemin daha esnek ve yönetilebilir olmasını sağlar. Katmanlı mimari, bu ayrımı teknik anlamda gerçekleştiren bir yapı sunar.
Bu mimari modelde, her bir katman kendi sorumluluğunu üstlenir ve diğer katmanlardan bağımsız çalışır. Bu sayede, bir katmanın yaptığı değişiklikler diğer katmanları etkilemez, böylece sistemin her bir parçası esnek, test edilebilir ve sürdürülebilir hale gelir. Katmanların birbirine zayıf bağlı olması, sistemin daha kolay yönetilmesini ve geliştirilmesini mümkün kılar.
Web API Nedir?
Günlük hayatta farklı hizmetleri kullanabilmek için çeşitli arayüzlerle karşılaşırız. Örneğin, bir banka şubesine giderek işlemlerimizi bir görevli aracılığıyla yaparız. Görevli, bizim taleplerimizi alır, arka plandaki sistemlere bağlanır ve istediğimiz işlemi gerçekleştirir. Biz sadece görevliye ne yapmamız gerektiğini söyleriz, arka plandaki karmaşık süreçlerle ilgilenmeyiz.
Web API (Application Programming Interface) de benzer şekilde çalışır. API, bir uygulamanın başka bir uygulamayla veya sistemle iletişim kurabilmesi için bir arayüz sunar. Kullanıcı veya istemci tarafı, API’ye bir istek gönderir ve API, bu isteği arka plandaki sistemlere yönlendirir. Verilen yanıtı alarak istemciye geri döner. Bu süreçte, istemci tarafı, arka planda neler olup bittiğini bilmeden sadece istediği sonuçlara ulaşır.
Web API’ler, farklı platformlar ve uygulamalar arasında veri paylaşımını ve iletişimi sağlayarak sistemler arası entegrasyonu kolaylaştırır. Bu sayede, yazılımlar arası veri alışverişi, işlev çağrıları gibi işlemler hızla gerçekleştirilir ve kullanıcılar karmaşık işlemlerden soyutlanmış olur.
Şimdi, adım adım bir Web API’yi katmanlı mimari kullanarak nasıl tasarlayabileceğimizi inceleyelim.

Yukarıdaki şemada, Web API’nin katmanlı mimari yapısını ve nasıl çalıştığını görebiliriz. Bu mimari, arka uç (back-end) sistemlerini daha düzenli bir şekilde yapılandırmamıza yardımcı olur.
Arka Uç Sistem (Back-end System)
Arka uç sistemimizde dört ana katman bulunuyor:
- Varlık (Entity) Katmanı:
Varlık katmanı, uygulamanın temel veri yapılarıyla ilgilenir. Bu katmanda, veritabanındaki tabloları temsil eden sınıflar tanımlanır. Örneğin, bir kullanıcı nesnesi için “User” sınıfı oluşturabiliriz. Bu sınıf, kullanıcının özelliklerini (isim, e-posta, şifre vb.) ve bu verilere yönelik işlemleri tanımlar. Varlık katmanı, sistemin veri modelinin kalbidir ve veri bütünlüğünü sağlamak için dikkatlice tasarlanmalıdır. - Depo (Repositories) Katmanı:
Repository katmanı, veriye erişim ve yönetim işlevlerini üstlenir. Bu katman, Varlık katmanındaki sınıflar ile veritabanı arasındaki köprüyü kurar. Repository’ler, CRUD (Create, Read, Update, Delete) işlemlerini gerçekleştirmek için özel yöntemler içerir. Örneğin, bir kullanıcı kaydetmek veya güncellemek için “AddUser” veya “UpdateUser” gibi yöntemler tanımlanabilir. Bu yapı sayesinde, veriye erişim işlevselliği merkezi bir noktada toplanır ve kolayca yönetilir. - Servis (Service) Katmanı:
Servis katmanı, iş mantığını barındırır. Bu katman, Repository katmanından gelen verileri alır ve belirli kurallara göre işler. Örneğin, kullanıcı kaydı yaparken, kullanıcının e-posta adresinin benzersiz olup olmadığını kontrol eden bir yöntem geliştirebiliriz. Servis katmanı, uygulamanın iş süreçlerini ve mantığını tanımladığı için, kodun geri kalanıyla olan bağımlılıkları azaltarak esnek bir yapı sunar. Ayrıca, servis katmanında birden fazla Repository ile etkileşimde bulunarak karmaşık işlemleri gerçekleştirebiliriz. - Sunum (Presentation) Katmanı:
Sunum katmanı, sistemin dışarıya açılan kapısını temsil eder. API’lar bu katmanda yer alır ve istemcilerin veri alıp göndermesine olanak tanır. Bu katmanda, HTTP isteklerine yanıt veren yöntemler tanımlanır. Örneğin, bir kullanıcı kaydı için bir “POST /users” API’si oluşturabiliriz. Sunum katmanı, istemcilerin (web veya mobil uygulamalar) arka uç sistemle etkileşimde bulunduğu yerdir. Bu katman, verileri kullanıcıya sunarken, kullanıcıdan gelen istekleri ilgili servislere yönlendirir.
Katmanlar Arası İletişim
Katmanlı mimaride, her katmanın kendi işlevi olmasına rağmen, bu katmanlar arasında etkili bir iletişim sağlamak kritik bir öneme sahiptir. İşte bu sürecin adımları:
- Sunum Katmanı ile Servis Katmanı

Presantation katmanı, kullanıcıdan gelen talepleri alır ve Service arayüzü ile veri arasında bir köprü görevi görür. Örneğin, kullanıcı kaydı işlemi sırasında, sunum katmanı UserService.CheckContext
metodunu çağırır. Bu aşamada, kullanıcıdan alınan verilerin geçerliliğini kontrol etmek önemlidir. Örneğin, e-posta adresinin formatının doğru olup olmadığını veya gerekli alanların boş olup olmadığını kontrol ederiz. Eğer kullanıcı e-posta adresini yanlış girerse, bu durumu kullanıcıya iletecek bir hata mesajı döndürülür; örneğin, "Geçersiz e-posta formatı" şeklinde bir geri bildirim verilir.
Burada dikkat edilmesi gereken bir diğer nokta, kullanıcıdan alınan verilerin güvenliği ve doğruluğudur. Örneğin, kullanıcı isteklerini kontrol etmek için gerekli önlemler alınmadığında SQL enjeksiyonu gibi güvenlik açıklarına neden olabilecek durumlar ortaya çıkabilir. Bu nedenle, sunum katmanında kullanıcıdan alınan tüm veriler üzerinde doğrulama ve sanitasyon işlemleri yapılmalıdır.
2. Servis Katmanı ile Repository Katmanı

Servis katmanı, iş mantığını yöneten ve tüm iş kurallarının uygulandığı katmandır. Diyagramda, UserService.AddUser(user)
metodu bir kullanıcının sisteme eklenme sürecini başlatır. Ancak, bu işlemi gerçekleştirmeden önce, UserManager.CheckUserExist
metodu kullanıcının daha önce sisteme kayıtlı olup olmadığını kontrol eder. Eğer kullanıcı sistemde mevcutsa, işlem sonlandırılır ve kullanıcının zaten var olduğuna dair bir geri bildirim sağlanır: “Bu kullanıcı zaten sistemde kayıtlı.”
Eğer kullanıcı mevcut değilse, servis katmanı UserRepository.AddUser(user)
metodunu çağırarak repository katmanına veri gönderir. Repository katmanı, varlık katmanı ile doğrudan etkileşimde bulunur ve veritabanı işlemlerini gerçekleştirir.
3. Repository Katmanı ile Varlık Katmanı

Repository katmanı, varlık katmanındaki sınıflarla etkileşimde bulunarak veri işlemlerini gerçekleştirir. Örneğin, UserRepository.AddUser(User)
metodu, varlık katmanındaki User
nesnesini alır ve veritabanına kaydeder. Bu aşamada, User
nesnesinin doğru şekilde yapılandırıldığından emin olmak önemlidir. Veritabanına kaydedilecek verilerin doğruluğu, sistemin güvenilirliğini artırır.
Eğer varlık katmanındaki nesne eksik veya hatalı bir bilgi içeriyorsa, veritabanına kaydedilme süreci başarısız olabilir. Repository katmanı bu durumu yakalamalı ve servis katmanına iletmelidir. Kullanıcıya verilecek hata mesajı, durumu açıklayıcı olmalıdır; örneğin, “Kullanıcı bilgileri eksik” veya “Kullanıcı kaydı başarısız” gibi ifadelerle kullanıcı bilgilendirilmelidir.
Bu akış, katmanların birbirine bağımlılığını en aza indirirken, kodun test edilebilirliğini ve sürdürülebilirliğini artırır. Ayrıca, her katmanın kendi sorumluluğuna odaklanarak hata ayıklama sürecini kolaylaştırır.
Örnek WebAPI Katmanlı Mimari tasarımı Github Repomdan ulaşabilirsiniz : https://github.com/serkanyasr/WebAPI-NTier-Architecture