Sansür, bir toplumun kendine olan güvensizliğini yansıtır ve otoriter rejimlerin belirgin bir özelliğidir.

--Potter Stewart

13.08.2008

POJO vs. EJB 3.0

POJO ve EJB, Java EE geliştiriminde tercih edilen iki ayrı programlama modeli. Bu iki teknoloji, EJB 3.0'ın öğrenilmesi zor ve karmışık programlama modelini terkederek POJO tabanlı bir model seçmesiyle aynı eksende ilerleyecek gibi duruyor. Ama hala göz ardı edilemeyecek farklılıklar mevcut. POJO programlama modelini temel alan Spring çatısını kendine örnek alan EJB ile POJO'yu kıyaslarken elde ettiğim sonuçları özetlemeye çalıştım:


POJO

EJB 3

Basitlik

Mimarinin geliştiriminde göz önünde tutulan nesne yönelimli ilkeler sayesinde öğrenilmesi ve kullanılması kolay bir yapıya sahip. Basitlik ve tutarlılık ön planda.

Getirdiği mimari artılarına karşın EJB 1.0 sürümünden bu yana değişen programlama modeli ve öğrenim maliyeti projeler için dezavantaj oluşturuyor.

Test Edilebilirlik

POJO yapısı sayesinde Bağımlılık aktarımı (Dependency Injection) örüntüsü kullanılarak bileşenlerin kolay ve hızlı test edilebilirliğine imkan sağlıyor. Testler containerdan bağımsız yapılabiliyor.

Bağımlılık aktarımının sadece JNDI nesneleri ile yapılabilmesi, Session ve message-driven beanlerinin POJO olmalarına rağmen EJB Container’a ihtiyaç duymaları sebebiyle test edilebilirlik kısıtlanıyor. Bu da geliştirim sürecini olumsuz etkiliyor.

Geliştirim Ortamı

Tomcat gibi hafif (lightweight) containerlarla geliştirilen web uygulaması hızlıca çalıştırılabiliyor.

Geliştirilen uygulamanın çalıştırılabilmesi için ağır uygulama sunucularına ihtiyaç duyuyor. Projenin ihtiyaç duymadığı özellikler de uygulama sunucusu ile ayağa kaldırılıyor.

Collections Desteği

Hibernate çatısı ile persistence katmanında Set<String>, Set<Integer> gibi entity beanlerden oluşmayan collectionlara doğrudan destek sağlıyor.

Persistence katmanında sadece entity beanleri için collection desteği sağlıyor. Set<String>, Set<Integer> gibi collectionlara doğrudan destek sağlamıyor.

Konfigürasyon

Spring Bean configuration dosyalarına ihtiyaç duyuyor. Annotation desteği sunuyor.

Spring Bean configuration dosyalarından daha karmaşık bir yapıya sahip EJB descriptor dosyalarına ihtiyaç duyuyor. Annotation desteği sunuyor.

Persistence API

Kendine ait bir persistence api olmamasına karşın Template örüntüsü ile desteklenen; Hibernate, Ibatis, JPA gibi popüler çatılarla ve JDBC ile kolayca entegrasyona izin veren bir mimari sağlıyor.

EJB 3 ile Entity beanlerin yerini Hibernate, Toplink, JDO gibi persistence API’lerden devşirilen JPA belirtimi alıyor. Belirtim olması sebebiyle belirtimin yetersiz kaldığı yerlerde geliştirim sağlayıcısına bağımlı kalınabilmektedir.

Transactions

Dağıtık transaction mimarisini JTA ile destekliyor. Spring AOP çatısı ile annotationlar kullanılarak 7 farklı Propagation-bazlı transaction tanımlanabiliyor. Transactionlar XML konfigürasyon dosyalarında ya da aspect yaklaşım kullanılarak tanımlanıyor. Spring JDBX, Hibernate ve JTA ile entegre olabiliyor.

Dağıtık transaction mimari geliştirimine olanak sağlıyor. Session beanlerin tüm public metodlarına transaction mantığı otomatik olarak uygulanıyor. Annotation tabanlı bir transaction yönetimi bulunuyor. Sadece JTA’yı destekliyor. JTA Tomcat gibi hafif containerlarda çalışmıyor.

Güvenlik

ACEGI güvenlik çatısıyla hem nesne method çağrımı hem de HTTP istemlerinde doğrulama ve yetkilendirme yapılabiliyor. Rol-bazlının yanı sıra ACL-bazlı yetkilendirme de sağlıyor. Uygulama sunucusundan bağımsız standart bir güvenlik katmanı sağlıyor.

Tanımlı method-düzeyi rol-bazlı yetkilendirme, programatik rol belirleme özelliklerine sahip. EJB belirtiminin yeterli olmaması sebebiyle, güvenlik gerçekleştirimini uygulama sunucusuna bırakıyor. Böylece güvenlik katmanı uygulama sunucuna bağımlı hale geliyor.
















































Summation of Persistence Comparison Between Spring and EJB 3.0.

Feature

Spring

EJB 3.0

Simple ORM Persistence

Implementation

Hibernate, JPA, JDO, TopLink, iBatis

JPA (providers include Hibernate, Kodo and Toplink)

JDBC Support

--

Mapping

XML, Annotations

Annotations, XML

Cache Propagation

Thread local

Transaction

Extended cache scoping

Open session in view

Extended persistence context


Equivalent Transaction Management Functionality in Both Spring and EJB 3.0.

Feature

Spring

EJB 3.0

Declarative Transactions

Programmatic Transactions

Demarcation

AOP

Session bean methods

Supported Transaction Types

JDBC, Hibernate, JTA

JTA

Support for Distributed Transactions

(With JTA)

Configuration

XML

Transactional by default, override with annotations or XML


Teknolojilerin Google Trend’ten elde edilen yıllara göre arama sonuçlarının karşılaştırma tabloları:

ejb

Frame2

1.00

pojo

Frame3

0.16



ejb

Frame4

1.00


hibernate

Frame5

1.84

jpa

Frame6

0.24



Sonuç olarak Java EE uygulamalarda EJB'nin tercih edilmesini gerektirecek tek durum dağıtık transaction yönetimi ihtiyacı. POJO (dolayısıyla Spring) bu ihtiyaca karşılık veremiyor. Bunun dışındaki senaryolarda değişen trendler de göz önüne alınarak POJO programlama modelini temel alan çözümlerin (Spring, Hibernate, vs.) (EJB 3.0 gibi kopyalarının yerine :) ) seçilmemesinde hiç bir neden yok.

Kaynaklar