14 March 2016

Spring-Boot Hot Swap

Ketika dulu saya menggunakan Grails Framework, ada suatu fitur yang sangat saya sukai dalam Grails, yaitu fitur dimana saya tidak perlu me-restart aplikasi yang saya buat ketika saya memodifikasi source code aplikasi web tersebut. Saya hanya perlu me-refresh browser ketika saya ingin melihat perubahan dalam kode-kode yang telah saya modifikasi. Fitur ini disebut dengan fitur hot-swap
Seperti yang sama-sama kita ketahui bahwa java merupakan programming language, yaitu suatu bahasa yang memerlukan kompilasi source code sebelum program tersebut bisa di jalankan. Dan kita juga sama-sama mengetahui bahwa jika ada suatu aplikasi yang bisa dieksekusi tanpa harus mengkompilasi source code-nya, pada hakikatnya aplikasi tersebut bukanlah terbuat dari programming language melainkan scripting language. Scripting language adalah suatu pemrograman yang tidak memerlukan kompilasi untuk bisa menjalankan aplikasi tersebut. Perbedaan mutlak antar programming language dan scripting language ada pada masalah kompilasi source code ini. Dengan pengertian ini tentunya anda bisa membedakan yang mana programming language dan yang mana scripting language.
Meskipun Grails  mampu terintegrasi dengan baik terhadap JVM (Java Virtual Machine) dengan kemampuannya membaca API-API java, namun Grails bukanlah java, komponen utama Grails adalah Groovy yang menurut wikipedia memiliki paradigma sebagai sebuah scripting. Dalam pemakaiannya Groovy atau Grails sedikit menarik sebab terkadang groovy harus dikompilasi untuk bisa beroperasi, namun juga bisa berlaku layaknya script (tanpa harus kompilasi). Groovy script bisa dieksekusi langsung tanpa kompilasi apabila kode-kode yang tertulis berada di luar definisi sebuah class.
Demikian juga dengan Grails framework, framework yang dikhususkan untuk pembuatan aplikasi web ini memiliki fitur hot-swap, yaitu suatu fitur yang memungkinkan kita tidak perlu me-restart sebuah aplikasi web jika kita ingin melihat perubahan dari kode-kode yang kita modifikasi dalam aplikasi yang dibuat dengan menggunakan Grails.
Bagaimana dengan spring-boot?, ketika pertama kali menggunakan spring-boot terus terang saya tidak banyak tahu kalo ternyata spring-boot juga memiliki fitur seperti grails diatas, fitur yang mampu memperlihatkan suatu perubahan dari kode-kode yang kita modifikasi tanpa harus me-restart sebuah aplikasi. Ya, spring-boot ternyata memiliki fitur hot-swap ini, namun fitur ini terbatas hanya pada perubahan-perubahan yang dilakukan oleh kode-kode non java. Jadi kalo kita memodifikasi kode-kode yang termasuk java tetap harus melakukan restart aplikasi. Sebab hakikatnya java adalah programming language yaitu sebuah pemrograman yang memerlukan kompilasi sebelum kode-kodenya bisa digunakan. 
Yah, kalo gitu jadi percuma dong?.  Hmm, menurut saya tidak juga. Fitur ini akan sangat berguna jika kita melakukan integrasi scripting language dalam pemrograman aplikasi web menggunakan spring-boot framework. Contohnya seperti freemarker. Seperti yang sudah kita pelajari sebelumnya bahwa freemarker adalah sebuah template language framework yang bisa kita gunakan sebagai layer viewer (UI) dalam sususan development aplikasi web kita. Ketika kita menggunakan freemarker sebagai presentation layer maka freemarker adalah sebuah script yang tidak perlu dikompilasi lagi untuk bisa melihat perubahan-perubahan yang kita lakukan. 
Dalam membuat sebuah aplikasi web, saya pribadi sangat sering menggunakan design pattern MVC (Model, Viewer, Controller) dimana untuk presentation layer atau layer viewer-nya menggunakan konsep hybrid, yaitu perpaduan antara html pages dengan restful services. Untuk kondisi-kondisi yang memerlukan kembalian berupa object data, saya menggunakan konsep pages, sementara untuk kondisi-kondisi crud action seperti save, update, atau delete saya menggunakan konsep restful services. Kondisi dimana sebuah fungsi dalam web aplikasi memerlukan viewer seperti menampilkan list data atau menampilkan suatu data terpilih, saya menggunakan konsep html pages. Dan kondisi dimana fungsi sebuah aplikasi hanya menampilkan konfirmasi seperti “data sudah tersimpan”, “data sudah ter-update” atau “data telah sukses di hapus”, saya menggunakan konsep restful service. Inilah yang saya sebut dengan konsep hybrid dalam aplikasi web yang saya buat.
Ketika memasuki tahap pembuatan presentation layer atau viewer layer, biasanya saya akan lebih sering memodifikasi kode-kode pada bagian presentation tersebut, terutama di halaman html-nya. Hal ini saya lakukan untuk mendapatkan suatu tampilan yang tentunya maksimal, sesuai dengan estetika sebuah aplikasi web. Nah di saat inilah yang saya katakan sebelumnya bahwa fitur hot-swap dalam spring-boot akan menjadi sangat berguna. Saya tidak perlu me-restart aplikasi web jika saya melakukan perubahan dari sisi presentation layer atau viewer layer-nya. Baik itu halaman html, fungsi-fungsi javascript dalam halaman html tersebut, bahkan styling dengan css untuk mendapatkan tampilan presentation layer yang maksimal.
Dalam spring-boot, fitur hot-swap dilakukan dengan meng-include suatu library yang disediakan oleh spring-boot, dan cara menggunakan fitur ini pun harus mengikuti petunjuk yang disediakan oleh library tersebut. Jadi ketika kita menggunakan fitur hot-swap dalam spring-boot ini, kita tidak bisa menjalankan aplikasi dengan cara seperti biasa, sebab dengan cara itu fitur ini tidak akan bisa kita dapatkan, kita harus menggunakan cara spring-boot agar fitur ini bisa kita aktifkan. Lebih jelasnya mari kita implementasikan saja fitur ini.
Agar lebih mudah, silahkan check-out sebuah project yang pernah saya buat untuk tulisan-tulisan mengenai spring-boot sebelumnya di sini. Project tersebut adalah sebuah project aplikasi web yang menggunakan maven sebagai automatisasi development dan tentunya menggunakan spring-boot dan freemarker dalam sususan development-nya. Bukalah file pom.xml pada source code tersebut dan pada file pom.xml perhatikan baris-baris seperti dibawah ini:

<profiles>
    <profile>
        <id>default</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>exec-maven-plugin</artifactId>
                    <version>1.2.1</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>java</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <mainClass>org.josescalia.blog.simple.SpringApps</mainClass>
                    </configuration>
                </plugin>
                <plugin>
                    <!--make application have hot swap capability but this should be run with mvn spring-boot:run-->
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>1.2.2.RELEASE</version>
                    <dependencies>
                        <dependency>
                            <groupId>org.springframework</groupId>
                            <artifactId>springloaded</artifactId>
                            <version>1.2.1.RELEASE</version>
                        </dependency>
                        <dependency>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-starter-tomcat</artifactId>
                            <version>1.2.2.RELEASE</version>
                        </dependency>
                    </dependencies>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>
Baris tersebut merupakan definisi sebuah profile dalam suatu konfigurasi maven dalam development aplikasi web yang saya buat. Dalam profile tersebut saya menggunakan dua buah plugin maven, yang pertama plugin exec-maven-plugin dan yang kedua plugin spring-boot-maven-plugin. Plugin yang pertama mungkin biasa kita pakai dalam development aplikasi java, namun yang saya ingin bahas dalam tulisan ini adalah plugin yang kedua yaitu spring-boot-maven-plugin. Dalam plugin tersebut kita melihat ada dua buah dependency library, yaitu library springloaded dan library spring-boot-starter-tomcat. Library springloaded inilah yang sebetulnya membawa fitur hot-swap ke dalam development web aplikasi kita, sementara library lainnya adalah library pelengkap untuk bisa menjalankan aplikasi web, sebab seperti yang kita tahu tomcat merupakan application server java programming language.

Kemudian bukalah file application.properties yang ada pada folder src/main/resources/ dalam source code tersebut. Perhatikan di dalamnya ada baris seperti dibawah ini:
#server apps
spring.freemarker.cache=false
Baris tersebut merupakan perintah kepada web aplikasi supaya tidak menyimpan cache template freemarker. Baris ini harus dituliskan dalam file tersebut agar perubahan-perubahan yang dilakukan dalam freemarker akan bisa segera ada efeknya jika ada perubahan-perubahan yang kita lakukan di sisi freemarker.

Spring-boot-maven-plugin ini memiliki perintah-perintah maven seperti : spring-boot:help, spring-boot:repackage, dan spring-boot:run. Perintah yang terakhir inilah yang akan bisa mengaktifkan fitur hot-swap yang ada dalam maven plugin tersebut. Dengan kata lain, jika kita tidak menggunakan perintah ini, tentunya fitur tersebut tidak akan aktif.
Sekarang mari kita jalankan aplikasi web tersebut tentunya dengan menggunakan perintah yang tersedia, atau jika kita menggunakan konsol sistem operasi maka perintah untuk menjalankan aplikasi web tersebut menjadi seperti berikut ini:
mvn -P default spring-boot:run
Perhatikan pada konsol ketika pertama kali perintah ini di jalankan, kita akan mendapatkan baris-baris seperti gambar dibawah ini:
Baris inilah yang mengaktifkan fitur hot-swap dalam spring-boot dan bisa kita gunakan dalam development aplikasi web. Silahkan anda coba fitur ini dengan merubah salah satu file ftl (freemarker template language) yang ada pada folder src/main/templates/ kemudian refresh browser anda terhadap halaman tersebut. Dan lakukanlah itu tanpa me-restart aplikasi web yang sedang kita develop.
Semoga bermanfaat.


Depok, 14 Maret 2016

Josescalia

1 comment:

yusuf said...

saya kira ini adalah jave netbean, maaf mbak salah kamar nih. soalnyha saya masih bingung cara menghubungkan mysql phpmy admin dengan java netbean tuban kita.