Spring Framework Nedir? - Spring Ekosistemi

Spring Framework, Java ekosisteminin parçası olan bir application framework'tür. Application framework ise, bir uygulama geliştirebilmek için temel yapı sağlayan işlevlerin toplandığı bir kümedir. Bir application framework, tüm program kodunu sıfırdan yazma çabasını ortadan kaldırarak uygulama yazma çabasını ve aşamalarını kolaylaştırır.

Spring'i günümüzde büyük backend çözümlerinden otomasyon test uygulamalarına kadar birçok türde uygulamanın geliştirilmesinde kullanıyoruz. Java teknolojileri hakkındaki birçok anket raporuna göre* Spring en çok kullanılan Java frameworküdür.

2020 Java Technology Report | JRebel by Perforce
In our 2020 Java technology report, we look at results of our 2020 Java developer survey related to technology choice. The survey gained nearly 400 responses from Java development professionals around the globe.

Spring ankette de göreceğiniz gibi oldukça popüler bir frameworktür ve geliştiriciler Java'dan başka JVM dilleriyle de Spring frameworkü oldukça sık kullanmaya başladılar. Son birkaç yılda, Spring'i Kotlin (JVM ailesinden bir başka dil) ile kullanan geliştiricilerde etkileyici bir büyüme gözlemleniyor.

Bu yazıda, Spring'in temellerine odaklanacağız ve size Spring'i gerçek dünya örneklerinde kullanmak için gerekli becerileri anlatmaya çalışacağız. Konuyu sizin için daha rahat hale getirmek ve Spring'e odaklanmanızı sağlamak için sadece Java örneklerini kullanacağız. Fakat Spring frameworkü anlamak için öncelikle application frameworkün ne olduğunu iyice sindirelim.


1. Application Framework Nedir ve Neden Kullanmalıyız?

Application framework, uygulamalarımızı oluşturabilmek için ihtiyaç duyduğumuz fonksiyonların toplandığı bir kümedir. Application framework, bize uygulamalar oluşturmak için kullanabileceğimiz geniş bir araç ve işlevsellik seti sağlar. Fakat frameworkün sunduğu tüm özellikleri kullanmanıza gerek yoktur. Yaptığınız uygulamanın gereksinimlerine bağlı olarak, frameworkün kullanılacak doğru kısımlarını seçebilirsiniz.

Application framework için güzel ve açıklayıcı bir benzetme yapabiliriz. Hiç Ikea gibi bir yapı marketlerden bir mobilya aldınız mı? Diyelim ki bir gardırop satın alacaksınız fakat bu gardırop birleştirilmiş bir halde değil ve sadece onu inşa edebilmek için ihtiyacınız olan doğru bileşenler ile mobilya parçalarını nasıl monte edeceğinize dair bir kılavuza ihtiyacınız var. Şimdi bu gardıropu sipariş ettiğinizi düşünün, ancak yalnızca ihtiyacınız olan doğru bileşenleri almak yerine, herhangi bir mobilyayı monte etmek için kullanabileceğiniz tüm olası bileşenleri de gönderdiler: bir masa, sehpa, gardırop vb. Siz bir gardırop istiyorsanız, doğru parçaları bulmanız ve birleştirmeniz gerekir. İşte tam bu şey bir application framework gibidir. Application framework, uygulamanızı oluşturmak için ihtiyaç duyduğunuz çeşitli yazılım parçalarını size sunar. Doğru sonuca ulaşmak için hangi özellikleri seçeceğinizi ve bunları nasıl birleştireceğinizi bilmeniz gerekir (şekil 1.1).

Elinizde sadece bir gardırop için değil, bir çok ürün oluşturabilecek parçalar olduğunu hayal edin

