Temel Spring Framework Eğitimi

Java Framework

Herkese merhaba, yakın bir süre önce Spring öğrenmeye başladım ve konuları yazarak çalışıyordum. Bu süre zarfında Medium platformunda daha önceden Spring için yazılmış kapsamlı (olmasa da olur) bir Türkçe eğitim serisi var mı diye küçük bir araştırma yaptım. Tahmin ettiğim gibi yok! Java dünyasında Türkçe doküman bulmak zaten güç ama yine de bir umut, burayı da kurcalamak istedim. Spring ve Spring Boot hakkında spesifik güzel yazılar mevcut ancak genelde güncel konular veya örnek kullanımlar hakkında, temel konulardan oluşan bir seri ise henüz yok. Medium Türkçe’nin 2014 yılında yayın hayatına başladığını düşünürsek bu durum normal karşılanabilir fakat şunu da fark ettim ki bu en kötüsü, bazı çok değerli ve öz bilgiler içeren yazılar da yazarın etiketleri (tag’leri) etkili veya hiç kullanmadığı için arada kaynayıp gidiyor maalesef. Tüm bunların etkisi ve elbette elle yazmanın yorucu olmasından dolayı notlarımı daha detaylı hale getirip Medium’a taşımaya karar verdim. Spring Framework için İngilizce kaynaklar bir hayli fazla ancak bu eğitim serisinde müfredat olarak kullanacağım tutorialspointde bile bazı konular bana üstünkörü veya herkesin ilk okuduğunda sektörde beş yıldır çalışan bir developer gibi, şak diye anlayacağı sanılarak yazılmış gibi geldi. Bu durum açıkçası canımı sıktı. Neyse ki İngilizce bilgim araştırma yapabilecek kadar yeterli :) Eğitim serisinde bu bahsettiğim konuları farklı kaynaklardan da araştırarak daha anlaşılır bir şekilde anlatmaya çalışacağım ve her kaynağı bölüm sonuna ekleyeceğim. Kendim de bu seriyi öğrenerek hazırladığım için herhangi bir kavram kargaşası oluşması durumunda veya artık kullanılmayan (deprecated) ifadeleri yorumlarda belirtirseniz herkes öğrenmiş olur.

Bu arada çeviri yapmak İngilizce gelişimi için oldukça faydalıdır bu nedenle siz de çeviri yaparak hem kendinize hem de Türkçe kaynakların gelişimine katkıda bulunabilirsiniz.

Konu başlıkları aşağıdaki sıraya göre işlenecektir, başlıklar güncellenebilir veya alt başlıklara ayrılabilir:

Bu uzun giriş yazısından sonra Spring’e giriş yapalım.

Spring Framework Nedir?

Framework (Çatı), yazılım geliştiricilerin kullandığı önceden hazırlanmış standart (sık kullanılan) kütüphanelerin bulunduğu ve bunlara yenilerinin de eklenebildiği yapıların adıdır.

Spring kurumsal Java (JEE) için kullanılan performanslı, hafif (lightweight) ve modüler yapıda hazırlanmış açık kaynak kodlu (open source) bir uygulama geliştirme çatısıdır. Bir bakıma “framework of frameworks” olarak da ifade edilebilir çünkü Spring, pek çok framework’ü destekler: Hibernate, EJB, JSF, loglama framework’leri vb. framework’ler buna örnektir.

Spring Framework’ün başlıca yazarı Rod Johnson’dır ve Apache 2.0 lisanslı olarak Haziran 2003'de ilk sürümü yayımlanmıştır. Spring’in (Bahar) anlamı geleneksel J2EE kışının (Winter) ardından gelen yeni bir başlangıçtır.

Spring Framework, gerçek zamanlı bir Java uygulamasının tüm katmanlarını geliştirmede olduğu gibi aynı zamanda, sadece belirli katmanları geliştirebilmek için de kapsamlı bir araçtır. Core (temel) özellikleri, herhangi bir Java uygulaması geliştirmede kullanılabilir ancak Java EE platformu üzerinde web uygulamaları geliştirebilmek için Spring’in diğer uzantılarını da (modül) kullanmamız gerekir. Bu arada Spring’in .NET için de geliştirilmiş bir araç olduğunu söylemekte fayda var ancak bu eğitimde Java programlama dili ile olan ilişkisi işlenecektir.

