22. Sonuç
Bu belgede neler yaptığımızı özetleyelim. Aşağıdaki iki mimariden birini kullanarak iki [DAO] katmanını inceledik:
![]() |
![]() |
[DAO1] katmanı Spring JDBC ile, [DAO2] katmanı ise Spring JPA ile uygulanmıştır. [DAO1] ve [DAO2] katmanları aynı [IDAO] arayüzünü uyguluyordu; bu sayedeher iki katmanı da test etmek için tek bir [JUnitTestDao] testi yazmamızı sağladı;
Bunu yaptıktan sonra, [IDAO] arayüzünü web üzerinde şu şekilde yayınladık:
![]() |
- [1]'te, [IDAO] katmanı, Spring MVC tarafından uygulanan [2] web katmanı aracılığıyla web üzerinde yayınlandı. Gerçekten de [IDAO] arayüzü açığa çıkarılmıştır ve bu arayüzün [DAO-JDBC] veya [DAO-JPA-JDBC] mimarisiyle uygulanmasına bağlı olarak web hizmetinin iki sürümünü oluşturduk;
- [B]'te, bir uzak istemci, web hizmeti tarafından sunulan ve [IDAO-serveur] katmanındaki yöntemlere erişim sağlayan URL'i kullanır. [DAO-Client] ve [3] katmanlarının, [IDAO-serveur] ve [1] arayüzlerini uygulamasını sağladık. Bu sayede, daha önce iki kez kullanılmış olan aynı [JUnitTestDao] testini kullanabildik;
- [3]'te, [DAO-client] katmanı Spring RestTemplate ile uygulandı;
Bunu yaptıktan sonra, web hizmetine erişimi güvenli hale getirdik:
![]() |
- [5]'te, istemcinin HTTP isteği, Spring Security ile uygulanan bir kimlik doğrulama katmanından geçer;
Böylece, önceki mimariyi aşağıdaki mimariye dönüştürdük:
![]() |
- [3]'te, istemci uygulaması, [4] web sunucusu tarafından sunulan bir web uygulamasıdır. İstemci uygulaması, tarayıcıda güvenli web hizmetinin URL'lerini sorgulamaya olanak tanıyan bir [5] formu sunar. Güvenli web hizmetine HTTP erişimleri, JavaScript ile uygulanan bir [jS] katmanı aracılığıyla gerçekleştirilir. Bu mimari, "etki alanları arası istekler" olarak adlandırılan işlemleri uygular:
- web hizmeti, URL biçiminde [http://machine1:port1/]'leri sunar;
- istemci web uygulaması, URL [http://machine2:port2/] adresinden indirilir. Eğer [http://machine2:port2/], [http://machine1:port1/] ile aynı değilse (aynı makine, aynı bağlantı noktası), o zaman istemci tarayıcısı [DAO-client-js] katmanından gelen HTTP çağrılarını engelleyecektir. Bu sorunu gidermek için web hizmetinin etki alanları arası istekleri izin vermesi gerekir;
Sunulan projeler aşağıdaki altı veritabanıyla test edilmiştir:
- MySQL 5 Community Edition;
- SQL Server 2014 Express;
- PostgreSQL 9.4;
- Oracle Express 11g sürüm 2;
- IBM DB2 Express-C 10.5;
- Firebird 2.5.4;
Bu SGBD'lerin her biri için dört farklı [DAO] katmanı geliştirilmiştir:
- Spring ile uygulanan bir katman JDBC;
- Spring JPA ve Hibernate JPA sağlayıcısı ile uygulanan bir katman;
- Spring JPA ve JPA EclipseLink sağlayıcısı ile uygulanan bir katman;
- Spring ile uygulanan bir katman: JPA ve sağlayıcı JPA OpenJPA;
Böylece, yirmi dört farklı yapılandırma seti sunulmuştur. Faktörleştirme konusunda büyük çaba sarf ettik:
- kodun büyük bir kısmı yalnızca bir kez yazılmıştır. Bu, iki Maven yapılandırma projesine dayanmaktadır:
- biri JDBC katmanını yapılandırıyor;
- diğeri ise JPA katmanını yapılandırır;
![]() |
![]() |
Belirli bir SGBD'e ait JDBC [1] katmanının Maven yapılandırma projesi şunları sağlar:
- JDBC sürücü arşivini içe aktarmak;
- kullanılan veritabanına erişim kimlik bilgilerini ve SQL katmanının JDBC sürücüsüne göndereceği çeşitli komutları tanımlamak. SQL standartlaştırılmış olsa da, esas olarak sorgularda bulunan ve bazı SGBD'lerde yasaklanmış anahtar kelimeler olduğu ortaya çıkan tablo/sütun adları nedeniyle taşınabilirlik sorunları yaşandı (DB2 için ROLES tablosu, Firebird için PASSWORD sütunu). Ayrıca, bir sütun adı normalde büyük/küçük harf duyarlı olmasa da, PostgreSQL'te tabloların birincil anahtarındaki ID sütunuyla ilgili bir sorunla karşılaşıldı. Sistem, bu sütunun adının küçük harflerle id olarak yazılmasını istedi;
Belirli bir SGBD'e ait JPA ve [2] katmanlarının üç Maven yapılandırma projesi şunları sağlar:
- JPA uygulama arşivini içe aktarmak;
- bağlı olan belirli SGBD için kullanılan JPA uygulamasını yapılandırmak. Aslında, SQL komutlarını JDBC katmanına gönderen JPA katmanıdır. Etkili olabilmesi için, SGBD'i tanımalı ve ona tanıyacağı SQL komutlarını göndermelidir. Bu komutlar, bu SGBD'in sahibi olan SQL'i ve bunun özel özelliklerini (veri türleri, diziler, tetikleyiciler, prosedürler, birincil anahtarların otomatik oluşturulması vb.) kullanabilir;
Böylece, veritabanını kullanan diğer tüm projelerin dayandığı yirmi dört Maven yapılandırma projesi (4 yapılandırma x 6 SGBD) oluşturulmuştur. Yukarıdaki şemalarda, [DAO1] ve [DAO2] katmanları aynı arayüzü sunduğundan, yukarıdaki iki mimarinin 24 yapılandırması tek bir test sınıfı olan [JUnitTestDao] ile test edildi. Bu mimariler doğrulandıktan sonra herhangi bir sorun yaşanmadı:
- veritabanını web üzerinde yayınlamaya yönelik Maven projesi bu iki mimariye dayanmaktadır. Dolayısıyla burada da 24 olası yapılandırma mevcuttur;
- web hizmetine erişimi güvenli hale getirme amaçlı Maven projesi, önceki projeye dayanmaktadır ve bu projede de 24 olası yapılandırma bulunmaktadır;
- son olarak, güvenli web hizmetine etki alanları arası istekleri mümkün kılan Maven projesi, önceki projeye dayanmaktadır ve bu projede de 24 olası yapılandırma bulunmaktadır;
Bu belge, Java dilinin tüm yeteneklerini veya uygulama alanlarını kapsamasa da, dil öğrenimi için bir kaynak olarak kullanılabilir. Bu dersin içeriğini özümsemiş olan okuyucu, hem dilin hem de Spring çerçevesinin kullanımında “ileri düzey Java” seviyesine ulaşmış olacaktır. Ardından, aşağıdaki kitaplarla Java eğitimine devam edebilir:
- [Spring MVC et Thymeleaf par l'exemple] [http://tahe.developpez.com/java/springmvc-thymeleaf], Spring ekosistemine ilişkin öğrenmeyi, 'web programlama' dalını (MVC) tanıtarak sürdürür. Bu kitap, burada incelenen veritabanından daha karmaşık bir veritabanı kullanır;
- [Tutoriel AngularJS / Spring MVC] [http://tahe.developpez.com/angularjs-spring4], istemcinin [AngularJS] çerçevesiyle, sunucunun ise [Spring MVC] ile uygulandığı bir istemci/sunucu web mimarisini sunar;
- [Introduction à Java EE] [http://tahe.developpez.com/java/javaee], Spring dünyasından ayrılıp JSF (Java Server Faces) ve EJB (Enterprise Java Bean) tabanlı bir web mimarisine geçmektedir;
- [Introduction à la programmation des tablettes Android] [http://tahe.developpez.com/android/exemples-intellij-aa]; bu belge, istemcinin Java ile programlanmış bir Android tablet, sunucunun ise Spring ile uygulanan bir web hizmeti olduğu bir istemci/sunucu mimarisini açıklamaktadır MVC;






