Bir Web Çatısı (Framework) Anatomisi

29 Ağustos 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.

  • URL Rewriter
  • Router (Dispatcher)
  • Core
    • Config Management
    • Log Management & Debugging
    • Cache Management
      • Distributed Cache
      • Locale Cache
  • Controller
    • Filter
    • Workflow
  • Context
    • Culture
    • User
    • Request
    • Response
    • Session
  • View
    • Render
    • Template Engine
    • Tag Library
  • Model
    • ORM
    • Persistence
  • Plugin
    • Geolocation vb…
  • Tools (Extra)
    • Console Tool
      • Code Generator
      • Deployment
      • Builder
      • Documentation
    • Testing
    • Inversion of Control
    • Scaffolding
    • Scheduler
    • Authentication & Authorization
      • OAuth
      • LDAP
    • Client Side Library
      • Javascript (jQuery)
        • Cache
        • Cookie
        • Hotkeys
        • Lazy Including
        • Querystring
        • Comet
        • AJAX
      • CSS Frameworks
        • 960gs, Blueprint

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.

  • Listener: Uygulama deploy edildiğinde ve undeploy edildiğinde burası çalışır. Isteklerden bağımsız olarak çalıştırılması düşünülen alanlar için düşünülmüştür. Örneğin; görev tanımlı işler için kullanılabilir. Quartz isimli scheduler’ın listener sınıfları vardır. Cache mekanizması içinde bu alan düşünülebilir. Yine EhCache uygulamasınında listenerları bulunmaktadır.
  • Filter: Filter tüm Request, Response trafiğinin arasına giren adında anlaşılacağı üzere filtreleme işlevi gören sınıflardır. Filterlara örnek olarak, Spring Security, ve Url Rewrite verilebilir.
  • Servlet: Response’un yaratıldığı alandır. Bu nedenle bir MVC framework’te genelde burada Router (Dispatcher) sınıfı bulunmaktadır.

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.

Kategori
Etiket



Eğer yazıyı beğendiyseniz ya da ekleyecekleriniz varsa, lütfen yorumunuz yazın veya RSS aboneliği ile yeni yazılardan anında haberdar olun.

'Bir Web Çatısı (Framework) Anatomisi' için 13 Yorum

Burak Yüce
Ağustos 31, 2010

Bende java’da kullanmak için webçatısı araştırıyordum. Birde Seam Framework pek bir popüler şu sıralar. Sanırım zamanında Spring’in devirmiş olduğu bazı webçatıları gibi Seam’de Spring’i devirecek.

Peki ya sizin Seam hakkında bir görüşünüz var mı?

meddah
Ağustos 31, 2010

Aslında Seam ilk gördüğümde benim de çok ilgimi çekmişti. Özellikle şuradaki sunumu inceleyince, Java EE 6 teknolojileri ile entegre olması, arkasında JBoss gibi bir topluluk olması hepsi güzel. Belki Spring’in tahtını sallar. Ama gözlemlediğim kadarıyla Java developerlarının Spring’e duygusal bir bağı var. Hadi bunu geçiyorum, yeni yapılan projelerin bir çoğunda Spring ve Struts bilen eleman aranıyor. Google Trends’ten ve Indeed.com sitesinden kollektif yatırımı incelediğimde Spring’in halen birkaç yıl tahtının sallanmasının zor olduğunu düşünüyorum. Indeed sitesi üzerinden, Spring, Seam ve Struts ilanlarını incelerseniz, ne demek istediğimi daha iyi anlayacaksınız.

Seam, Java EE 6 kullanması ve yukarıda linkini paylaştığım sunum nedeniyle benimde ilgimi çekmişti. Ama yukarıda saydığım nedenlerle ve Spring’in doğru seçim olduğuna karar verdim. Belki yanılıyorumdur ama kollektif yatırımın bunu gerektirdiğini düşünüyorum. :)

G. Murat
Ağustos 31, 2010

Basarili guzel bir ozet olmus. Tek ekleyebilecegim eger Java teknolojilerinin Microsoft / ASP.Net karsiligi da verilmis olsa cok hos olurdu. Java dunyasinin disindakiler icin de konunun daha hizli anlasilmasini saglardi.

meddah
Ağustos 31, 2010

Aslında yazıya başlarken ASP.NET hakkında da yazmayı düşünüyordum. Ama sonra birden fazla farklı teknoloji hakkında yazınca, yazının çorbaya döndüğüne karar vererek, bu düşüncemden vazgeçtim. En azından bir kıyaslama tablosu olabilirdi belki. C# web developerları ALT.NET dünyasında konu ile ilgili projeleri edinebilirler. Araştırmaya başlamak için ise http://csharp-source.net/ güzel bir site. :)

