Manage Environment dengan Spring Profiles
Suatu aplikasi Spring biasanya membutuhkan beberapa environment yang berjalan, contoh sederhananya adalah development dan production environment. Setiap environment memiliki set konfigurasinya masing-masing seperti salah satu contohnya adalah konfigurasi datasource dimana antara development dan production pasti memiliki database terpisah.
Spring Boot memiliki sebuah fitur bernama profiles dimana fitur ini menyediakan cara untuk memisahkan bagian konfigurasi agar tersedia hanya di environment tertentu saja. Fitur ini sangat membantu baik pada saat development sampai ketahap deployment.
Properties File
Aplikasi Spring Boot by default memiliki sebuah file properties yaitu application.properties
. File properties hanya file sederhana yang bisa menyimpan pasangan key-value. File ini biasanya digunakan untuk menyimpan konfigurasi-konfigurasi aplikasi. Untuk dapat memisahkan konfigurasi berdasarkan environment tertentu, kita akan membuat beberapa application.properties
untuk setiap environment yang ingin kita buat. Disini sebagai contoh kita akan buat 2 environment(2 profiles), development dan production:
# application-dev.properties
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=root
spring.datasource.password=secret
...
# application-prod.properties
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:realdb
spring.datasource.username=root
spring.datasource.password=secret
...
Dalam membuat file properties untuk profiles, penting untuk memberi nama sesuai format application-{profile}.properties
karena akan mudah dikenali oleh Spring Boot. Sementara itu file application.properties
akan menjadi master untuk semua properties dan juga bisa digunakan untuk menentukan profiles mana yang sedang aktif.
# application.properties
spring.profiles.default=dev
spring.profile.active=prod
...
Aktivasi Profiles
Pada contoh program diatas kita bisa tentukan profiles mana yang aktif melalui properties spring.profile.active=prod
, namun bagaimana jika aplikasi kita sudah di-build menjadi .jar
atau .war
? Berikut beberapa caranya.
Melalui JVM system parameter, yaitu pada command untuk menjalankan aplikasi pertama kali (startup):
java –jar -Dspring.profiles.active=prod app.jar
Melalui environment variable:
export spring_profiles_active=prod
Atau melalui Maven profiles. Cara ini dengan membuat configuration property dan mengaktifkan fitur Filtering dari Maven untuk me-replace variable pada application.properties
. Maven akan menjalankan proses build dan hasil akhir dari cara ini adalah suatu file .jar
yang sudah siap running berdasarkan environment tertentu.
# application.properties
spring.profiles.default=dev
#spring.profiles.active=@environment@
...
<!-- pom.xml -->
...
<!-- created variable property called 'environment' -->
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<environment>dev</environment>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<environment>prod</environment>
</properties>
</profile>
</profiles>
<!-- Filtering activated -->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
...
</build>
mvn clean package -Pprod
kita juga bisa menentukan profiles mana yang aktif secara programatically.
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
application.setAdditionalProfiles("prod");
application.run(args);
}
}
@Profiles
Terdapat sebuah annotation @Profiles
dimana dengan ini kita bisa menentukan @Bean
untuk aktif pada environment tertentu saja.
@Configuration
public class DatasourceConfiguration {
@Bean
@Profile("dev") // applicable on class too
public void devEnvironmentSetup(){
...
}
@Bean
@Profile("prod")
public void productionEnvironmentSetup(){
...
}
}
Semua kode program lengkap dari contoh diatas dapat diakses disini.
Ref: