Bir Web Çatısı (Framework) Anatomisi

August 29, 2010

2 yıldır PHP diliyle, Joy isimli açık kaynak bir framework geliştiriyordum. Bu framework’e Joy adını vermemin başlıca nedeni, uygulama geliştirken gerçekten zevk vermesini istememden kaynaklanıyordu. Bu framework’un 5 farklı versiyonu mevcut ve hepsinde de farklı yaklaşımlar kullandım. İlk versiyonu Event Driven patterni kullanırken, sonraki sürümlerde MVC patterni ağırlıklıydı. Event driven yapısı ise sonraki sürümlerde Workflow amacıyla yaşam döngüsünde yerini almıştı.

Bu sure zarfında çok şey öğrendiğimi itiraf etmeliyim. Birkaç ay once, piyasada çok fazla başarılı framework olması nedeniyle bu amacımdan vazgeçtim. Web dünyasının distributed computing ve parallel programming gibi konularada ihtiyaçlarınıda göz önünde bulundurarak, PHP yerini, JAVA’ya bıraktı ve Java projelerimin vazgeçilmez aracı olarak yerini aldı.

Java’yı projelerimin merkezine yerleştikten sonra, bu ekosistemde, Joy Framework’unde kullandığım fikirlerin sağlayacak araçları aramaya koyuldum. İlk zamanlar kaygılarım olsada J2EE ve Spring framework çevresinde aradığım herşeyi buldum. Aşağıda bu fikirleri ve Java dünyasındaki araçları bulacaksınız.

Yukarıda sözünü ettiğim konuları PHP ile  birçoğunu geliştirdim. xUnit, ORM , Library gibi kapsamlı konular için ise 3rd parti araçları kullandım. Bu yönüyle Integrated Framework olarakta adlandırılabilir.

Hayatımın 2 yılı bu yapı üzerinde uygulamalar geliştiriken Java’ya geçince bir boşluğa düştüğümü ve paniklediğimi itiraf etmeliyim. Neyse ki Spring Framework ve Java’nın Servlet mimarisi beni ciddi rahatlattı. Java dünyasının üstadları yukarıdaki konularda daha once benim yerime kafa yormuş ve düşündüğüm birçok şeyi hayata geçirmişti. Şimdi gelin bu teknolojilerin neler olduğuna bir göz atalım. Sonrada Java’nın ve Spring’in gücüyle bir web çatısı nasıl olur onun güzel bir örneğini inceleyelim.

Gelin şimdi yukarıdaki Java araçlarını yakından inceleyelim.

Java Servlet: 1.0 sürümün, JSR-315 diye adlandırılan 3.0 sürümüne kadar birkaç özellik dışında yaşam döngüsü pek değişmedi. Bu yaşam döngüsü, servlet mimarisinin esnekliğinin ana kaynağıdır. Web.xml dosyası içinde, Listener, Filter, Servlet tagleri bir web projesindeki tüm gereksinimleri kapsar. Frameworkler ise buradaki mimariden faydalanarak bu işleri daha kolay bir hale getirir. Şimdi gelin bu taglerin ne anlama geldiğini bir hatırlayalım.

Java Server Pages: JSR-245 spesifikasyonunda detayları açıklanmıştır. JSP, PHP veya ASP’ye benzer. HTML üzerinde Java kodlarının çevik bir şekilde kodlanarak kullanılması amaçlanır. JSP dosyaları arkada otomatik olarak servlete dönüştürülür. Frameworkler ile birlikte, JSP dosyaları, template engine’i gibi kullanılmaya başlanmıştır.

Java Standard Tag Library: Java’nın tag kütüphanesidir. Aynı ASP.NET’te olduğu gibi yeni bileşenler yaratılabilmesi sayesinde kod tekrarı engellenir ve yeniden kullanılabilirlik sağlanır.

Spring Framework: Java dünyasında elinizi sallasanız bir Web Framework’e çarparsınız. O kadar fazladır ki, artık bıkkınlık getirir. Hangisini kullanmalı diye araştırıldığında, Spring Framework en çok tutulan frameworklerin başında gelmektedir. Bunun en önemli nedenlerinin başında, IoC, AOP gibi konuları sayesinde OOP ve tasarım prensiplerine uygun, bakımı kolay, temiz kodlar yazmamızı sağlaması gelmektedir. Struts’ı koltuğundan etmiş, Java EE 6’ya, getirdiği yeniliklerle ilham vermiş $ukella bir frameworktür. Kendi içinde, Security, Webflow, MVC vb gibi alt projeleri vardır. Sadece web alanında kullanmasa da, özellikle hakim olduğu alan burasıdır. VMWare tarafından desteklendiğini de belirtmekte yarar var.

Spring MVC: Web dünyasının son moda tasarım şablonu olan MVC’nin Spring implementasyonudur. İşleri anotasyonlar kullanılarak, XML konfigürasyonlar en aza indirgenir. Zaten bir IoC konteynerı olması nedeniyle. Model ve View alanında alternatif teknolojilerle entegre olması mümkündür. Bu da teknoloji seçimi esnekliği sağlar.

