5- Koin to Hilt Migration in QNB Android Mobile📢
Multi-Module Mobil Bankacılık Uygulamamızda Koin’den Hilt’e Geçiş: Nedenler, Zorluklar ve Kazanımlar 📱
Herkese merhaba, ben İsmail👋🏻
Bu makaleyi ekip arkadaşım Oğuz ile birlikte yazdık. Android dünyasında sürekli değişen teknoloji trendlerine ayak uydurmak bazen zorlayıcı olabiliyor, özellikle de dependency injection kütüphanenizi değiştirmeye karar verdiğinizde.
Bu yazıda, Koin’den Hilt’e geçiş sürecimizi, yaşadığımız zorlukları ve öğrendiklerimizi sizinle paylaşacağız. Hazırsanız başlayalım!
Koin Kullanımının Getirdiği Zorluklar Nelerdi? ⚒️
Projemizde Koin’i tercih ettiğimizde, onun sunduğu hızlı entegrasyon ve esneklik özelliklerinden yararlanmayı amaçlamıştık. Ancak projemizin ölçeği büyüdükçe ve karmaşıklığı arttıkça, Koin’in bazı dezavantajları daha belirgin hale geldi, bunlardan bazıları;
- Run-Time Dependency Resolution
- Koin, bağımlılıkları run-time sırasında çözer, bu da uygulamanın büyüklüğü arttıkça performans sorunlarına neden olabilir. Özellikle bizim gibi multi module büyük bir projede, bağımlılıkların çözüm süresi uzuyor ve bu durum uygulamanın açılış hızını ve genel performansını olumsuz etkiliyordu.
- Run-time sırasında bağımlılıkların çözülmesi, hataların ancak uygulama çalışırken fark edilmesine neden oluyor. Bu durum, özellikle production ortamında kritik hatalarla karşılaşma riskini artırıyordu.
2. Karmaşık Dependency Graph
- Projemizin modüler yapısı, modüller arası bağımlılıkların karmaşıklaşmasına yol açtı. Koin’in sağladığı bağımlılık yönetimi araçları, bu karmaşıklığı yönetmekte yetersiz kaldı ve manuel müdahaleler gerektirdi. Özellikle bağımlılık zincirlerinde oluşan hatalar, geliştirme sürecinde ciddi zaman kayıplarına neden oldu.
3. Crashler ve Hatalar
- Run-time dependency resolution nedeniyle, hatalar uygulamanın çalıştığı sırada ortaya çıkıyor. Bu da production ortamında beklenmedik crashlere neden oluyordu ve bu durum, kullanıcı deneyimini olumsuz etkiledi.
Bu sorunlar, projemizde kullanılan DI çözümünü gözden geçirme ve alternatifler üzerinde düşünme ihtiyacını doğurdu.
Neden Hilt’i Tercih Ettik? 🤔
Koin’de yaşadığımız sorunlar, daha sağlam ve Google tarafından desteklenen bir DI çözümüne geçiş yapmamızı gerektirdi. Hilt’i seçmemizin başlıca nedenleri şunlardır:
- Compile-Time Dependency Resolution
- Hilt, bağımlılıkları compile-time sırasında çözer. Bu, potansiyel hataların erken aşamada yakalanmasını sağlar ve uygulamanın performansını artırır.
- Özellikle büyük projelerde, run-time bağımlılık çözümünün getirdiği sorunları ortadan kaldırır.
2. Google Desteği ve Topluluk
- Hilt, Google tarafından desteklenen ve geliştirilmekte olan bir kütüphanedir. Bu durum, kütüphanenin sürekli güncellenmesi ve uzun vadede güvenilir bir çözüm olarak kalmasını sağlar. Ayrıca, geniş bir topluluk desteği bulunur, bu da karşılaşılan sorunların çözülmesinde büyük bir avantajdır.
3. Daha Güçlü Test Desteği
- Hilt, test süreçlerini daha kolay ve etkili hale getiren yerleşik araçlar sunar. Bu özellik, özellikle karmaşık projelerde bağımlılıkların test edilmesi konusunda büyük bir avantaj sağlar.
Hilt’e geçiş sürecimizde bizi bekleyen neler vardı? 🧐
Hilt’e geçiş, sadece DI kütüphanesini değiştirmekle kalmadı; projenin genel yapısının yeniden ele alınmasını ve bazı alanlarda kapsamlı refactor yapılmasını gerektirdi. İşte bu süreçte izlediğimiz adımlar:
1. Geçiş Öncesi Planlama ⏱
Her şeyden önce, geçiş sürecini başarılı kılmak için detaylı bir planlama yaptık. Bu aşamada:
- Modüler Yapıyı İnceleme: Uygulamamızda yer alan modüllerin bağımlılık haritasını çıkardık. Bu sayede, her modülün diğerleriyle olan ilişkisini net bir şekilde görebildik.
- Önceliklendirme: Geçiş sürecini adım adım gerçekleştirebilmek için modülleri önceliklendirdik. Öncelikle core modüllerden başlayarak, en kritik bağımlılıkların Hilt ile uyumlu hale getirilmesini sağladık.
2. Modül Modül Geçiş ➡️
Tüm uygulamayı bir anda Hilt’e taşımak yerine, modül modül bir geçiş stratejisi benimsedik. Bu yaklaşım, süreci daha yönetilebilir kılarken, hata tespitini de kolaylaştırdı.
- Core Modüllerin Dönüştürülmesi: İlk olarak, uygulamanın core fonksiyonlarını içeren modülleri Hilt’e geçirdik. Bu, diğer modüllerin de yeni DI yapısına sorunsuz bir şekilde adapte olmasını sağladı.
- Her Modül İçin Bağımsız Testler: Her modül Hilt’e geçirildikten sonra, bağımsız testler gerçekleştirildi. Bu testler, modüllerin doğru şekilde çalıştığını ve diğer modüllerle uyumlu olduğunu doğruladı.
3. Activity, Fragment ve ViewModel Refaktörleri 🚧
Hilt’e geçişle birlikte, tüm Activity, Fragment ve ViewModel’ler üzerinde kapsamlı bir refactor süreci gerçekleştirildi. Bu süreçte:
- Constructor Injection: Hilt, constructor injection kullanarak bağımlılıkları çözmekte daha etkili bir yöntem sunar. Activity, Fragment ve özellikle ViewModellerde bu yöntemi kullanarak bağımlılıkları enjekte ettik.
- Lifecycle Aware Componentler: Hilt’in sağladığı lifecycle aware componentler, bağımlılıkların sadece ihtiyaç duyulduğunda çözümlenmesini sağladı. Bu, özellikle performans açısından önemli bir iyileştirme oldu.
4. Generic Helper ve Utility Sınıfları 🔨
Uygulamada yaygın olarak kullanılan helper ve utility sınıfları, Hilt’in sunduğu Singleton ve Scope yapılarıyla yeniden yapılandırıldı. Bu süreçte:
- Singleton Yapılarının Yönetimi: Hilt’in @Singleton anotasyonu kullanılarak, uygulama genelinde ortak kullanılan sınıfların yönetimi optimize edildi.
- Scoped Dependency Management: Belirli Activity veya Fragment lifecycle’ları için ihtiyaç duyulan bağımlılıkları yönetmek amacıyla scope’ları yeniden tanımladık. Bu, bağımlılıkların sadece ihtiyaç duyulduğu anda enjekte edilmesini sağladı.
5. Test Süreci ve Kalite Kontrolü 📊
Geçiş sürecinin en kritik aşamalarından biri, uygulamanın Hilt ile stabil çalıştığından emin olmaktı. Bunun için:
- Unit Testler: Her modül için ayrı ayrı unit testler geliştirildi. Bu testler, bağımsız modüllerin Hilt ile uyumlu çalıştığını doğruladı.
- Integration Testler: Modüller arası entegrasyonun sorunsuz olduğunu garanti altına almak için kapsamlı integration testler gerçekleştirildi. Bu testler, modüllerin birbiriyle doğru şekilde çalıştığını ve bağımlılıkların doğru çözümlendiğini gösterdi.
- End-to-End Testler: Uygulamanın tamamı üzerinde end-to-end testler yapıldı. Bu testler, kullanıcı akışlarının Hilt ile uyumlu çalışıp çalışmadığını kontrol etti.
Ne sonuçlar çıkardık, neler öğrendik? 📚
Hilt’e geçiş, başlı başına büyük bir refactor süreci gerektirdi ancak sonuçları itibarıyla son derece tatmin edici oldu. İşte bu süreçten edindiğimiz başlıca kazanımlar:
1. Performans Artışı 📈
- Daha Hızlı Uygulama: Compile-time dependency resolution sayesinde, uygulamanın performansında ciddi bir artış gözlemledik. Uygulamanın açılış süresi kısaldı ve genel çalışma hızı arttı.
- Azalan Crashler: Run-time’da bağımlılıkların çözülmesi yerine, compile-time’da çözülmesi, beklenmedik crashlerin sayısını büyük ölçüde azalttı.
2. Geliştirici Deneyimi ve Verimlilik 👷🏻♀️
- Kolaylaştırılmış Geliştirme Süreci: Hilt’in sunduğu basit API ve kapsamlı dokümantasyon, geliştiricilerin yeni bağımlılıkları eklerken veya mevcut bağımlılıkları yönetirken daha hızlı ve verimli olmalarını sağladı.
- Google Ekosistemine Entegrasyon: Hilt’in Google’ın ekosistemi ile sorunsuz entegre olması, özellikle Jetpack bileşenleriyle uyumu artırdı ve proje genelinde tutarlılık sağladı.
3. Uzun Vadeli Sürdürülebilirlik 🔄
- Güncellenebilirlik: Google tarafından desteklenen bir DI çözümü kullanmak, projemizin uzun vadeli sürdürülebilirliğini garanti altına aldı. Hilt’in düzenli güncellemeleri, projede olası güvenlik açıklarını veya performans sorunlarını minimize etti.
- Topluluk Desteği: Hilt’in geniş topluluk desteği sayesinde, karşılaştığımız sorunlar için hızlı çözümler bulabildik ve projeye daha fazla yenilik katma şansı yakaladık.
Son Söz
Karmaşık ve modüler bir mobil bankacılık uygulamasını Koin’den Hilt’e geçirmek, ekip olarak büyük bir meydan okuma oldu. Ancak doğru planlama, adım adım geçiş stratejisi ve kapsamlı test süreçleriyle bu zorluğu başarıyla aştık. Hilt’in sunduğu compile-time bağımlılık çözümü ve güçlü test desteği, projemizin daha stabil, performanslı ve sürdürülebilir olmasını sağladı. Bu süreçten edindiğimiz deneyimler, gelecekteki projelerimizde de yol gösterici olacaktır.
Eğer siz de büyük bir projede DI çözümünüzle ilgili sorunlar yaşıyorsanız, Hilt’e geçiş yapmayı ciddi olarak değerlendirmenizi öneririz. Bu süreç, kısa vadede zorlayıcı olabilir ancak uzun vadede kazançlarınız tartışılmaz olacaktır.
Okuduğunuz için teşekkürler. Bir sonraki yazımız olan Modularization in QNBAndroid Mobile’da görüşmek üzere.