Burak Yüce
Ağustos 31, 2010

@meddah, araştırmam da bende Google Trends’i kullanmıştım. Seam baya bir gerilerde görünüyordu ve halen de öyle. Fakat üzerinde durulması gereken bir konu gibi görünüyor. Zira araştırdığım kaynaklarda seam’in bazı üstün yönlerinden bahsediliyordu.

Öte yanda Spring’in popüleritesi ise fazlasıyla baskın ve her iki seçimde geliştiriciyi üzmeyecektir.

Son olarak akıcı ve bilgilendirici yazın için teşekkürler.

osman
Eylül 19, 2010

Merhaba, yazı ile ilgili benim ilgimi çeken kısım “distributed computing” ve “paralel programming” konularında Php’nin yapamadıkları oldu? Bu konu da örnek verebilir misiniz? Sizin Java’ya geçmeye zorlayan nedir?

Hasan Ozgan
Eylül 19, 2010

PHP’yi bırakma sebeplerimden biri yetersizliği değil. Bilakis bazı konularda javadan oldukça çevik olabiliyor. Ben tercihimin sebebi, enerjimi aynı altyapıya sahip araçlarda vermek istememden kaynaklanıyor. Distributed computing konularında Cassandra, Hadoop, Akka vb gibi teknolojilerin bir çoğu Java dili ile yazılmış durumda. Ayrıca performans olarakta Java, PHP’ten daha iyi verimli olduğu aşikar.

Cem GÜLER
Ekim 30, 2010

Merhaba,

Performans kelimesinden kastınız nedir? Mesela ben de artık PHP yazmıyorum ama Scala / Groovy gibi dillerin üretkenliği ve amaca yönelik yaklaşımları sayesinde artık neredeyse Java’da yazamaz oldum. Amaca yönelik yaklaşımlardan kastım ise bahsettiğim dillerin Java ya da PHP gibi işin etrafında dolandırmayıp üretilen kodun satır sayısını kendi ölçümlerime göre en az %25, hatta Scala’da neredeyse %60 azaltarak yazılımcının gerçekte verimini artırması, çöple, yazım hataları ile uğraştırmamalarıdır.
Diğer taraftan performansa bakacak olursanız, farklı kurulumlarda ve ihtiyaçlarda farklı değerler alacağınızı biliyorsunuzdur. Hani elde Facebook, FourSquare, LinkedIn, Twitter gibi case studyler var. Java ve PHP performansını neye göre değerlendirdiniz?

Hasan Ozgan
Ekim 31, 2010