Spring Security: Spring Security, ACEGi olarakta bilinen bir projedir. Authentication ve authorization konularında çözümler sunar.

Spring Web flow: İş akışlarını, kod bağımlılığını en aza indirgeyerek, XML konfigürasyonları ile yapılmasını sağlar. Bunun için event driven bir mimari kullanır.

Hibernate: JBoss’un geliştirdiği bir numaralı Persistence aracı olan Hibernate’i bilmeyen yoktur sanırım. Kısaca DAO tasarım şablonunu destekler. Ve veri erişim katmanı mimarsi ile veritabanı tablolarını sınıflar ile eşleştirir.

Alternatif olarak ise Java EE 5 ile hayatımıza giren JPA adlı bir başka persistence aracıda bulunmaktadır. Java EE 6 ile birlikte daha çok göreceğimiz persistence aracıdır.

Sitemesh: Çok yeni olmasına rağmen, her geçen gün daha fazla ilgi görmeyi başaran bir şablon motorudur(templete engine). Java dünyasında, bir framework seçildiğinde, özellikle bu framework, Spring gibi integrated bir framework ise, layout(master page) ihtiyacı ile ilgili bir arayış söz konusu olur. İşte Sitemesh, Tiles ve Velocity bu durumlarda en çok başvurulan şablon motorudur. Açıkçası, ilk önce ilgimi Tiles çekse de, sonraları Grails projesininde katkılarıyla Sitemesh ilgileri üzerinde topladı diyebilirim. Sitemesh, Tiles’tan daha basit olması diğer bir tercih nedenidir. Decorator Design patternini kullanır. Bunun anlamı, layout sayfanızda, sadece değiştireceğiniz alanları belirler ve ilgili sayfalara sadece bu alanları değiştirirsiniz.

Quartz Scheduler: Web dünyasında mutlaka, bazı işleri arkada düzenli olarak kontrol eden, yaratan vb servislere ihtyaç vardır. Örneğin, mail gönderme, statu güncellme vb.. İşte bu gibi konularda schuder bir servis gereksinimi var olur. Fakat iş mantığını ve birçok yardımcı kod java kodumuzdadır. Ve bu Cron gibi bir servise bağlandığında her seferinde bir VM’in belleğe yüklenip, kaldırılması anlamına gelir. Bunu engellemek için Servlet mimarisinde listener kullanmak daha yerinde olur. Çünkü Listener’lar aynı bellek alanını kullanır. Bu sayede ciddi bir performans kazanımı sağlanır.

İşte bu nedenle Quartz yaratılmıştır. Quartz trigger modelleri sayesinde, Cron benzeri bir formatta da konfigüre edilebilmektedir.

Log4J: Apache projesinin loglama mimarisi.

EhCache: Son zamanlarda, frameworkler gibi çok fazla cache projesi ortaya çıkmıştır. Bunların çok azı distirbuted bir yapıda çalışır ve clustered, replication gibi konuları destekler. Ehcache ise, distributed cache desteklmesi, memory yetersiz olduğu durumlarda diski kullanması (SWAP) gibi özellikleri sayesinde, en çok tercih edilen bir cache projesi olmuştur.

Java’da memcache gibi Java dışında bir dil kullanılarak yazılan cache motorlarının kullanılmamasının en önemli sebebi, In Memory kavramıdır. Ehcache, uygulama ile aynı memory alanında çalışması ciddi bir performans artışı sağlamaktadır.

Maven: Maven, hem derlemek, hem de bağımlılıkları yönetmek için kullanılan çok kapsamlı bir deployment aracıdır. Derlemek işinin sadece bir bölümüdür. Bağımlılıkları yönetmenin yanında proje iskeleti konfigürasyon yaratmak konusunda da hünerleri vardır.

Diyelim ki, Spring MVC, Tiles ve Hibernate’i birlikte kullanmak istediniz ve konfigürasyonları ile uğraşmak istemiyorsunuz. http://code.google.com/p/spring-maven-archetype/ projesi işinizi görebilir. Maven üzerinde birçok archetype projesi bulabilirsiniz. Ya da kendi archetype’nızı yazarak yeni bir projeye hızlı bir başlangıç yapabilirsiniz.

AppFuse adında birçok alternatif teknoloji konfigürasyonunu içinde barındıran bir archetype projeside mevcuttur.

Not: Son olarak söylemek istediğim bir şey daha var, yukarıdaki bir çok teknolojinin entegre edilmiş ve çevik bir web programlama ortamı sağlayan framework daha var. Java VM ile çalışmasına rağmen kodları Java değil. Gördüğüm en iyi web frameworklerinden biri olan bu framework’ün adı Grails. Yine arkasında Spring ekibi var ve Spring’in birçok teknolojisi ustaca kullanılmış. Dil olarak ise Groovy adında Ruby benzeri bir dil kullanılıyor. Groovy bir Java standardı. Java’nın gücüyle çevikliğin hızını birleştirmek isteyenler için küçük bir bilgi olsun istedim!

Artık elimizi koda bulamanın zamanı geldi. Yukarıdaki teknolojiler ile ilgili örneklere sırasıyla önümüzdeki yazılarda detaylı olarak ve örnekler sunarak inceleyeceğiz.