Şekil 1.1 UAssemble mağazasından bir gardırop sipariş ettiniz. Ancak mağaza (framework) size (programcı) yalnızca yeni gardırobunuzu (uygulama) oluşturmak için ihtiyaç duyduğu bileşenleri (yazılım yetenekleri) sağlamaz. Aksine, gardırobunuzu inşa etmeniz için ihtiyaç duyabileceğiz tüm olası parçaları size sunar. Hangi bileşenlerin (yazılım yetenekleri) doğru olduğu ve doğru sonucu (uygulama) elde etmek için bunların nasıl birleştirileceğiniz sizin (programcı) seçiminizdir.

Framework fikri yeni değildir. Yazılım geliştirme tarihi boyunca programcılar, birden fazla uygulamada yazdıkları kodun bazı bölümlerini yeniden kullanabileceklerini gözlemlediler. Başlangıçta, çok fazla uygulama mevcut olmadığından, her uygulama benzersizdi ve belirli bir programlama dili kullanılarak sıfırdan geliştirildi. Yazılım geliştirme alanı genişledikçe ve piyasada daha fazla uygulama yayınlanmaya başladığında, bu uygulamaların birçoğunun benzer gereksinimleri olduğunu gözlemlemek daha kolay hale geldi. Bunlardan birkaçına örnek verelim:

  • Hata, uyarı ve bilmi mesajlarını loglamak her uygulamanın ihtiyacıdır
  • Çoğu uygulama, veri değişikliklerini işlemek için transaction kullanır. Transaction'lar, veri tutarlılığına özen gösteren önemli bir mekanizmayı temsil eder.
  • Çoğu uygulama, aynı yaygın güvenlik açıklarına karşı koruma mekanizmaları kullanır.
  • Çoğu uygulama, birbirleriyle iletişim kurmak için benzer yollar kullanır.
  • Çoğu uygulama, performanslarını artırmak için cacheleme veya veri sıkıştırma gibi benzer mekanizmalar kullanır.

Bu liste uzayıp devam eder. Bir uygulamada uygulanan business logic koduna odaklanmanız daha efektiftir ve costu bu listedeki gibi ortak mekanizmalardan (diğer adıyla plumbing) önemli ölçüde daha küçüktür.

Business Logic” dediğimde, uygulamanın iş gereksinimlerini gerçekleştiren kodu kastediyorum. Bu kod, bir uygulamada kullanıcının beklentilerini uygulayan şeydir. Örneğin, "belirli bir bağlantıya tıklamak bir fatura oluşturacaktır", kullanıcıların olmasını beklediği bir şeydir. Geliştirdiğiniz uygulamanın bazı kodları bu işlevi uygular ve kodun bu kısmı geliştiricilerin business logic kod dediği şeydir. Bununla birlikte, herhangi bir uygulama business logic yanında birçok bileşene daha sahiptir; güvenlik, log, data consistecy vb (şekil 1.2).

Business logic, buzdağının sadece görünen kısmıdır.

Şekil 1.2 Kullanıcının bakış açısı bir buzdağını görüntülemeye benzer. Kullanıcılar esas olarak business logic kodunun sonuçlarını gözlemler, ancak bu, uygulamanın tam işlevselliğini oluşturan şeyin yalnızca küçük bir kısmıdır. Çoğunlukla su altında kalan ve görünmeyen bir buzdağı gibi, bir kurumsal uygulamada kodun çoğunu görmüyoruz çünkü bu, bağımlılıklar tarafından sağlanıyor.

Ayrıca, bir uygulamayı işlevsellik açısından diğerlerinden farklı kılan şey business logic kodudur. Araç paylaşım sistemi ve sosyal ağ uygulaması gibi iki farklı uygulama alırsanız, bunların farklı kullanım durumları vardır.

