15 February 2014

Memulai Grails (Bagian-3)

Pembaca yang budiman, setelah artikel sebelumnya kita sudah belajar bagaimana membuat sebuah aplikasi web dengan melibatkan GORM (Grails Object Relational Mapping), saya berharap para pembaca bisa mengerti secara konseptual kemudahan-kemudahan yang ditawarkan oleh Grails Framework. Dan saya yakin pasti akan begitu banyak pertanyaan-pertanyaan yang terbesit dalam benak pembaca semua. Bahkan mungkin ada yang ingin sekali mendebatkan beberapa point dalam tulisan-tulisan saya sebelumnya tentang Grails tersebut. Yang mungkin bisa saya katakan adalah kreatifitas yang mungkin muncul atas dasar sebuah tulisan dengan bentuk ingin bertanya, ingin mendebatkan, adalah sebuah hal yang positif, kreatifitas tersebut menandakan bahwa pembaca adalah orang yang kritis.
Untuk kali ini tulisan saya akan mencoba meraba kira-kira pertanyaan-pertanyaan yang terbesit dalam benak pembaca dan saya akan mencoba menjawab pertanyaan tersebut dengan segala pengalaman apa yang pernah saya lakukan dengan Grails Framework ini. Dan untuk rencana pembahasan Grails Framework selanjutnya berdasarkan urutan yang ada pada tulisan ini, kita belakangin aja dulu okay?

1. Bagaimana jika web aplikasi dengan Grails tersebut menggunakan MySQL sebagai databasenya.
Ya, mungkin ini adalah pertanyaan paling banyak yang muncul jika saja saya membuat sesi pertanyaan pada tulisan-tulisan saya tentang Grails Framework sebelumnya. Seperti yang sama-sama kita ketahui bahwa distribusi Grails Framework datang dengan dilengkapi oleh fitur “in memory database” yang bertujuan supaya para developer aplikasi web yang menggunakan Grails Framework bisa langsung melakukan kegiatan coding tanpa harus setup ini dan itu. Fitur “in memory database” pada Grails Framework sebetulnya seperti ini, Grails menggunakan Database H2 yang ter-setting dengan memanfaatkan memory dalam operating system untuk menyimpan data-data web aplikasi yang digunakan, tentu saja metode jenis ini tidak bisa di implementasikan dalam live production aplikasi web tersebut.
Biasanya kita menggunakan database seperti Oracle, MySQL, PostgreSQL dan lain-lain dalam live production sebuah aplikasi web. Untuk membuat supaya aplikasi web dengan Grails Framework yang kita buat pada tulisan lalu dapat menggunakan database MySQL, silahkan ikuti cara yang saya paparkan dibawah ini.
Pada project grails-book-catalog yang sudah kita buat sebelumnya, silahkan buka file DataSource.groovy yang ada pada folder grails-app/conf, kemudian edit file tersebut menjadi seperti code-code berikut ini:
dataSource {
    pooled = true
    driverClassName = "com.mysql.jdbc.Driver"
    username = "root"
    password = "root"
}
hibernate {
    cache.use_second_level_cache = true
    cache.use_query_cache = false
    cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
}
// environment specific settings
environments {
    development {
        dataSource {
            dbCreate = "create-drop"
            url = "jdbc:mysql://localhost:3306/grails_book_catalog?autoReconnect=true"
        }
    }
    test {
        dataSource {
            dbCreate = "update"
            url = "jdbc:mysql://localhost:3306/grails_book_catalog?autoReconnect=true"
        }
    }
    production {
        dataSource {
            dbCreate = "update"
            url = "jdbc:mysql://localhost:3306/grails_book_catalog?autoReconnect=true"
            pooled = true
            properties {
               maxActive = -1
               minEvictableIdleTimeMillis=1800000
               timeBetweenEvictionRunsMillis=1800000
               numTestsPerEvictionRun=3
               testOnBorrow=true
               testWhileIdle=true
               testOnReturn=true
               validationQuery="SELECT 1"
            }
        }
    }
}
Perhatikan source code diatas, kita coba mengunakan database MySQL pada konfigurasi tersebut dengan detail nama database-nya adalah “grails_book_catalog”, usernameroot” dan passwordroot”, driver database yang kita gunakan adalah “com.mysql.jdbc.Driver”, terkecuali driver database, silahkan sesuaikan sendiri dengan setting-an MySQL database yang ingin anda pakai.

Oleh karena kita menggunakan driver database yang berbeda dengan apa yang di generate secara otomatis oleh Grails, maka langkah selanjutnya adalah memasukkan library database MySQL tersebut ke dalam project aplikasi web kita. Silahkan buka fileBuildConfig.groovy” dan cari baris di bawah ini:
dependencies {
   // specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes e.g.
   // runtime 'mysql:mysql-connector-java:5.1.22'
}
Kemudian hapus tanda baca “//” sehingga menjadi seperti dibawah ini:
dependencies {
   // specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes e.g.
   runtime 'mysql:mysql-connector-java:5.1.22'
}

