Archive for June 10, 2008

Kenalan sama Spring

Spring adalah salah satu application framework untuk aplikasi berbasis Java, tepatnya J2EE. Apakah application framework itu? Setelah disarikan dari berbagai macam sumber bacaan, gw simpulkan application framework itu adalah sekumpulan aturan atau standar yang disertai dengan library, yang digunakan untuk mempermudah, mempercepat atau membuat pengembangan aplikasi secara rapi sehingga bisa dikembangkan lagi dengan mudah di kemudian hari. Sedangkan J2EE –sekarang disebut Java EE– oleh situs Sun Microsystem dijelaskan sebagai

Java Platform, Enterprise Edition (Java EE) builds on the solid foundation of Java Platform, Standard Edition (Java SE) and is the industry standard for implementing enterprise-class service-oriented architecture (SOA) and next-generation web applications“.

Sederhananya, ini adalah edisi Java yang dipakai untuk mengembangkan aplikasi berskala besar atau enterprise. Edisi lainnya, Java SE (Standard Edition) adalah Java yang selama ini gw pakai untuk mengembangkan aplikasi desktop kecil2an). Dan satunya lagi, Java ME (Micro Edition) sesuai namanya, untuk mengembangkan aplikasi untuk perangkat kecil seperti PDA, handphone, dll. Jadi alih2 menggunakan Java SE yang selama ini gw pakai, sekarang gw akan mulai belajar dan menggunakan Java EE. Pak Endy Muhardin berbaik hati memberikan tips bagaimana mulai belajar Java EE di sini.

Sekarang balik lagi ke Spring. Ketika bicara tentang Spring, maka akan sering sekali terdengar istilah Inversion of Control (IoC) dan Dependency Injection. Gw sebagai pendatang baru dalam dunia Spring ini tentu saja bingung dengan kedua istilah itu. Untunglah ada forum berbahasa Indonesia yang membahas mengenai hal2 tersebut. Ada juga contoh yang bagus dari http://www.devx.com/Java/Article/21665. Jadi mari lihat contoh berikut ini.

Misalnya gw mo buat suatu class yang bertugas memproses data, dalam arti membaca data dari suatu file dan memberikan data dari file tersebut pada class yang memanggilnya. Namanya class DataProcessor.

class DataProcessor
{
public Result processData()
{
FileDataReader dataReader = new FileDataReader(“/data/file1.data”);
Data data = dataReader.readData(); //membaca data
return data.calculateResult(); //mengembalikan data pada class yang memanggilnya
}
}

Ini dia potongan class yang memanggil si DataProcessor (disebut client code).

//client code:
DataProcessor fileDataProcessor = new DataProcessor(); //membuat objek DataProcessor
Result result = fileDataProcessor.processData(); //meminta data dari hasil pembacaan file

Di sini terlihat DataProcessor bergantung atau dependent pada FileDataReader. Kalau mau membaca data dari sumber lain, misalnya database, class DataProcessor harus direfactor, biar bisa menerapkan pembacaan data yang lebih general. Salah satu caranya dengan menggunakan interface.

interface DataReader {
public Data readData(); }

class DataProcessor
{
private DataReader dataReader;

public DataProcessor(DataReader reader) {
this.dataReader = reader; }

public Result processData() {
Data data = dataReader.readData();
return data.calculateResult(); }
}

//client code:
FileDataReader dataReader = new FileDataReader(“/data/file1.data”);
DataProcessor fileDataProcessor = new DataProcessor(dataReader);
Result result = fileDataProcessor.processData();

DataProcessor tidak lagi beroperasi pada objek FileDataReader, melainkan pada interface DataReader yang diimplementasikan oleh FileDataReader sehingga lebih generic dan reusable. Masalahnya, setiap client code yang mau memproses data harus membuat objek data reader sendiri dan me-link objeknya dengan DataProcessor. Daripada begitu, kita bisa menginjeksikan kebergantungan (inject the dependency) antara DataReader dengan DataProcessor dengan factory class. Factory ini istilah yang baru gw kenal juga. Jadi ditambahankanlah class DataProcessorFactory ini dan client code-nya menggunakan jasa si factory untuk membuatkan reference ke DataProcessor.

class DataProcessorFactory
{
public static DataProcessor getFileDataProcessor()
{
DataReader reader = new FileDataReader(“/data/file1.data”);;
DataProcessor dataProcessor = new DataProcessor(reader);
return dataProcessor;
}
}

//client code:
DataProcessor fileDataProcessor = DataProcessorFactory.getFileDataProcessor();
Result result = fileDataProcessor.processData();

Si factory-lah yang membuatkan objek dari DataProcessor untuk client. Client tinggal meminta objek dan data hasil baca file melalui factory. Dengan ini telah terjadi apa yang namanya Inversion of Control dengan cara Dependency Injection (DI). Bentuk IoC yang lain adalah Dependency Pull, tapi gw belum ngerti itu.

Semakin besar aplikasi yang dibuat, semakin banyak factory class yang diperlukan. Ini gak menguntungkan karena kebanyakan factory itu merupakan singleton sederhana, yang tugasnya membuat dan menghubungkan objek2, nggak bisa di-inherit sehingga banyak duplikasi. Kelebihan DI dengan Spring, menurut DevX.com adalah
… its ability to act as a factory to create objects. Spring reads a schematic defined in an external configuration file, creates and wires the objects together using reflection, and then passes the objects back to you. Think of Spring as a factory that you don’t have to write any code for.

Intinya, Spring membuatkan dan menghubungkan objek2 melalui skema yang didefiniskan di configuration file eksternal, dalam hal ini file XML (gw gak tau hanya bisa XML file apa bisa yang lain). Langsung aja ke contoh kodenya. Client code akan menjadi seperti ini.

//client code:
InputStream is = new FileInputStream(“src/examples/spring/beans.xml”);
BeanFactory factory = new XmlBeanFactory(is);

DataProcessor dataProcessor = (DataProcessor) factory.getBean(“fileDataProcessor”);
Result result = dataProcessor.processData();

dan file XMLnya seperti ini.

<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE beans PUBLIC “-//SPRING//DTD BEAN//EN” “http://www.springframework.org/dtd/spring-beans.dtd”>

<beans>
<bean name=”fileDataProcessor”
class=”examples.spring.DataProcessor”
singleton=”true”>
<constructor-arg>
<ref bean=”fileDataReader”/>
</constructor-arg>
</bean>
<bean name=”fileDataReader”
class=”examples.spring.FileDataReader”
singleton=”true”>
<constructor-arg>
<value>/data/file1.data</value>
</constructor-arg>
</bean>
</beans>

Selalu dibungkus dengan tag <beans></beans>, di dalamnya bisa ada banyak tag <bean>, yang merepresentasikan objek di code Java yang kita buat. Contohnya pada code XML di atas, bean name yang pertama adalah “fileDataProcessor”, ini adalah identifier untuk objek bertipe DataProcessor (class=”examples.spring.DataProcessor”). Singleton = true artinya gw rasa mirip2 static di Java, jadi setiap kali ada request dari client, Spring akan selalu memberikan instance yang sama. Kalau singleton diset false, Spring akan membuat bean (instance kali ya maksudnya) yang berbeda untuk setiap request. Dalam tag <constructor-arg>, <ref bean=”fileDataReader”/> berarti passing objek dengan id “fileDataReader” untuk constructornya. Dari tag bean yang kedua bisa kita lihat bahwa “fileDatReader” ini nama instance dari class FileDataReader. Bean yang kedua ini mempassing nilai ke constructornya (lihat <value>/data/file1.data</value>).

Sampai saat ini itulah yang gw pahami. Masih belum mengerti hal2 lain seperti AOP, DAO, dan ORM. Kesimpulan tentang Spring, katanya sih framework yang satu ini sangat mantep sekali. Ini garis besarnya

  • Spring bertujuan untuk meminimalkan dependency antar komponen aplikasi dan menyediakan plug-in architecture. Mungkin inilah yang mendukung terjadinya dynamic workflow seperti yang dijelaskan supervisor KP gw kemaren. Jadi kita bisa pasang komponen aplikasi saat runtime tanpa perlu bongkar kode Java-nya.
  • Object linking di Spring didefinisikan di file XML, jadi kita bisa memasang komponen atau konfigurasi yang berbeda saat runtime.
  • Berbeda dengan factory yang invasive, di mana client sangat tergantung pada factory karena meminta objek ke sana, Spring menyediakan reference objek ke client yang membutuhkan. Spring secara aktif merangkai dependency dari objek yang gak kenal satu sama lain menjadi aplikasi yang utuh.
  • Kemampuannya ini berguna banget buat Test-Driven-Development di Xtreme Programming (gw gak terlalu ngerti ini). Tapi mungkin artinya adalah bisa memudahkan untuk testing sana sini. Karena kode2 gak saling kenal, tp kalo mau disatuin juga gampang. Client gak perlu membuat objek baru (gak pernah membuat reference dengan keyword new), gak perlu lookup ke factory, Spring yang menyediakan dependency-nya secara runtime–dengan real maupun mock object.
  • Unit testing jadi mudah dilakukan karena gak ada dependecy yang hard-code, class2 yang ada saling gak kenal satu sama lain.

sumber2 bacaan:
http://dotnet.netindonesia.net/?0::21357
http://www.devx.com/Java/Article/21665
http://arfan86.blogspot.com/2007/02/chating-tentang-spring-framework.html

Comments (2) »

Spring time at Bening

Senin kemarin gw dipanggil untuk interview Kerja Praktik (KP) di Bening Guru Semesta, sebuah solution provider dan juga business partner, begitu mereka menyebut perusahaannya. Jadwal interview jam 10, maka gw naik KRL ekonomi jam 8 dari Bogor. Kali ini turunnya tidak di stasiun UI, tentu. Tapi empat stasiun dari UI, Pasar Minggu.

Sampai stasiun Pasar Minggu jam 9, satu hal yang pertama kali gw lakukan: nelpon GPMT untuk nanyain jadwal student exchange. Ini yang gw khawatirkan sejak kemarin2. Student exchange yang diundur dari tanggal 24 Mei ini gak jelas sampai kapan diundurnya. Menurut website DIKTI sih diundur sampai bulan Juli 2008, tapi belum jelas juga tanggalnya. Gw khawatir karena bentrok sama jadwal KP. Masalahnya, gimana kalo gw di tengah2 KP cabut selama 3 minggu? Saran dari beberapa orang sih mundurin aja jadwal KPnya, mulai bulan Agustus, atau KP pas semester 7 berjalan. Tapi gw pengennya mulai sekarang, biar liburan nggak nganggur.

Ternyata orang GPMT malah nggak tau sama sekali kapan jadwal berangkatnya. Terus terang gw agak kecewa sama pelayanannya, bukan hanya kali ini. Gedung Pelayanan Mahasiswa Terpadu ini ternyata tidak se-terpadu namanya. Ya sudah, let’s continue the journey!

Mbak Prita (Fasilkom 2002) bilang dari stasiun Pasar Minggu gw harus jalan sedikit terus naik Metromini nomer 75. Di depan stasiun gak ada 75 yang lewat, lalu gw tanya seorang Bapak. Ternyata harus nyebrang dulu, jalan ke arah kiri stasiun (dilihat dari posisi keluar stasiun). Yap, itu dia si 75 jurusan Pasar Minggu-Blok M. Tanya kernetnya tau Pizza Hut gak –Mbak Prita bilang turun di sebrang Pizza Hut– alhamdulillah dia tau. Kernetnya satu cowok satu cewek: kernet cewek ketiga yang gw lihat setelah satu di Malaysia dan satu di sinetron Indonesia.

Gw duduk manis sambil mengamati jalan dan si kernet cewek menagih ongkos. Jauh dekat Rp 2500, kata tempelan di dinding metromini. Dan metromini meninggalkan Pasar Minggu –yang benar2 pasar– menyusuri jalan raya Ragunan, gw rasa. Gw pernah lewat sini setelah dari Bumi Perkemahan Ragunan. Jalannya kecil dan tidak tampak seperti kawasan perkantoran di pusat Jakarta. Ya, emang ini Jakarta Selatan sih. Tapi bayangan gw lokasi kantornya di jalan besar dengan jajaran gedung2 tinggi dengan Busway berseliweran di depannya. Namun ternyata bayangan gw tidak salah. Metromini belok kanan dan barulah lokasi yang gw bayangkan itu tergambar sepanjang jalan. Beberapa saat kemudian kernet cewek yang baik nan tomboi itu bilang udah sampai Pizza Hut dan gw turun di situ. Pizza Hut di sebrang sedangkan Aldevco Building, ini dia tujuan gw. Gw masuk ke gedung di tengah, yang paling besar. Lewat pintu samping karena pintu depannya adalah pintu cafe. Aneh. Liat2 papan informasi, Bening berada di lantai 3 Aldevco Extension Building. Gw tanya Satpam di manakah etension building itu, ternyata di sebelah kanan main building ini. Ya.. gw menuju ke sana..

Masuk extension building, langsung naik lift sampai lantai 3. Hmph.. tempat asing yang garing kelihatannya. Setelah mengunjungi toilet (yang bisa menjadi salah satu alasan gw untuk bersyukur kalo ga diterima di Bening–gw gak pernah suka toilet tanpa gayung), gw mencari kantor Bening. Belok kanan dari lift, menyusuri koridor dengan pintu2 kayu di samping kiri kanannya bertuliskan “PT Sierver Indonesia, PT Sunnyvalindo, dll”. Oh begini rupanya kantor2 di sini. Dan di ujung koridor ada pintu kaca yang alhamdulillah bertuliskan PT Bening Guru Semesta. Hh.. gw gak nyasar.. Jam 09.40, gw slonong boy masuk ke kantornya, yang untungnya lagi nggak terkunci. Disambut seorang pegawai yang kemudian mempersilakan gw menunggu di ruangan duduk. Kak Amin (Fasilkom 2002) adalah orang kedua yang gw liat. Dan saat menuju ruang duduk itu, gw melewati ruangan kerja dengan wajah2 yang gak asing di depan komputer masing2. Mbak Dini, Mbak Nova, dua2nya Fasilkom 2003, bahkan Agung temen seangkatan gw yang ternyata udah mulai KP di sana. Masuk ruang duduk, eh ternyata ada si Meirna yang lagi menekuni proyeknya bareng Mbak Tia (Fasilkom 2002). Haris juga udah mulai KP di sana.

Sambil nunggu gw ngisi kuisioner dengan pertanyaan seperti bahasa pemrograman apa yang anda kuasai beserta tingkat kemahirannya, posisi apa yang paling anda sukai dalam sebuah proyek, posisi apa yang paling anda hindari, jam kerja yang anda inginkan, dll. Gw hanya mengisi ASP.NET dengan tingkat kemahiran basic, PHP5 intemediate, dan J2SE intermediate. Posisi yang paling gw suka programmer (meskipun dibilang kuli), yang gw hindari tester, dan jam kerja Senin-Kamis jam 9-16. Sambil nunggu, ketemu Mbak Enno dan Mbak Prita (Fasilkom 2002).
Kenyamanan dan keharusan beradaptasi yang sangat sedikit adalah alasan kenapa gw pengen KP di Bening. Tentunya gw perlu alasan untuk sanggup datang setiap hari menjalani aktivitas yang sama. Dan orang2 di sini membuat gw cukup nyaman untuk itu. Selain itu, suasana di sini amat santai. Bahkan selama di kantor boleh bersendal jepit. Jadi gw pun gak perlu rapi2 banget. Maksudnya, cukuplah pake kemeja dan bersepatu serta masih bisa bertas ransel, seperti banyak Mbak2 di sini.