Bu iki farklı uygulamada farklı eylemler gerçekleştirirsiniz, ancak her ikisinin de veri depolamaya, veri aktarımına, log kaydetmeye, güvenlik yapılandırmalarına, muhtemelen önbelleğe almaya vb. ihtiyacı vardır. Çeşitli uygulamalar bu business logic dışı uygulamaları yeniden kullanabilir. Çünkü her seferinde aynı işlevleri yeniden yazmak tabiki de hiç verimli değildir:

  • Bir şeyi kendiniz baştan geliştirmek yerine yeniden kullanarak çok zaman ve para kazanırsınız.
  • Pek çok uygulamanın halihazırda kullandığı mevcut bir uygulamanın, diğerlerinin test ettiği gibi, hata oluşturma şansı daha azdır.
  • Bir topluluğun tavsiyelerinden yararlanıyorsunuz çünkü artık aynı işlevi anlayan çok sayıda geliştiriciniz var. Kendi kodunuzu uygulamış olsaydınız, bunu yalnızca birkaç kişi bilirdi.

Bu ve benzeri birçok sebep yüzünden framework kullanmak sizi çok daha avantajlı konuma getirecektir.


2. Spring Ekosistemi

Spring'i çoğu kişi sadece bir framework olarak adlandırıyor, ancak o bir frameworkten çok daha büyüktür. Spring oldukça büyük bir ekosistemdir. Spring ekosistemi konfigürasyondan güvenliğe, web uygulamalarından big dataya varana kadar birçok farklı projeden oluşur.

Spring ekosistemi

Bir uygulama geliştirdiğinizde bu projelerden ihtiyacınız olanları birlikte kullanabilirsiniz. Örneğin, Spring Boot, Spring Security ve Spring Data'nın tamamını kullanarak bir uygulama oluşturabilirsiniz. Bu projelerin her birinin yeteneklerini genişletmek için çalışan ayrı bir ekibi vardır ve birbirilerinden bağımsız olarak geliştirilmektedirler. Spring Projects sayfasında her proje ayrı ayrı ve detaylı olarak açıklanmıştır.

Spring | Projects
Level up your Java code and explore what Spring can do for you.

Spring ekosistemindeki projelerden birisi de Spring Framework'tür. Spring Framework, diğer tüm Spring projelerin temelini oluşturur. Bu sebeple asıl olarak kullanmamız gereken doğru terimin direkt Spring Framework olması gerekiyor. Çünkü tek başına Spring terimi tüm ekosistemi ifade etmektedir. Makalenin devam eden kısmında doğrudan Spring Framework ile çalışmaya devam edeceğiz.

2.1. Spring Framework

Spring ekosistemindeki projelerden birisi olan Spring Framework, kurumsal Java uygulamaları oluşturmak için açık kaynaklı bir frameworktür. Spring Framework, DI, AOP, POJO gibi teknolojileri sunarak karmaşık ve hantal kurumsal Java uygulama geliştirme sürecini basitleştirmeyi amaçlar.

Spring Framework, yaklaşık 20 modülden oluşur. Bu modüller, aşağıdaki şemada gösterildiği gibi Core Container, Data Access/Integration, Web, AOP (Aspect Oriented Programming), Aspects, Instrumentation, Messaging ve Test olarak gruplandırılmıştır.  Uygulamanızı oluştururken ihtiyacınız olan tüm modülleri seçerek bir araya getirebilirsiniz.

Tüm bu modülleri içeren gruplara hızlıca bir göz gezdirelim.

2.1.1. Spring Core Container

Spring Core Container dört modülden oluşur: Core, Beans, Context ve Expression Language dir. Bu modüllere de bir bakalım.

1- Spring Core, Spring frameworkünün uygulamalara entegre edilecek temel mekanizmaları içeren parçasıdır. Spring, Inversion Of Control ilkesine (IoC) dayalı olarak çalışır. Bu prensibi kullanırken, uygulamanın işleyişi kontrol etmesine izin vermek yerine, kontrolü başka bir yazılım parçasına yani Spring frameworküne veririz. Konfigürasyonlar aracılığıyla frameworke, uygulamanın mantığını tanımlayan yazdığımız kodun nasıl yönetileceği konusunda talimat veriyoruz.

