0%
Blog'a Dön
Spring Boot Profil Kavramı

Spring Boot Profil Kavramı

3 dk okuma
#Spring Boot

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

Code
1spring.application.name=myApp 2logging.level.root=INFO

application-dev.properties

Code
1spring.datasource.url=jdbc:postgresql://localhost:5432/dev_db 2spring.datasource.username=devuser 3spring.datasource.password=devpass 4logging.level.com.jforce=DEBUG

application-prod.properties

Code
1spring.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.

  1. application.properties içinde belirtmek
Code
1# 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

Code
1java -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.

Code
1public interface NotificationService { 2 void bildirimGonder(String mesaj); 3}

Development için Bean

Code
1@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

Code
1@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.