Jam 10 lewat interviewernya datang. Interviewnya amat singkat, karena dia cuma nanya2 tentang pengalaman proyek, capability, dan availability. Bapak ini, Pak Hasan adalah alumni Fasilkom juga, angkatan 97. Dia bilang gw dipanggil di belakang2 ini (padahal gw apply sebelum Meirna tp dia malah udah diterima bahkan sebelum gw diinterview) karena udah ada pengalaman proyeknya. Oh, gw kira perusahaan ini menganut Last Come First Serve (bisa dibilang iya juga sih). Gak apa2 lah, yang penting gw sampaikan jadwal KP gw yang mungkin terpotong 3 minggu di bulan Juli. Apakah gw mulai Agustus aja atau mulai sekarang tapi izin di tengah2. Dan dia bilang gak apa2 kalau ditinggal di tengah2, atau bisa sekalian sambil ngerjain meskipun gak masuk kantor. Oye.. alhamdulillah. Dan hari itu –karena gw bilang masih bisa di sana– langsung mulai deh KPnya, meskipun kata Ara gak diitung KP kalo KAKP (Kerangka Acuan KP) belum disetujui. Gw bahkan belum bikin KAKP. Ya gak apa2 lah.. gw sih seneng2 aja. Deadline KAKP batch 1 diundur minggu depan, jadi gw masih bisa masuk. Dan sekarang belajar2 dulu aja.

Dan benarlah, gw disuruh belajar dulu. Setelah menentukan gw masuk proyek mana, Pak Hasan menerangkan tentang framework yang dipakai. Oh, sungguh canggih sekali dunia ini.. Inilah enaknya KP di perusahaan IT, banyak istilah2 high tech baru yang gak gw tau. Membuka pikiran bahwa masih banyak framework di dunia ini selain Smarty. Haha, ya iya lah. Jadi intinya gw harus mempelajari Spring, sebuah framework untuk Java. Nanti kalo sempet gw tulis di postingan terpisah.

Gw duduk di sebelah Mbak Dini. Dengan laptop gw dan untungnya ada wi-fi, mulai cari2 bacaan tentang Spring dan konco2nya. Pegawai di sini nggak dapet ruangan atau kubikel sendiri, tapi kayak satu lab yang digunakan bersama. Dan taukah kawan.. baru satu hari KP udah bosen rasanya. Bukan bosen KPnya, tapi bosen cuma duduk doang seharian. Agung bilang, sehari aja udah bosen apalagi setahun, kalo abis lulus kerja kayak gini. Makanya harus play hard juga selain work hard :)

Saat istirahat siang, makan bareng2 di meja bundar ruang duduk. Seperti peraturan tak tertulis, ibu2 biasanya makan duluan. Makanannya disediain jadi gak perlu beli ke luar. Setelah itu shalat, ada mushala kecil di dalam kantor Bening. Dan setelah itu kembali berkutat dengan Spring dan konco2nya. Kali ini mendapat pencerahan setelah menelusuri halaman berbahasa Indonesia. Ternyata di forum2 lokal juga banyak diskusi tentang Spring. Gw pulang lebih cepat dari yang lain, jam setengah lima, dan alhamdulillah bisa Maghrib di rumah. Semoga bisa betah dan senang2 aja selama KP, mendapat ilmu yang bermanfaat dan juga memberi manfaat ;)

Leave a comment »