IoC'deki "Inversion", uygulamanın işleyişi kendi koduyla kontrol etmesine ve bağımlılıkları kullanmasına izin vermememizden geliyor. Bunun yerine, çerçevenin (bağımlılığın) uygulamayı ve kodunu kontrol etmesine izin veriyoruz (şekil 1.4).

IoC ile framework uygulamanızı yönetir.

Şekil 1.4 Inversion of Control. Bir IoC senaryosu durumunda, diğer birkaç bağımlılığı kullanan kendi kodunu kontrol etmek yerine, uygulama bağımlılık tarafından kontrol edilir. Spring framework,  yürütme sırasında bir uygulamayı kontrol eder. Bu nedenle, bir IoC execution senaryosu uygular.

NOT: Bu bağlamda "kontrol etmek" terimi, "instance oluşturma" veya "method çağırma" gibi eylemlere atıfta bulunur. Bir framework, uygulamanızda tanımladığınız sınıfların nesnelerini oluşturabilir. Yazdığınız konfigürasyonlara bağlı olarak Spring, methodları durdurabilir ve manipüle edebilir. Örneğin Spring, methodun yürütülmesi sırasında ortaya çıkabilecek herhangi bir hatayı loga kaydetmek için belirli bir yöntemi durdurabilir.

2- BeanFactory, Beans modülü tarafından sağlanan factory pattern'in karmaşık bir uygulamasıdır.

3- Context modülü, kurulmuş ve yapılandırılmış herhangi bir nesneye erişim için bir araç sağlar ve Core ve Beans modülleri tarafından sağlanan sağlam temel üzerine kuruludur. ApplicationContext arayüzü, Context modülünün odak noktasıdır.

4- SpEL, bir nesne grafiğini gerçek zamanlı olarak aramak ve değiştirmek için güçlü bir ifade dilidir.

2.1.2. Spring Data Access/Integration

Çoğu uygulama için, işledikleri verilerin bir kısmını kalıcı (persistence) hale getirmek çok önemlidir. Özellikle veritabanlarıyla çalışmak temel bir konudur ve Spring Data Access modülü, birçok durumda veri kalıcılığını halletmek için kullanacağınız modüldür. Spring Data Access, JDBC'yi kullanmayı, Hibernate gibi object-relational mapping (ORM) frameworklerle entegre olmayı içerir. Genel olarak JDBC, ORM, OXM, JMS ve Transactions modülleri bu grupta yer alır.

  • JDBC modülü, zaman alan JDBC kodu ihtiyacını ortadan kaldıran bir JDBC abstraction katmanı içerir.
  • JPA, JDO, Hibernate ve iBatis, ORM modülü tarafından desteklenen ve öne çıkan object-relational mapping API'lerinden sadece birkaçıdır.
  • JAXB, Castor, XMLBeans, JiBX ve XStream için OXM modülü, Object/XML eşleme uygulamalarını destekleyen bir abstraction katmanı sağlar.
  • Java Messaging Service'in JMS modülü, mesaj göndermek ve almak için olanaklar sunar.
  • Özel interfaceleri ve tüm POJO'larınızı implement eden sınıflar için Transactions modülü, programatik ve declarative işlem yönetimi sunar.

2.1.3. Spring Web

