/blog/*

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: