Vapor 3 ile ServerSide Swift'e Giriş

En son güncellendiği tarih: May 30


Swift, açık kaynak kodlu, güçlü ve derleyici tasarımı sebebiyle etkili bir geliştirme dili. Bir iOS geliştiricisi olarak Swift'in modern özelliklerini kullanarak geliştirme yapmak oldukça eğlenceli. Geçtiğimiz yıl Mayıs ayında, bu güçlü dili sunucu tarafında, yeni başlayacağımız projede kullanmaya karar verdim.


iOS platformu için Swift dili ile geliştirme yapan yazılımcılar için öğrenme/adaptasyon süresinin oldukça düşük olması ve hızlı uyum sağlayabilmek büyük bir avantaj. Özellikle mantıksal hataların, derleme zamanında geliştiricinin karşısına uyarı olarak çıkması, backend gibi mantıksal kodlama gerektiren bir projede oldukça iş kolaylaştırıyor.


O dönemde, Kitura ve Vapor framework'lerini karşılaştırdım ve uzun bir araştırma/karşılaştırmadan sonra Vapor ile devam etmeye karar verdim. Karar vermede etkin olan ilk 3 kriter şu şekildeydi:


- Topluluk: Vapor'ın discord uygulaması üzerinden size herhangi bir sorunuzda yardımcı olabilecek ve yeni ihtiyaçları kodlamaya hevesli şahane bir topluluğu var,

- Dökümantasyon: Hızlıca ve yolunuzu kaybetmeden ilerlemenizi sağlayacak bir dökümantasyonu olması ise projeye adım atarken çok önemli.

- Entegrasyon & Kütüphaneler: İhtiyaca yönelik entegrasyonları desteklemesi ya da sizin Swift ile o ihtiyaca yönelik geliştirmeyi/entegrasyonu yapabilmeniz server projenizin sürdürülebilmesi için çok önemli. Bu anlamda, Vapor framework'ünde çalışabilen JWT, Google Cloud Provider, Mongo Kitten, Fluent gibi topluluk ve Vapor geliştiricileri tarafından yazılmış çok fazla sayıda Swift kütüphanesi mevcut ve geliştirmeye devam ediyorlar.


Server tarafında Swift ve Vapor 3 framework'ünü yaklaşık 9 aydır geliştirme & üretim ortamında kullandıktan sonra deneyimlerimi ve bazı püf noktalarını paylaşmak istedim.


Vapor framework'unde Server tarafında Swift projelerinin nasıl olduğuna bakalım ve kendimiz baz bir proje mimarisi oluşturalım. Mobi'nin sonunda, hızlı bir şekilde başlangıç yapmanızı sağlaması için projenin son halinin GitHub projesini paylaşacağım.


1 -  Kurulum:


Bilgisayarınızda hali hazırda Xcode kurulu olduğunu varsayarak devam ediyorum. İlk olarak sistemimizdeki Swift versiyonunu kontrol edip, brew komutu ile vapor'u kuralım. Eğer bilgisayarınızda brew yoksa şuradan kurabilirsiniz.

Mevcut Xcode uygulamanız ve Swift versiyonunuz ile vapor'un uyumlu olup olmadığını aşağıdaki komut ile kontrol edelim:


eval "$(curl -sL check.vapor.sh)"

Komut satırı sonucu: Vapor 3'ün, Xcode 10.2 ve Swift 4.2 ile uyumlu olduğunu gösteriyor.


2 - Temel Komutlar:


Kurulumdan sonra, ilerlemeye hazırız.✌️Başlamadan önce, vapor projesi oluşturmak, proje dosyasını yeniden oluşturmak, projeyi build ve clean etmek gibi temel komutlara göz atalım.


Yeni proje yaratmak & Xcode proje yapısını oluşturmak

VaporApp adıyla ilk Vapor projemizi oluşturalım. ☝️Proje isimleri pascal isimlendirmesine uygun olmalı.

Projeyi Build & Clean etme


Proje üzerinde çalışan herhangi bir takım üyesi, proje dosyasına yeni bir dosya eklediğinde ya da projenin bağımlı olduğu kütüphaneleri güncellemek için package.json dosyasını düzenler. Bu düzenlemelerden sonra vapor clean ve vapor update komutlarının çalıştırılmasına ihtiyaç oluşur.


3 - Target'lar & Project Yapısı:


vapor xcode komutu ile projemiz için Xcode projesini oluşturmak istediğimizde, komut satırında Xcode projesini açmak isteyip istemediğimizi soracaktır. (Open Xcode project?) Evet diyerek ilerlersek, Xcode projemizde, iki adet şema oluştuğunu göreceğiz: Run ve App şeması. Run şemasını kullandığımızda projemiz çalışmaya başlayacak. 🎬 İnternet browser üzerinden adres olarak localhost:8080/hello yazıyoruz ve karşımıza uygulamamızın ilk cevabı çıkıyor: 

Hello, world! 🔮


http://localhost:8080/hello

Uygulama tarafında neler olduğuna bakalım: 🤔


Run şeması çalıştığında ilk olarak main.swift'teki kodlar tetiklenir, burada uygulamaya ait bir kopya oluşur. Uygulama kopyası oluşturulup başlatıldıktan sonra configure.swift dosyasındaki kodlar çalıştırılır, burada veritabanı bağlantıları, middleware ve router gibi uygulamaya register (kayıtlı) olması ve başlatılması gereken servislerin kodları yazılır. Configure dosyasındaki tanımlara ait kodlar çalıştıktan sonra boot.swift üzerindeki kodları çalıştırılır ve uygulama başlamış olur.