Dengan cara seperti ini, kita sudah memasukkan driver MySQL database ke dalam project aplikasi web kita. Sebelum kita menjalankan project aplikasi web kita ini, mari kita buat dulu database "grails_book_catalog" dalam database MySQL kita, seperti gambar beriikut ini:
Setelah database tersebut sudah kita buat, sekarang jalankan project aplikasi web kita lagi dengan cara mengetik grails commandgrails run-app”, dan setelah aplikasi web tersebut berjalan, silahkan periksa lagi database MySQL kita tadi untuk memastikan apakah benar table-table tersebut telah terbuat secara otomatis. Saya memeriksannya dengan cara seperti gambar berikut ini:
Yes, sekarang aplikasi web saya sudah menggunakan database MySQL, bagaimana dengan aplikasi web anda?

2. Bagaimana jika ada initial data dalam database?
Dalam sebuah pembuatan sebuah aplikasi, sudah merupakan suatu hal yang lazim jika sebelumnya ada data-data pada database tanpa melibatkan user yang mengisi database melalui aplikasi tersebut. Grails Framework memungkinkan kita membuat inisialisasi data sebelum aplikasi tersebut digunakan. Katakanlah seperti ini, project grails-book-catalog kita kemarin memiliki data-data Author sebagai sebuah data awal.

Untuk membuat aplikasi web tersebut memiliki data-data Author tanpa melibatkan user, silahkan ikuti langkah-langkah berikut ini. Bukalah fileBootstrap.groovy” pada foldergrails-app/conf” dan edit file tersebut sehingga menjadi seperti ini:
import org.learn.grails.Author

class BootStrap {

    def init = { servletContext ->

        if(Author.count == 0){
   def authorMojo = new Author(authorName: "Mojo", age: 18, address: "Jakarta").save(failOnError:true )
     def authorJosescalia = new Author(authorName: "Josescalia", age: 29, address: "Medan").save(failOnError:true )
     def authorJagoanNeon = new Author(authorName: "Jagoan Neon", age: 19, address: "Bandung").save(failOnError:true )
        }

    }
    def destroy = {
    }
}
File Bootstrap.groovy ini adalah file yang akan dieksekusi pertama kali oleh aplikasi web kita, tepat setelah aplikasi web kita ini kita jalankan, dalam baris tersebut kita melihat bahwa jika jumlah Author sama dengan nol (0) maka akan dibuat 3 buah object Author yang masing-masing object tersebut akan disimpan ke dalam database dengan statement.save(failOnError:true)”.

Kemudian stop aplikasi web kita tadi dengan menggunakan grails commandgrails stop-app” dan kemudian jalankan kembali dengan menggunakan grails commandgrails run-app”, dan ketika aplikasi web tersebut sudah berjalan, silahkan periksa apakah benar data tersebut sudah ada dengan cara membuka URL berikut ini pada browser anda “http://localhost:8080/grails-book-catalog/author/list” seperti gambar berikut ini:

3. Wah, ternyata benar bisa otomatis ada, tapi kan itu list ya, paging-nya gimana?
Ya, setelah melihat hasil di atas, akan timbul pertanyaan baru, bagaimana dengan paging-nya?. Grails Framework melengkapi fitur pada tampilan data list dengan paging, jumlah data setiap halaman pada list views secara default adalah 10 data setiap satu halaman. Silahkan anda tambahkan object Author pada file Bootstrap.groovy tadi menjadi lebih dari 10 buah data dan buktikan sendiri.
Tapi jika anda malas melakukannya, mari kita buktikan dengan cara seperti langkah-langkah berikut ini. Bukalah fileAuthorController.groovy” pada foldergrails-app/controller/”, kemudian pada actionlistedit-lah baris code menjadi seperti berikut ini:
def list(Integer max) {
   params.max = Math.min(max ?: 2, 100)
   [authorInstanceList: Author.list(params), authorInstanceTotal: Author.count()]
}
Pada code diatas kita merubah maksimal data yang ditampilkan pada setiap halaman dari 10 menjadi 2. Kemudian tunggu console grails anda supaya grails secara otomatis men-compile sendiri source code tersebut tanpa harus me-restart aplikasi web tersebut seperti gambar dibawah ini:

Kemudian refresh kembali browser anda tadi sehingga secara otomatis halaman tersebut akan berubah menjadi seperti gambar di bawah ini:
Ya, Grails mendukung pagination dan secara otomatis membuatkannya untuk kita.

4. Kok halaman Create Book pada form saya jadi aneh?

