Salı, Ekim 07, 2008

Agile Enterprise Java

Enterprise Java programlama ile uğraşmanın en avantajlı yanlarından biri yüksek kaliteli açık kaynak kodlu kütüphane,framework'lerin bulunması. Eminim benim gibi bir çok kişi bu kütüphanelerden yararlanıyordur, artık Hibernate, EclipseLink, iBatis, Spring, Guice, JSF, Struts, Grails, Stripes, ZK, GWT, Wicket, Maven, JUnit vs. olmadan yazılım geliştirmeyi düşününemiyorum. Fakat alternatiflerin çokluğu bazen büyük bir dezavantaja dönüşebiliyor. Bu kütüphaneler arasından geliştirilecek projeye uygun olanları belirlemek ve belirli bir bilgi seviyesine ulaşmak çok kolay bir iş değil. Uygun teknolojileri seçsek bile birbirleriyle uyumlu halde çalıştırmak için çok sayıda konfigurasyon kodu (boilerplate code) ve dosyası yazmamız gerekiyor. Örneğin basit bir Hibernate, Spring, JSF uygulaması yazmak istediğimizde sadece bu üçlüyü bir arada çalıştırmak için yazacağımız konfigurasyon kodları azımsanmayacak derecede çok, ayrıca geliştirme esnasında tekrarlanan kodlar (i.e. faces-config.xml, application-context.xml) sıkıcı olmaya başlıyor ve asıl yoğunlaşmamız gereken programın iş mantığına yeterli zaman ayıramıyoruz.

Bu dezavantajlar son zamanların belki de en popüler konularından biri olan "Agile Software Development" ile tezat oluşturuyordu. Java topluluğunun bu soruna nasıl bir çözüm getireceğini ve Java ile program geliştirenlerin başka programlama platformalarına geçmemesini nasıl engelleyeceğini çok merak ediyordum. Ruby,Rails vb. platformlar topluluktaki ünlü Java Guru'larının bile ilgisini çekiyordu, Craig McClanahan (struts'un yaratıcısı) Java'dan soğuduğunu ve artık Ruby ile ilgileneceği söylüyordu. İşte benim fikrime göre Java bu çıkmazdan iki önemli framework ile çıkış sağladı. Birincisi Hibernate'in yaratıcısı Gavin KING'in fikirlerinden oluşturulan JBoss Seam, diğeri ise Groovy & Grails. Grails ve Groovy üzerine yazmayı sonraya erteleyerek bu yazıda Seam ve getirdiklerini başlıklar halinde kısa kısa anlatmaya çalışacağım.

Enterprise Java programlamayla uğraşan çoğu insanın EJB 2 ve Servlet zamanlarından pek güzel anıları yoktur. Çok sayıda XML konfigurasyon dosyası, EJB 2.0'ları öğrenmenin ve kullanmanın zorluğu, code-compile-deploy-test süresinin uzun ve sıkıcı olması gibi bir sürü sıkıntı. Bu sıkıntıların had safhaya vardığı süreçte ortaya çıkan Spring ve Hibernate vaad ettikleriyle ve başarılarıyla ben de dahil olmak üzere Java ile uğraşanların dikkatini çekti ve çoğu geliştirici kısa sürede Spring,Hibernate ile program geliştirmeye başladı. Spring uzun zamandan beri bilinen Dependency Injection ve Aspet Oriented Programming'e yeni bir bakış açısı getirdi ve Java topluluğunda büyük bir devrim yaptı. Öyle ki Spring ve Hibernate'in bu başarısı örnek alınarak EJB 3.0 standartı çıkartıldı ve EJB ile programlama modeli Plain Old Java Objects (POJO) seviyesine indirgenip EJB ile program geliştirme Spring,Hibernate kadar kolay hale getirildi. Spring 1.x sürümü ve Hibernate çok başarılıydı fakat EJB2.0'da olan sorun burada da vardı; XML karmaşası ve katmanları birbirine bağlamak için yazılan ektra kodlar ve konfigurasyonlar. Bu sorunlar Java 5 ile gelen annotations yardımıyla büyük bir oranda çözüme kavuştu fakat XML dosyaları ve konfigurasyon kodları hala çok fazla emek ve zaman gerektiriyordu.

Spring,Hibernate, EJB3 iş (business) ve veritabanı (database) katmanına kısmi bir çözüm getirdi fakat web arayüzündeki sorunlara uygun çözüm ise hala tam olarak bulunamadı (struts, struts2, Spring MVC, Tapestry, GWT, Grails, Wicket vs.) diyebiliriz. Bu sorunlar için son zamanlardaki en iyi çözümlerden birinin Java Server Faces (JSF) olduğunu düşünüyorum. JSF'nin sorunları ise sadece XML konfigurasyonları ile bitmiyor;
+ Yüksek öğrenme eğrisi (high learning curve)
+ Karmaşık yaşam süreci
+ Bookmark eksikliği, her türlü eylemin HTTP POST üzerinden yapılması vs....
Ama bunların yanında JSF'nin çok iyi düşünülmüş bir yaşam sürecinin olması, toplulukta standart olarak kabul edilmiş olması ve açık kaynak kodlu AJAX kütüphanelerinin olması gibi (icefaces,richfaces) büyük avantajları mevcut.(Açıkcası SEAM olmadan JSF geliştirmek çok can sıkıcı olabiliyor)

JSF for nonbelievers;
1, 2, 3, 4