Merhaba Cem, kesinlikle burada kastettiğim şey aslında makine ile ilgili performans süreci. Hiçbir optimizasyon olmaksızın iki dil kıyaslandığında (http://shootout.alioth.debian.org/u32/benchmark.php?test=all&lang=java&lang2=php) java daha performanslı çalışıyor. Geliştirme hızı ile ilgili olarak elbette PHP daha iyi olduğunu söyleyebilirim. Ama strict olmayan yapısı nedeniyle PHP’de kötü ellerde çok kötü sonuçlar verebilir. Ben gerçekten OOP prensiplerini ve tasarım kalıplarını ayrıca algoritmalar konusunu bilen PHP ve Java developerlarını kastediyorum.

Foursquare PHP’yi bırakıp Scala/Lift gibi bir aracı seçmesinde de performans konularının olduğunu düşünüyorum. Yukarıda saydığın tüm şirketler bir şekilde projelerinde Java kullanıyorlar. Google bile Python’dan sonra Java’ya sarıldı. PHP bence bir startup dili. Çünkü startuplar için performans önemli değildir. Fikirlerini çabuk hayata geçirmelidirler. Bu açıdan PHP biçilmiş kaftan. Ama sonrasında yeniden düşünmek lazım. FourSquare 3 ay gibi bir sürede tüm projeyi Scala ile yeniden yazdılar.

Ben Java’yı seçmemde başka nedenlerde var ama bence unutulmaması gereken hepsinin bir araç olduğu. Hangisini seçilmesi gerektiği elbette duruma göre değişiyor. Ama bilgisayar ortamının Şekpir’i olmak için bir dilde de uzmanlaşmak ve şiir gibi akıcı yazmak gerekiyor (:

Cem GÜLER
Ekim 31, 2010

Selam,

Evet Foursquare, Twitter ve LinkedIn genel olarak Scala ve Ruby kullanmakla beraber Facebook chat tarafında Erlang ve PHP altyapısında özetle kodun C++’a çevrilerek derlendiği HipHop çatısını kullanıyorlar. Yani aslında burada görmemiz gereken belki de bu noktalarda Java’nın ve saf PHP’nin de günümüz web uygulamalarında yetersiz kaldığı mıdır acaba? Yani “barebone” olmuyor mu bu iş? Hani “kurumsallık” kelimesini kullanmıyorum, o tarafta adımlar kolay kolay atılmaz. Adamlar hala geçen yüzyıldan kalma Struts üzerinde diretiyorlar ya da hala JSP’nin içerisine SQL sokuşturmaya çalışan deliler, hatta ERP datasını MySQL’de tutmaya çabalayan intihar komandoları falan bile var :)

Onur Özgür ÖZKAN
Mart 25, 2011

Merhaba,

Çok güzel bir yazı olmuş. Tebrik ederim.

Aslında dediğiniz gibi yapılacak işe göre araç seçmek çok mantıklı. Mesela biz geçen aya kadar bütün geliştirme süreçlerimizi PHP ile yapıyorduk. ZF, Doctrine, ExtJS kullanarak açık kaynaklı kendi geliştirme ortamımızı yarattık

Artık daha sürdürülebilir ve servis gibi işleyecek projeler yapmayı düşündüğümüzden Ruby ve Rails kullanmayı düşünüyoruz. Kendi aramızda bu konuyu sürekli tartışıyoruz. Tabii ERP vb projelerde olsaydık sanırım JAVA derdik. Belki hala da deriz. PHP, Ruby ve JAVA yı kıyaslayan çok güzel bir slayt var. http://www.tbray.org/talks/php.de.pdf

Benim öğrenmek istediğim PHP (özellikle Zend Framework) de olupda Rubyde özellikle ROR’u düşünerek olmayan birşey biliyor musunuz? Sizin deneyimlerinize göre özellikle geliştirme süreçleri ve sürdürülebilirlilik açısından PHP, Ruby ve JAVA artıları ve eksileri neler?
Neden Ruby değilde JAVA?

İyi Çalışmalar.

Hasan Ozgan
Mart 26, 2011

Merhaba Onur,

Aslında web dünyasında çevik olmak gerektiğine inanan birim. Java üzerinde uygulama geliştirmek gerçekten bazen çok hantal olabiliyor. Fakat twitter gibi çok fazla yük alan bir mimari geliştirmek söz konusu olduğunda java ve diğer jvm dillerinin önemi daha bir iyi anlaşılıyor. Web üzerinde uygulama geliştirirken ben tercihim java’nın gücünü arkasına alan Scala dilinden yana. Tüm büyük web şirketleri (Google, Facebook ve Twitter gibi) mutlaka projenin arka taraflarında Java kullanıyor. Ön tarafta ise PHP, Ruby gibi dilleri tercih edebilirler.

PHP kesinlikle Ruby’den daha performanslı çalışıyor. (Ruby’le uzun süredir ilgilenmiyorum belki birşeyler değişmiştir) PHP maalesef ruby gibi fonksiyonel paradigmalar ve OOP konusunda biraz geriden gelen bir dil. ROR’u ve PHP kodlamayı seviyorsan ROR’un PHP portu olan Symfony’i biliyorsundur. PHP bence düşündüğün projeyi hızlıca hayata geçirmek için çok iyi bir dil. Ama bilmeyen birinin elinde çok kötü işler çıkartılması mümkün. Her ne kadar PHP camiası birçok konuda alternatif çözümler üretsede bence biraz kirli bir dil. Kirlilikten kastım esnekliği ve dilin kütüphanesindeki isimlendirmeler falan. Ölçeklenebilirlik ve sağlam yapılar kurmak söz konusu olduğunda tercihimi Java’dan daha doğrusu Scala’dan yana kullanmayı tercih ettim. Scala’nın yazım biçimi Ruby’e benziyor. Ve fonksiyonel programlama paradigmalar gibi birçok işi gerçekten iyi yapıyor. Bu yeni topluluğun çok sağlam bir web çatısı da bulunuyor. Adı Lift olan bu framework bir MVC degil. Ama çok iyi özellikleri var. Kesinlikle bir göz atmakta fayda var.

Onur Özgür ÖZKAN
Mart 27, 2011

Tekrar Merhaba,

Scala dili ve Lift frameworkünü yüzeysel olarak inceledim. Gerçekten etkilendim. Şu an için bizim ihtiyacımız olan hemen hemen herşeyi kapsıyor gibi gözüküyor. Özellikle REST, ORM desteği olması çok iyi. Yalnız kaynakların azlığı da dikkat çekmiyor değil.

Detaylı bir araştırma yapmak hatta iki üç günlük ufak bir proje kodlayarak karar vermek gerekiyor.

İlginiz ve yönlendirmeniz için teşekkür ederim.

Yorum yapın