Spring Framework’ün başlangıcından günümüze birçok sürümü yayımlanmıştır bu eğitim için “spring-5.2.8.RELEASE” sürümü kullanılmıştır. Sürüm gerektiği durumda güncellenebilir.

Spring Framework’ün popüler olmasında başlıca üç neden vardır:

  • Simplicity (Basitlik): Spring Framework POJO ve POJI modellerini kullandığı için basittir, invasive (işgalci) değildir. Spring POJO kullanarak, geliştiricilerin kurumsal sınıf uygulamaları geliştirebilmesini sağlar. POJO kullanmanın yarar ise EJB container’ında olduğu gibi bir uygulama sunucusuna (application server) ihtiyaç duymamasıdır ancak Tomcat veya bazı ticari markaların güçlü servlet container’larını kullanabilirsiniz.

POJO (Plain Old Java Object): Herhangi bir teknoloji veya framework’e bağlı olmayan Java sınıfıdır.

POJI (Plain Old Java Interface): Herhangi bir teknoloji veya framework’e bağlı olmayan Java arayüzüdür.

Non-invasive: Framework, Spring’in aksine bir sınıfı kendi sınıflarını extend etmeye veya arayüzlerini (interface) implemente (Türkçe’de böyle bir kelime yok bu arada) etmeye zorluyorsa bu framework invasive’dir. Spring sizi asla kendisine özgü bir sınıfı miras almaya veya kendisine özgü arayüzü implemente etmeye zorlamaz.

  • Testability (Test Edilebilirlik): Spring uygulaması yazarken server zorunlu değildir ancak bir EJB uygulaması test etmek için server gereklidir. Test sırasında kaynak kod üzerinde pek çok değişiklik yapmak gerekebilir ve bu değişiklikleri görüntüleyebilmek için her seferinde server’ı tekrar başlatmamız gerekir. Spring Framework’de ise uygulama Spring’in kendi container’ı aracılığı ile çalıştırılır ve POJO tarzında hazırlanan Java bean’ler ile veri enjeksiyonu yapılarak bağımlılık ortadan kaldırılır böylece kodun test edilmesi kolaylaşır.
  • Loose Coupling (Gevşek Bağlama): Spring Framework’de AOP ve bir Inversion Of Control (IoC) tekniği (uygulaması) olan Dependency Injection gibi konseptler sayesinde kod içi bağımlılık (dependency) azalırken modülerlik artar.

Spring Framework’ün Diğer Özellikleri

Lightweight (Hafiflik): EJB container’larına kıyasla Spring’in IoC container’ları daha hafiftir. Bu özelliği, bellek ve CPU bakımından kısıtlı kaynaklara sahip bilgisayarlar üzerinde geliştirme veya dağıtım (deploying) yaparken önem arz eder.

Modularity (Modülerlik): Spring modüler bir yapıda organize edilmiştir. İhtiyacınıza göre gerekli olan modülü kullanıp geri kalanı kullanmamak sizin tercihinizdir.

Container: Spring Framework uygulama nesnelerini (beans) oluşturur ve yaşam döngülerini kontrol eder.

Web MVC: Spring’in iyi tasarlanmış Web MVC framework’ü, Struts veya aşırı mühendislik gerektiren ya da daha az popüler olan diğer web framework’lerine iyi bir alternatiftir. Bu çatı interface’ler ile yapılandırılabilir ve birden çok görünüm teknolojisini (view technology) barındırır.

Central Exception Handling (Merkezi Hata Yönetimi): Spring teknolojiye özgü exception’ları (JDBC, Hibernate veya JDO tarafından fırlatılan) tutarlı ve unchecked exception’lara dönüştüren uygun bir API sağlar.

Transaction Management (İşlem Yönetimi): Her veri erişim teknolojisi için transaction yönetimi farklılık gösterir. Spring değişik veri erişim yöntemlerini aynı anda kullanmayı sağlayan ortak bir transaction yönetim API’sine sahiptir.

Java ve Spring Arasındaki Fark Nedir?

Java Vs Spring Table