Spring ile geliştirilen en yaygın uygulamalar web uygulamalarıdır ve Spring ekosisteminde web uygulamaları ve web hizmetlerini farklı şekillerde yazmanıza olanak tanıyan geniş bir araç seti bulacaksınız. Spring MVC'yi, günümüzde çok sayıda uygulamada yaygın olan standart bir servlet uygulaması modasını kullanarak uygulamalar geliştirmek için kullanabilirsiniz. İlerleyen yazılarda, Spring MVC'yi kullanma hakkında daha fazla ayrıntıya gireceğiz. Bunun dışında web katmanı, aşağıda ayrıntıları verilen Web, Web-MVC, Web-Socket ve Web-Portlet modüllerinden oluşur.

  • Web modülü, çok parçalı dosya yükleme ve servlet listenerlar aracılığıyla IoC konteyner kurulumu ve web odaklı bir uygulama ortamı dahil olmak üzere temel web odaklı entegrasyon özelliklerini içerir.
  • Web uygulamaları için Spring'in Model-View-Controller (MVC) uygulaması Web-MVC modülünde bulunur.
  • Web uygulamalarında, Web-Socket modülü, istemci ve sunucu arasında WebSocket tabanlı iki yönlü iletişimi destekler.
  • Web-Portlet modülü, Web-Servlet modülünün işlevselliğini taklit eder ve bir portlet bağlamında kullanım için bir MVC uygulaması sağlar.

2.1.4. Spring AOP

AOP modülü, construct method interceptors ve pointcuts işlevleri ile aspect-oriented programlamayı mümkün kılar.

2.1.5. Spring Aspects

Aspects modülü, sofistike ve iyi kurulmuş bir AOP frameworkü olan AspectJ yi entegre eder.

2.1.6. Spring Instrumentation

Instrumentation modülü, belirli application sunucularında kullanım için instrumentation and classloader implementasyonları için destek içerir.

2.1.7. Spring Messaging

WebSocket alt protokolü olarak STOMP, uygulamalarda kullanım için Messaging modülü tarafından desteklenir. WebSocket istemcilerinden gelen STOMP mesajlarını yönlendirmek ve işlemek için bir annotation programlama modeli destekler.

2.1.8. Spring Test

Spring Test modülü, birim (unit) ve entegrasyon (integration) testleri yazmak için kullanacağımız geniş bir araç seti sunar. JUnit veya TestNG frameworklerini mümkün kılar.


2.2. Spring Data

Spring Data projesi, veritabanlarına kolayca bağlanmanıza ve minimum sayıda kod satırı yazarak persistence katmanını kullanmanıza olanak tanıyan Spring ekosisteminin önemli bir projesidir. Proje, hem SQL hem de NoSQL teknolojileriyle çalışır ve data persistence ile çalışma şeklinizi basitleştiren üst düzey bir katman oluşturur.

NOT: Spring Core'un bir modülü olan Spring Data Access ve Spring ekosisteminde bir proje olan Spring Data farklı şeylerdir. Spring Data Access, transaction mekanizması ve JDBC araçları gibi temel veri erişim uygulamalarını içerir. Spring Data, veritabanlarına erişimi iyileştirir ve developmentı daha erişilebilir hale getiren ve uygulamanızın farklı türde veri kaynaklarına bağlanmasını sağlayan daha geniş bir araç seti sunar. Bu konuyu ileride daha detaylı inceleyeceğiz.


2.3. Spring Boot

Spring Boot, Spring ekosisteminin "convention over configuration" kavramını tanıtan bir projedir. Bu konseptin ana fikri, bir frameworkün tüm konfigürasyonlarını kendiniz ayarlamak yerine Spring Boot'un size gerektiği gibi özelleştirebileceğiniz varsayılan bir konfigürasyon sunmasıdır. Sonuç olarak, genel olarak, bilinen kurallara uyduğunuz için daha az kod yazmanız ve uygulamanızın diğerlerinden birkaç veya küçük açılardan farklılık göstermesidir. Bu nedenle, her uygulama için tüm yapılandırmaları yazmak yerine, varsayılan bir yapılandırmayla başlamak ve yalnızca kuraldan farklı olanı değiştirmek daha verimlidir.

