Fikir ve hedef
Atify'a başlarken hedefim yalnızca bir müzik arayüzü hazırlamak değildi. Kullanıcının hesap açabildiği, oturumunu güvenli biçimde sürdürebildiği, içeriklere erişebildiği ve mobil cihazda müzik oynatabildiği uçtan uca bir sistem kurmak istedim. Bu nedenle projeyi backend, web yönetimi, mobil istemci ve üretim operasyonu olarak dört parçaya ayırdım.
İlk kararım backend'i Spring Boot 3.5.3 ve Java 17 ile geliştirmek oldu. İlişkisel veriler için JPA/Hibernate ve MySQL, güvenlik için Spring Security ile JWT, yoğun kullanılan veriler için Redis cache kullandım. Bu yapı bana kullanıcı, rol, içerik ve yönetim işlemlerini tek bir tutarlı veri modeli üzerinde toplama imkânı verdi.
Sistem mimarisi
Backend REST API'yi, kimlik doğrulamayı ve iş kurallarını yönetiyor. Spring Boot aynı zamanda statik web dosyalarını servis ediyor. Mobil uygulama ise Expo 55, React Native ve Expo Router ile bu API'ye bağlanıyor. Geliştirme ortamında API adresi .env üzerinden değişiyor; Android emülatörde 10.0.2.2, fiziksel telefonda yerel ağ adresi, üretimde ise https://atify.com.tr kullanılıyor.
- Spring Security ve JWT ile rol bazlı erişim.
- MySQL üzerinde ilişkisel veri, Redis ile cache katmanı.
- Actuator ve Prometheus ile sağlık ve metrik uçları.
- Expo Secure Store ile mobil oturum bilgisinin cihazda korunması.
Uygulama süreci
Önce veri modelini ve API sözleşmesini kurdum. Kullanıcı akışları sağlamlaşmadan oynatıcı arayüzüne geçmemek önemliydi; aksi hâlde mobil tarafta sürekli değişen endpoint'leri takip etmek gerekecekti. API kararlı hâle gelince Expo Router ile ekranları, oturum akışını ve oynatıcı durumunu birbirinden ayırdım.
Müzik oynatma tarafında expo-av, dosya seçimi gereken yerlerde Expo Document Picker kullandım. Uygulamanın web sürümünü geliştirirken CORS engeline takılmamak için küçük bir geliştirme proxy'si ekledim. Native Android ve iOS derlemelerinde istemci doğrudan üretim API'sine bağlanıyor.
Ortam adreslerini kodun içine gömmemek, aynı mobil kodun emülatör, fiziksel telefon ve production ortamında çalışmasını sağladı.
Test ve üretim
Backend tarafında JUnit 5, Mockito ve Spring Test ile 35 test oluşturdum. Bunun yanında geçici kullanıcı ve yönetici hesapları açan, temel ekranları dolaşan ve test bitince verileri temizleyen bir UI smoke testi hazırladım. Böylece yalnızca API'nin cevap vermesini değil, gerçek kullanıcı akışının çalışmasını da kontrol edebildim.
Canlıya alma tarafında yedekleme, güncelleme, sunucu sertleştirme ve sağlık kontrolü için ayrı operasyon betikleri kullandım. Mobil yayın için EAS Build profillerini, mağaza metinlerini, izinleri ve telif kontrol listesini ayrı belgelerde tuttum.
Ne öğrendim?
Bu projede en büyük ders, ürünün yalnızca koddan oluşmadığıydı. API, mobil deneyim, sunucu güvenliği, yedekleme, mağaza kuralları ve telif kontrolü aynı teslimatın parçaları. Bir özelliği tamamlanmış saymak için lokal ortamda çalışması değil, izlenebilir ve geri alınabilir biçimde canlıda çalışması gerekiyor.
SONRAKİ YAZIAksoy Tankım: prototipi nasıl kurdum?