Ya, jika anda membuka alamat URLhttp://localhost:8080/grails-book-catalog/book/create”, akan tampil seperti gambar berikut ini:
Daftar Author pada form tersebut tidak sempurna tampil dalam halaman tersebut, untuk memperbaiki tampilan tersebut langkah-langkah yang bisa kita lakukan adalah dengan cara menambahkan baris berikut ini pada file Author.groovy.
@Override
public String toString() {
    return authorName
}
Meski cara tersebut bisa dilakukan, namun cara tersebut memerlukan restart aplikasi web, sebab setiap kali class domain dirubah, maka Grails Framework akan menghapus data yang sudah kita buat pada file Bootstrap.groovy. Sementara cara lain yang bisa dilakukan tanpa me-restart aplikasi web tersebut adalah seperti berikut ini, bukalah file _form.gsp pada foldergrails-app/views/book/”, kemudian pada sekitar 15 dari baris paling atas file tersebut edit menjadi seperti dibawah ini :
<%@ page import="org.learn.grails.Author; org.learn.grails.Book" %>
<div class="fieldcontain ${hasErrors(bean: bookInstance, field: 'author', 'error')} required">
        <label for="author">
                <g:message code="book.author.label" default="Author" />
                <span class="required-indicator">*</span>
        </label>
    <select id="author" name="author.id">
        <g:each in="${Author.list()}" var="author">
            <option value="${author.id}">${author.authorName}</option>
        </g:each>
    </select>
</div>
Ya, saya menghapus baris “” dan menggantinya dengan baris element html select seperti  diatas, dan menambahkan baris page import yang terletak paling atas. Silahkan periksa sendiri hasilnya. Selain itu ada juga file lain yang harus kita perlakukan sama dengan file _form.groovy ini, yang tampilannya akan serupa dengan form create book, sebab pada dasarnya class domain Book merupakan class domain yang memiliki relasi dengan class domain Author, dan secara tampilan maka object Author yang ada pada class domain Book masih merupakan object ketika ditampilkan dalam gambar, sementara authorName hanya merupakan properti pada class domain Author tersebut. File lain yang harus kita modikasi adalah seperti langkah-langkah berikut ini.
Buka filelist.gsp” pada foldergrails-app/views/book/” dan cari baris code dibawah ini:
<g:link action="show" id="${bookInstance.id}">${fieldValue(bean: bookInstance, field: "author")}</g:link>
dan edit menjadi seperti dibawah ini:
<g:link action="show" id="${bookInstance.id}">${fieldValue(bean: bookInstance, field: "author.authorName")}</g:link>
Kemudian fileshow.gsp” pada foldergrails-app/views/book/” dan cari baris code dibawah ini:
<span class="property-value" aria-labelledby="author-label"><g:link controller="author" action="show" id="${bookInstance?.author?.id}">${bookInstance?.author?.encodeAsHTML()}</g:link></span>
Dan edit menjadi seperti ini:
<span class="property-value" aria-labelledby="author-label"><g:link controller="author" action="show" id="${bookInstance?.author?.id}">${bookInstance?.author?.authorName?.encodeAsHTML()}</g:link></span>
Silahkan anda lihat sendiri hasil source code yang kita modifikasi, apakah sudah sepenuhnya berubah dan sesuai dengan yang kita inginkan.
Untuk sementara mungkin hanya itu dulu penglaman yang bisa saya share kepada para pembaca yang budiman sebelum kita meneruskan pembahasan sesuai rencana pada tulisan yang pertama, dan saya yakin masih akan ada banyak pertanyaan lain yang akan muncul, silahkan mencari jawaban dari pertanyaan-pertanyaan lainnya yang muncul dan tidak ada salahnya kali ini pembaca semua yang berbagi pengalaman tersebut dengan saya bukan? :D

Salam dan Semoga bermanfaat
Menteng, 15 Februari 2014.


Josescalia

2 comments:

sam said...

mas josescalia, mau tanya grails paging klo untuk case yang bukan initial data tapi menggunakan executequery dari 3 table join itu gimana caranya bisa menghasilkan list beserta paging jika waktu submit query dari periode tgl 30-06-2016 s/d 30-06-2016 ?
bisa di bantu mas saya ada case tugas di kantor

JoseScalia said...


Bisa dilihat basic cara-caranya disini:
http://grails.asia/grails-hql-join-examples
Yang harus diperhatikan adalah
1. Pastikan dulu Entity yang mau kita display informasinya, nah Entity ini jadi pegangan kita untuk menyandarkan eksekusi querynya, Contoh : Misal Book adalah entity yang mau kita display datanya maka jadi Book.executeQuery("HQL Join Query disini")
2. Pagination diterapkan hanya dengan menambahkan paramater [max: 10, offset: 20] pada method execute query. lihat disini http://gorm.grails.org/6.0.x/hibernate/manual/index.html#hql