Spring Boot’un bazı temel özellikleri;

  • Bağımsız(stand-alone) Spring uygulamaları oluşturabilmek.
  • Gömülü bir web sunucusu(Tomcat, Jetty, Undertow) ile gelmesi.
  • Build konfigürasyonunu kolaylaştırmak için sağladığı starter’lar.
  • Otomatik konfigürasyon.
  • Kod üretimi(code generation) ve XML konfigürasyona ihtiyaç duymaması.

3. Özet

Spring ekosistemi çok geniştir ve birçok proje içerir. Bazıları diğerlerinden daha sık karşılaşıyorsunuz ve bazılarını belirli bir ihtiyaç olmadan bir uygulama oluşturuyorsanız hiç kullanamayabilirsiniz. Bu yazıda, yalnızca başlamanız için gerekli olan projelere değindik: Spring Core, Spring Data ve Spring Boot.

Tüm makale için kısa bir özet geçersekte listemiz şu şekilde olacaktır;

  • Bir application framework, bir uygulama geliştirmek için temel yapı sağlayan bir dizi ortak yazılım işlevlerinin veya modülünün bir kümesidir. Bir framework, bir uygulama oluşturmak için iskelet desteği görevi görür.
  • Framework, uygulamayı kendiniz geliştirmek yerine bir araya getirdiğiniz modülleri sağlayarak bir uygulamayı daha verimli bir şekilde oluşturmanıza yardımcı olur. Bir framework kullanmak size zaman kazandırır ve birçok bug dan kurtulmanıza yardımcı olur.
  • Spring gibi yaygın olarak bilinen bir ekosistem kullanmak, büyük bir topluluğa kapı açar ve bu da başkalarının benzer sorunlarla karşılaşma olasılığını artırır. Daha sonra, ele almanız gereken bir soruna benzer bir şeyi başkalarının nasıl çözdüğünü öğrenmek için mükemmel bir fırsatınız olur, bu da size bireysel araştırma için zaman kazandırmaz.
  • Bir uygulamayı implemente ederken, frame kullanmamak da dahil olmak üzere her zaman tüm olasılıkları düşünün. Bir veya daha fazla framework kullanmaya karar verirseniz, tüm alternatiflerini göz önünde bulundurun. Frameworkün amacını, onu başka kimlerin kullandığını (topluluğun ne kadar büyük olduğunu) ve ne kadar süredir piyasada olduğunu (olgunluk) düşünmelisiniz.
  • Spring sadece bir framework değildir. Temel işlevleri belirtmek için genellikle Spring'e “Spring framework” diyoruz, ancak Spring, uygulama geliştirmede kullanılan birçok projeden oluşan bir ekosistem sunuyor. Her proje belirli bir alana adanmıştır ve bir uygulamayı oluştururken, istediğiniz işlevselliği uygulamak için bu projelerden daha fazlasını kullanabilirsiniz. Bu yazıda değindiğimiz Spring ekosisteminin projeleri aşağıdaki gibidir:
  1. Spring'in temelini oluşturan ve context, aspects ve temel veri erişimi gibi özellikler sağlayan Spring Framework.
  2. Uygulamalarınızın persistence katmanını implemente etmek için üst düzey, kullanımı rahat bir araç seti sağlayan Spring Data. Hem SQL hem de NoSQL veritabanlarıyla çalışmak için Spring Data kullanmanın ne kadar kolay olduğunu göreceksiniz.
  3. Spring ekosisteminin bir projesi olan Spring Boot, bir "convention over configuration" yaklaşımını uygulamanıza yardımcı olur ve kolaylıkla bir Spring framework uygulaması hazırlamanızı sağlar..
  • Oldukça sık, öğrenme materyalleri (kitaplar, makaleler veya video eğitimleri gibi) Spring ile sadece backend uygulamaları için örnekler sunar. Spring'i backend uygulamalarıyla kullanmanın yaygın olduğu doğru olsa da, masaüstü uygulamalarında ve otomasyon test uygulamalarında bile Spring'i diğer tür uygulamalarla birlikte kullanabilirsiniz.