Geliştirdiğimiz yazılım ürününün uzun ömürlü olmasını istiyorsak sadece kod yazmak anlamında bakmamalıyız bu işe. Software Development Life Cycle (SDLC) döngülerinin her biri iyi uygulanmalı ve düşünülmelidir. SDLC’nin analiz, tasarım, geliştirme, test ve bakım aşamaları yazılımın sadece ilk gününü değil, yıllar boyu sağlıklı bir şekilde çalışabilmesini garanti altına alır. Bu noktada yazılımın farklı yaşam evrelerini destekleyen bir ihtiyaç ortaya çıkar: farklı ortamlar (development, test, staging, production) ve bu ortamlara özel yapılandırmalar. İşte Spring Boot’un Profile kavramı burada devreye girer.
Genel Geliştirme Ortamları
- Development: Yazılımcının en rahat olduğu ortam da denilebilir. Özellikle yeni geliştirmeler burada denenip ileri ortam ilerletilir.
- Preproduction: Genellikle canlıya çıkılmadan önce son testlerin/geliştirmelerin yapıldığı ortam.
- Production: Uygulamamızın canlıda olduğu ortam.
Burada sorulması gereken önemli soru aynı kodu farklı ortamlarda nasıl çalıştırabiliriz?
Spring Boot Profil
Spring bootda genel anlamıyla yapılandırmaların olduğu dosya application.[ortam].properties/yml'dir. İhtiyacımız olduğu sürece bu dosyanın ne kadar tanımlanacağı hakkında bir sınır yoktur. Vereceğim örnekte 3 tane dosya tanımlayalım. Bunlardan birincisi tüm ortamlarda ortak olan ayarların olduğu dosya olsun. İkincisi ise sadece dev ortamına özel sonuncu dosyamız ise sadece prod ortamına özel ayarların olduğu dosya olsun. Büyük kurumsal projelerde her ortam için database, devops uygulamaları (dynatrace, kibana,redis) ayrıdır. Bunu göz önünde bulunduralım.
application.properties
Code1spring.application.name=myApp 2logging.level.root=INFO
application-dev.properties
Code1spring.datasource.url=jdbc:postgresql://localhost:5432/dev_db 2spring.datasource.username=devuser 3spring.datasource.password=devpass 4logging.level.com.jforce=DEBUG
application-prod.properties
Code1spring.datasource.url=jdbc:postgresql://prod-db:5432/prod_db 2spring.datasource.username=produser 3spring.datasource.password=prodpass 4logging.level.com.jforce=ERROR
Uygulamamız çalıştırıldığında hangi profilin ayakta olacağını bilmesi gerekir. Bunu 2 farklı yolla nasıl yapılacağını görelim.
- application.properties içinde belirtmek
Code1# application.properties 2spring.profiles.active=dev
Bu durumda uygulama çalıştığında application-dev.properties dosyası da otomatik olarak yüklenir. 2. Komut satırında belirtmek
Code1java -jar myapp.jar --spring.profiles.active=prod
@Profile Anotasyonu ile Bean Yönetimi
Dosya bazlı konfigürasyon dışında, bazen bazı bean’lerin sadece belirli ortamda çalışmasını isteriz. Bunun için @Profile anotasyonu kullanılır. Şimdi bunun için bildirim servisinden örnek senaryo kuralım.
Code1public interface NotificationService { 2 void bildirimGonder(String mesaj); 3}
Development için Bean
Code1@Service 2@Profile("dev") 3public class ConsoleNotificationService implements NotificationService { 4 @Override 5 public void bildirimGonder(String mesaj) { 6 System.out.println("DEV ortamı: " + mesaj); 7 } 8}
Prod ortam için Bean
Code1@Service 2@Profile("prod") 3public class EmailNotificationService implements NotificationService { 4 @Override 5 public void bildirimGonder(String mesaj) { 6 // Burada gerçek entegrasyon yapılabilir 7 System.out.println("PROD ortamı: " + mesaj); 8 } 9}
Eğer spring.profiles.active=dev → ConsoleNotificationService çalışır.
Eğer spring.profiles.active=prod → EmailNotificationService çalışır.
Neden Profile kullanmalıyız?
- Kod tekrarını engellemiş oluruz. (@Profile yöntemi)
- Farklı veritabanı bağlantı ayarlarını yönetmek için
- API KEY, şifre gibi gizli verileri her ortam için farklı kılmak
- Maintenance, Monitoring gibi işlemlerin daha kapsamlı yapılması. Tüm ortamlar için aynı aracı kullandığımızı düşünsenize.
Yazı buraya kadardı. Umarım okurken keyif alıp bir şeyler kazanmanıza katkı sağlamışımdır. Yazıyı paylaşarak bana en büyük desteği verebilirsiniz.