Spring’in popülaritesi ilk yayımından günümüze pek çok alana yayıldı ve Spring Framework şu an diğer Spring Projelerini üstlenen bir kuruluş (foundation) haline geldi. Spring tarafından üstlenilen projeler aşağıdaki görselde incelenebilir.

Diagram is taken from edureka!

Spring Framework Mimarisi

Spring mimarisi, farklı modüller içeren katmanlara bölünmüştür. Bu modüller uygulama yazarken kullanabileceğimiz farklı işlevselliğe sahiptir. Genel olarak: Core Container, Data Access/Integration, Web, AOP, Instrumentation ve Test başlıkları altında toplanan yaklaşık 20 modülden oluşur.

Spring modülleri başka framework’ler ile de kolaylıkla entegre şekilde kullanılabilir burada geliştirici gerek gördüğü herhangi bir modülü seçmekte özgürdür ancak core container modülü zorunlu seçilmesi gereken bir modüldür çünkü diğer modüller bu modül üzerine inşa edilir.

Spring Framework’ü kurumsal uygulamalar için bir alışveriş merkezi olarak düşünebiliriz. Şimdi bu modülleri inceleyelim:

Spring Architecture

Spring Framework Modülleri

1- Core Container

Core: Bu modül Spring Framework’ün çekirdeğidir. Singleton tasarım prensibi ile IoC (Kontrolün Framework’e Evrilmesi) ve Dependency Injection (Bağımlılık Enjeksiyonu) özelliklerinin uygulanmasını sağlar.

Bean: Bu modül BeanFactory vasıtasıyla factroy design pattern’in (fabrika tasarım deseninin) uygulanmasını (implementation) sağlar.

Context: Core ve Bean modüllerinin sağladığı sağlam bir temel üzerine inşa edilmiştir. Bu modül, tanımlı ve yapılandırılmış herhangi bir nesneye (bean) ulaşmak için aracılık eder. ApplicationContext interface’i bu modülün odak noktasıdır.

Spring Expression Languages (SpEL): Bu modül, Java Sunucu Sayfaları (JSP) tarafından desteklenen expression language’in (ifade dilinin) bir uzantısıdır. Çalışma zamanında (runtime) bir nesne grafiğini (object graph) sorgulamak ve değiştirmek için güçlü bir expression language sağlar.

2- Spring Data Access/ Integration

JDBC: Bu modül tekrarlanan ve gereksiz hata yönetimi yükünü (overhead) ortadan kaldıran, JDBC soyutlama (abstraction) katmanı sağlar.

ORM: ORM’in açılımı Object Relational Mapping’dir. Bu modül; JPA, Hibernate, JDO ve iBatis gibi popüler nesne-ilişkisel eşleştirme API’leri için entegrasyon katmanları sağlar. ORM hakkında daha fazla bilgiyi bu yazımda bulabilirsiniz.

OXM: OXM’in açılımı Object XML Mappers’dır. Nesneleri XML formatına çevirmek veya bu işlemin tersini gerçekleştirmek için kullanılır. Spring, Nesne/XML eşleşmesi yapan: JAXB, Castor, XMLBeans, JiBX ve XStream gibi framework’ler için bir soyutlama katmanı sağlar.

JMS: JMS’in açılımı Java Messaging Service’dir. Bu modül çeşitli istemciler arasında mesaj göndermeyi ve almayı sağlamak için özellikler barındırır.

Transaction: Bu modül tüm POJO sınıflarınız ve belirli interface’leri implemente eden sınıflar için programlı (programmatic) ve bildirimsel (declarative) transaction yönetimini destekler. Tüm kurumsal düzeydeki transation uygulama konseptleri, bu modül ile Spring’e uygulanabilir.

3- Spring Web

Web: Servlet dinleyicileri (listeners) ve web odaklı (oriented) application context kullanan bu modül, çok parçalı dosya yükleme işlevi ve IoC container’ını başlatma gibi temel web odaklı entegrasyon özellikleri sağlar.

Web-Servlet: Bu modül, web uygulamaları için Model-View-Controller (MVC) tabanlı uygulamalar (implementations) içerir. UI (User Interface) etiketleri ve veri doğrulamaların (data validation) da içinde olduğu MVC özellikleri sağlar.