Uygulamanın istekleri kabul edeceği noktalar (end point) routes.swift dosyasında tanımlanır.


Vapor projeleri yapı olarak Swift Paket Yöneticisi kullanır ve Vapor projelerinin yapısı SPM klasör yapısı üzerine kurulmuştur.

SwiftPM Proje Yapısı

routes.swift dosyasını incelersek, hello isimli GET http methoduna cevap veren bir endpoint tanımı olduğunu göreceğiz. Bu closure ilk isteğimizin geldiği nokta ve çalıştırılan metoddur. Bu endpoint, Vapor projesinde otomatik olarak gelen örnek bir endpointtir.


routes.swift dosyasında tanımlanmış bir örnek GET endpointi

Vapor uygulamanız büyüdükçe, routes üzerindeki endpoint tanımları Oldukça karmaşık bir hal alabilir. Bunu aşmanın en iyi yolu, uygulamadaki mantıksal kısımlara ait kodları Controller ve Service'lere, isteklere ait tanımları ise Request ve Response'ları içeren DTO sınıflarına almak olacaktır.


Aşağıda mimari uygulamamıza gelen herhangi bir isteğin geçeceği örnek bir rotayı görüyorsunuz.


Herhangi bir isteğin örnek mimari uygulamamızdaki yolculuğu

İşleri bir seviye daha ileri taşıyalım ve hello path'ine sahip endpoint'imizi oluşturalım ve bu endpoint'in dünyanın her yerinden gelen insanlara kendi dilinde 'Merhaba' dediğini varsayalım.


  • İstek (Request): Hedef url'e ve içeriğe sahip istek paketi. Bu örnekte '/hello' url'i.


  • Ara Katman (Middleware): Tanımlı isteklerin takibini ve header bilgilerinin (dil bilgisi, client uygulama versiyonu vb.) ya da içeriklerini kontrolünü yapan katman. Eğer isteğe cevap vermek servis için öncesinde kullanıcının giriş yaptığını kontrol etme gibi ihtiyaçlarını varsa JWTMiddleware katmanı yeterli olacaktır. Örneğimizde, login ihtiyacı olmadığı için BaseMiddleware isimli isteklerin geçeceği basit bir ara katman ekleyeceğiz.


  • Controller: İstekleri karşılayan, validasyonu gerçekleştiren ve ilgili akışa göre bir ya da birden fazla servis çağrısını yaptıktan sonra cevabı döndüren metodu barındıran sınıf/katman. Örnek durumumuzda, HelloController ismini verdiğimiz sınıf, isteklerin karşılanıp GreetingService'e gönderilmesinden sorumlu.


  • Servis (Service): Bütün mantıksal kısımların tutulduğu, veritabanı ve 3. parti API'lar ile konuşan kod Parçaları servis kısmında yer alır. Örnek uygulamamızda, GreetingService kullanıcılar için doğru karşılama mesajını oluşturup göndermekten sorumlu. (aynı şekilde Mongo DB'mizde messages collection üzerinden dile göre doğru mesajın getirilmesi de olabilir.)


Projemiz için oluşturduğumuz ilk proje klasör yapısını aşağıdaki gibi değiştirelim. Vapor projeniz büyürken, proje yapısını daha da düzene sokmak için bu tarz bir proje klasör yapısına ihtiyaç olacak.

Controllers, Middlewares, Models, Services and finally Extensions

- Request and Response DTO's:


Örneğimize geri dönersek, kullanıcıların dil bilgisini almak ve bu bilgiye göre göstermek istediğimiz mesajı backend uygulamamızdan göndermek gerekli. Vapor'da request ve response sınıflarını Encodable ve Decodable olabilen bir yapıdan yani Content'ten türeterek aşağıdaki gibi oluşturuyoruz.


- Request Middleware:


Bu örneğimiz için gerekli olmasa da projenin ilerleyen safhalarında kullanmak üzere bütün isteklerin üzerinden geçeceği bir Middleware katmanı olan RequestMiddleware sınıfını oluşturup, aşağıdaki sekilde sadece respond metodunu implement ediyoruz.


- Controller:


- Service:


- Message yapısı:


-Routes Tanımı:


Son olarak HelloController'a metodunu ekleyip route'a "/greeting/hello" üzerinden ulaşılmasını sağlıyoruz.


Postman ile aşağıdaki gibi bir POST request'i gönderip deneyelim!

Postman Response

Uygulamamız hazır ✌️ Söz verdiğim, VaporApp Github reposuna buradan erişebilir, başlangıç projesi olarak hızlıca kullanabilirsiniz. Beğendiyseniz Repo'yu yıldızlamayı unutmayın ;)


Bir sonraki Mobi Mongo DB ve Vapor 3 projesi oluşturmak üzerine olacak. Görüşmek üzere.


- Burcu Geneci, Monday Hero'da CTO


#vapor3 #swift #serversideswift


Komünite

Platform

Mobiler.dev Anasayfa
  • Twitter
  • Instagram
  • development_düzenlendi_düzenlendi
  • Youtube
  • slack-icon-black_edited_edited_edited
  • Gri LinkedIn Simge
JetBrains Hakkında Detaylı Bilgi Alın

© 2020 by mobiler.dev

mobilerdevLogo.jpg
Yazarlık Başvurusu Hakkında Bilgi Alın, Başvuru Yapın.
Topluluk Yazarlarını Tanıyın