Enterprise Java'daki Agile Development sorununa çare olmak, JSF ile web geliştirmenin sorunlarını gidermek, Web arayüzü ile İş/Veri katmanı arasındaki sorunları gidermek ve diğer platformlarda olan "Convention over Configuration (Configuration by Exception)" mantığını Java'ya taşımak, Java EE'yi (EJB/POJO/Spring,JSF/GWT/Wicket...,JPA/Hibernate) tek bir çatı altında birleştirmek (unification) üzere geliştirilen JBoss SEAM bence amacını hakkıyla yapıyor. Bütün özelliklerini burada uzun uzun tek bir başlık altında anlatmam imkansız, sadece maddeler halinde SEAM ile neler yapabilabileceğini anlatmaya ve daha detaylı bilgiler alabileceğiniz kaynakları vermeye çalışacağım. Fakat şundan emin olabilirsiniz ki JBoss SEAM ile uğraşmaya başladığınız andan itibaren Enterprise Java ve programlama hakkında bildiklerinizin çoğu şey değişmeye başlayacak ve hiç birşey eskisi gibi olmayacak ....

+ seam-gen; rails ve grails'de bulunan proje oluşturma, nesne ekleme vb. işler için kullanılan komut satırı tabanlı (eclipse entegrasyonu bulunuyor) ant betiği.
+ Configuration by Exception; proje oluşturduğunuz zaman yapmamız gereken konfigurasyonlar yok denecek kadar az. Sadece olağandan farklı bir davranışa ihtiyaç duyduğunuz zaman konfigurasyon yapmamız yeterli oluyor.
+ Bijection; Inversion of Control (IoC) veya Dependency Injection olarak bilinen yöntemin bir üst seviyesi veya dinamik IoC diye adlandırabiliriz. Böylece SEAM nesnelerine sadece bağlı oldukları nesneler verilmekle kalmıyor aynı zamanda SEAM nesneleriyle dinamik olarak SEAM container'ına Seam nesneleri gönderebiliyoruz.
+ Annotations desteği; bu sayede XML kullanımı minimum'a iniyor, tabii ki Seam annotations kullanmayı zorunlu kılmıyor eğer istersek annotations yardımıyla yaptığınız herşeyi XML ile yapabiliyoruz.
+ Aspect Oriented Programming desteği
+ Asenkron haberleşme için Events API'si ve Quartz desteği ("Observer Pattern" uygulayarak nesneleri birbirine daha az bağımlı (loosecoupled) hale getirebiliyoruz)
+ Servlet API'sinde bulunan application, session ve request scope'larına ek olarak Conversation, Page ve Business scopeları.
+ POJO programla modeli; EJB3 veya POJO arasındaki tercih bize kalıyor ayrıca bunlar arasında geçişler çok kolay yapılabiliyor ve EJB3'den POJO programlama modeline geçtiğimizde fonksiyonalite kaybı yaşamıyoruz.
+ Groovy desteği; Seam component'lerini groovy ile yazabiliyoruz
+ Web arayüzünde sadece JSF yerine Wicket, GWT, Tapestry veya Flex kullanabiliyoruz.
+ Rails ve Grails'de kullanılan Active Record'a benzeyen fakat biraz daha farklı olan Home Pattern yardımıyla veri tabanı objelerini yönetebiliyoruz.
+ Çok kolay bir şekilde normal HTML kodu yazarmış gibi PDF, RTF , grafik ve email gibi zengin içerikler oluşturabiliyoruz.
+ Spring ile güçlü entegrasyon; spring ile yazılmış projeler SEAM getirdiği yeniliklerden basit konfigurasyon ile yararlanmaya başlayabiliyor.
+ WebService ve RESTfull URL desteği
+ Basit veya gelişmiş güvenlik ayarları; sayfa, sınıf ve method bazında rol tabanlı güvenlik ayarlamaları yapabiliyoruz
+ jBPM ve Drools desteği
+ Javascript remoting kütüphanesi
+ Sanılanın aksine Seam ile geliştirilen programlar sadece Jboss AS'de çalışmıyor. Piyasada bulunan BEA WebLogic, IBM WebSphere, Oracle Containers for Java EE (OC4J), Apache Tomcat, ve GlassFish gibi sunucularda da sorunsuz şekilde çalışıyor.
+ extended persistence context, declerative transaction management, unified expression language, hibernate validations, page actions, page parameters, bookmarkable links .....

Bunlar Seam'in getirdiği yeniliklerden sadece birkaçı. Bence Seam uzun zamandır Java geliştiricilerinin beklediği bir kütüphane. Seam'i deneyince sizin de bana katılacağınıza ve Seam ile program yazmaktan keyif alacağınıza eminim.

Daha fazla bilgi için;

Seam dökümanları
Seamless JSF Serisi;1, 2, 3
Seam 2.0 hakkında yazılmış en yeni ve iyi kitap;



PS: Bazı teknik terimleri Türkçeye çevirmekten özellikle kaçındım çünkü Türkçe tercümelerin kavramları tam olarak anlatamadığını düşünüyorum.

3 yorum:

Adsız dedi ki...

Bu guzel yaziniz icin tesekkuru bir borc bilirim iyi calismalar.

mithat dedi ki...

gercekten guzel ve ufku genisletici bir yazi olmus. Elinize saglik

Gülay Genç dedi ki...

Gerçekten faydalı bir yazı olmuş. Teşekkür ederim. İyi çalışmalar.