Web-Socket: Bu modül, istemci ve sunucu arasında WebSocket ve iki yönlü (two-way) iletişim için destek sağlar.

Web-Portlet: Bu modül Spring MVC Portlet modülü olarak da bilinir. Spring tabanlı portletler için destek sağlar ve Web-Servlet modülünün işlevselliğini yansıtır.

4-Diğerleri (Miscellaneous)

Aspect-Oriented Programlama (AOP)
Türkçe karşılığı Cephe Yönelimli Programlama dır. AOP uygulamanıza transaction ve güvenlik gibi kurumsal işlevsellik kazandırmanıza izin veren güçlü bir araçtır. Daha az kod yazmanıza ve kodunuzu mantıklara ayırmanızı sağlar ve cross-cutting concern’leri (kesişen kaygılar) kullanır.

Aspects
Bu modül, güçlü ve olgun (mature) AOP framework’ü olan AspectJ ile entegrasyon sağlar.

Instrumentation
Bu modül, belirli uygulama sunucularında kullanılan sınıf araçları (instrumentation) desteği ve sınıf yükleyicisi (classloader) uygulamaları (implementations) sağlar.

Messaging
Uygulamalarda kullanılmak üzere WebSocket alt protokolü olarak STOMP’a (Streaming Text Oriented Messaging Protocol) destek sağlar. Ayrıca, WebSocket istemcilerinden STOMP mesajlarının yönlendirilmesi ve işlenmesi için bir annotation programlama modeli destekler.

Test
Bu modül, Spring bileşenlerinin JUnit veya TestNG ile test edilmesini sağar. Spring ApplicationContext’in tutarlı bir şekilde yüklenmesini ve bu bağlamların (contexts) önbelleğe alınmasını sağlar. Kodumuzu izole bir şekilde test edebilmemiz için kullanabileceğimiz sahte nesneler (mock objects) üretir.

Dependency Injection (DI) Nedir?

Spring Framework denince akla gelen ilk özellik bir Inversion of Control (IoC) uygulaması (tekniği) olan Dependency Injection’dır. Inversion of Control farklı yöntemlerle uygulanabilen genel bir konsepttir. Dependency Injection IoC konseptinin sadece somut bir örneğidir.

Spring ile ilgili daha önce araştırma veya çalışma yapmış arkadaşlar bu örneği onlarca kez okumuş olabilirler ancak ben yine de ilk kez bu eğitimde tanışmış olanlar için aynı örneği vereceğim.

Dependency’nin (Bağımlılık) yazılım sektöründeki karşılığı, iki sınıf arasındaki ilişkidir. A sınıfı B sınıfına bağımlı olsun. Injection’ın (Enjeksiyon) anlamı ise A sınıfının B’ye olan bağımlılığının IoC container’ı tarafından enjekte edilmesidir.

Bağımlılık Enjeksiyonu Spring Framework’ün kalbidir ve enjeksiyon işlemi constructor’a parametre geçirerek veya setter mettotları kullanarak gerçekleştirilebilir.

Spring geniş bir framework ve farklı konular için farklı modüllere sahiptir. Tüm bu modülleri ezbere bir şekilde öğrenmeye çalışmak zaman kaybından başka bir şey olmaz. Ben bu süreçte çeşitli kaynakları referans alarak temel seviyede bilinmesi gereken modülleri öğrenip edindiğim bilgileri bu platformda yayımlamaya çalışacağım ancak ilgi alanınıza göre diğer modülleri de detaylıca araştırıp hangi modülün yapmak istediğiniz proje için daha uygun olacağına, sektörde yaygın olarak kullanılıp kullanılmadığına (bunu iş ilanlarını takip ederek veya stackoverflow gibi forumlara danışarak öğrenebilirsiniz) veya bu proje için daha iyi bir framework’ün olup olmadığına karar vermek sizin tercihiniz olacaktır.

Bahsedilen konseptleri ilerleyen bölümlerde ilgili örnekler ile daha iyi bir şekilde anlatmaya çalışacağım. Görüş ve önerilerinize açığım sonraki yazıda görüşmek üzere.

Yararlandığım Kaynaklar:

Pamukkale University, CENG | Java

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store