Spring Framework, açık kaynak kodlu olan ve Rod Johnson tarafından geliştirilen bir Java platformudur. Framework, yazılım geliştiricilerin kullandığı önceden hazırlanmış kütüphane yapılarına verilen bir isimdir. Bu çatıdan istediğiniz hazır kütüphaneleri kullanabilir ya da yenilerini destekleyerek gelişimine destek olabilirsiniz.

Spring, OOP tabanlı bir tasarım sağlar. Yani Nesneye Yönelik Programlamanın Encapsulation, Inheritance gibi çoğu kavramıyla burada da karşılaşmış oluruz. Ancak Spring için bilinmesi gereken en önemli kavram Dependency Injection’dır. Yazının ilerleyen kısımlarında bundan daha detaylı bir şekilde bahsetmeye devam edeceğiz.

Spring, kurumsal tabanlı uygulama geliştirmede kullanılır. “Program to Interface” yaklaşımına sahiptir.  Ücretsiz ve modüler bir yapıda olan Spring yapısını daha iyi tanımak için modüllerine ve mantık yapısına göz atalım.

Spring AOP: AOP kelime anlamı olarak Aspect Oriented Programming yani Cephe Yönelimli Programlama olarak dilimize çevrilir. Spring AOP modülü, kodu temiz bir şekilde ayırabilmek için Java dilinde implemente edilmiş Proxy tabanlı bir çatıdır. AOP ile transaction yöntemi sayesinde log ve güvenlik gibi modüller merkezi bir yerde toplanır ve lazım olduğunda projeden bağımsız olarak çağrılabilir.

Spring DAO (Database Access Object): JDBC teknolojisi sayesinde projemizin veritabanı işlemlerini halletmemizi kolaylaştırır.

Spring ORM (Object Relational Mapping): Bu modül sayesinde projelerimizde Hibernate, JDO gibi ORM frameworklerini istediğimiz gibi entegre edebilir ve kullanabiliriz.

Spring Context/Web: Tanımlanan ve yapılandırılan herhangi bir nesneye erişmek için kullanılan bir araçtır. Maven paketinden elde edilen nesnelerin kullanımını organize eder. ApplicationContext ve WebApplicationContext adında bulunan XML dosyalarından Spring Bean tanımlarını okuyabilir ve bunları oluşturabiliriz. Bu modülün odak noktası ApplicationContext interface’idir.

Context eğer gerekliyse Controller’da çağrılır. Yönetimimizi destekleyerek component yönetimini kolaylaştırır.

Spring MVC: Spring Framework, web tabanlı geliştirmelerde diğer popüler çatılar gibi MVC yapısını kullanır. MVC yapısı Model-View-Controller basamaklarından oluşur ve kontrollü bir şekilde proje gerçekleştirebilmeyi sağlar.

Model: Veri katmanıdır. Veritabanı sınıfları burada bulunur.

View: Kullanıcı ile etkileşimde bulunan katmandır.

Controller: Model ile View arasında köprü işlevi görür ve verilerin kullanıcılara doğru bir şekilde aktarılmasını sağlar.

Spring Core: Inversion of Control, Dependency Injektion gibi özelliklerle birlikte çatının temel özelliklerini geliştiricilere sağlar.

 

NEDEN SPRİNG ÖĞRENMELİYİZ?

  • Spring yapısının modüler olması bize istediğimiz özellikleri kendimiz seçerek kullanabilmemizi sağlar. Üzerinde çalışmak istediğimiz kütüphaneleri modüler yapısıyla istediğimiz gibi ekleyebiliriz. İstemediklerimizi de projemizin dışarısında bırakabiliriz.
  • Spring kendi sunduğu API’ler sayesinde bizleri Java’nın kullanımı zor API’lerinden kurtarır.
  • Spring’in test edilebilirliği de oldukça kolaydır. Böylelikle uygulamalarımızı test yükündende büyük ölçüde kurtarmış olur.
  • Spring’e özgü olan Dependency Injection sayesinde nesneler arası bağlar otomatik olarak gerçekleştirilir. Nesneler arası bağımlılıklar bu metod sayesinde veritabanında gerekli işlemler yapıldıktan sonra framework tarafından otomatik bir şekilde kontrol edilir. Bağlı yapılardan biri için nesne oluşturduğumuzda kendisine bağlı olan diğer yapıyı da oluşturulmuş olana enjekte eder ve birlikte kullanımını kolaylaştırır.
  • Veritabanı için ORM yapılardan faydalanarak JDBC’ninde katkılarıyla veritabanından sorguları kolaylaştırır. Karmaşık veritabanı düzenlemelerini ve sorgularını bizim için otomatik gerçekleştirir.

 

Spring Boot, temel olarak framework ile aynı anlama gelmez ancak onun bir uzantısıdır. Spring framework, bize yapının sağladığı kütüphaneleri kullanmamızı sağlarken Spring Boot’un temel amacı kod uzunluğunu kısaltmak ve web geliştirmeyi en kolay şekilde bize sunmaktır. Ayrıca Spring uygulamasını kurmak için yapmamız gereken temel konfigürasyonları bizim için gerçekleştirir. Yani Spring Boot, Spring Framework’un kolaylaştırılmış halidir diyebiliriz.

Ancak yine de dikkat etmek gerekir ki, Spring Boot bir uygulama sunucusu ya da web container değildir. Otomatik olarak kod üretmez sadece gerekli ayarlamaları bizim için otomatik hale getirir.

JPA,  açılımı Java Persistence API olan bu kavram ORM yapısını bizim için çağırır ve kullanır. Kalıcı olarak veri tutma gereği duyduğumuz zamanlarda kullanırız.

POJO Class, model sınıflarımızdaki veri yapılarıyla alakalı bir kavramdır. Tablolardaki kayıtları ORM’den faydalanarak POJO model sınıflarına dönüştürürüz. Pojo classımızı @Entity etiketiyle işaretlediğimizde veritabanında oluşturulacak bir yapı olduğunu söylemiş oluruz. JPA sayesinde kayıtlarımız veritabanıyla doğrudan ilişkilendirilir.

 

SPRING’I NASIL KULLANABİLİRİZ?

Spring yapısını kullanabilmek için Java kodlama yapabileceğimiz bir IDE’ye ve onun güncel özelliklerine sahip olmak yeterlidir. Biz şu anki yazımızda JetBrains uygulamalarından olan IntellijIDEA ile Spring kullanımından adımları sizlerle paylaşacağız.

Spring uygulaması için bize oldukça kolaylık sağlayan https://start.spring.io/ sitesinden doğru bir başlangıç yapabiliriz. Bu siteye girdiğimizde karşımıza çıkan alanlar şu şekilde olacaktır;

Bu siteden projemiz için gerekli olacak tüm adımları ve modülleri seçebiliriz. Öncelikle sitenin en sol üst kısmından hangi dili ve hangi proje yapısını kullanacağımızı seçeriz. Hemen altından kullanacağımız Spring Boot sürümünü de seçtikten sonra projemizin adı, package ismi gibi proje oluşturmak için gerekli olan diğer bilgilerimizi de tamamlarız. Ardından sıra sağ kısımda yer alan Add Dependencies’den faydalanarak projemize gerekli olan paketleri seçebiliriz.

Uygulamamızda kullanmak istediğimiz her modülü seçtikten sonra (Unutursak sonra IDE’den ekleyebiliriz.) Generate butonuna basarak Initializr’ın bizim için oluşturduğu zip dosyasını IDE’mizde açıp istediğimiz tüm paketlerle birlikte projemize başlayabiliriz.

Eğer direkt IDE’miz üzerinden projeyi açmak istersek New Project kısmından Spring’i seçebilir ve gerekli paketleri bu şekilde indirerek de projemize başlayabiliriz.

Sonucunda projemizin beyni olan pom.xml dosyasında Spring için gerekli olan bağlantıların tanımlanmış olduğuna emin olmamız gerekir.

Projemizde kullanacağımız özelliklere göre eklenen dependencyler değişiklik gösterebilir. Önemli olan hepsinin pom.xml dosyasında doğru bir şekilde önceden IDE’ye tanıtılmış olmasıdır.

Bu aşamadan sonra örnek projeleri de incelediğiniz zaman genel olarak bir Spring projesinde hiyerarşi şu şekilde ilerler;

1. Öncelikle class yapıları bir models sınıfı içerisinde oluşturulur. Veritabanı durumlarına göre @Entity ile etiketlenerek JPA’nın üzerinde çalışması gerektiği söylenir. Classların her birinde PK’ler tanımlı olmalıdır. Başka classlardan eğer bağlantı kurulması gerekirse classlarımızı bir tablo yapısı gibi düşünerek @OneToOne/@ManyToOne şeklinde bağlantı kurup bu etiketin altında gerekli olan alanlarıyla classı çağırabilirsiniz.

 

2. Ayrıca Spring’in sunduğu kolaylıklardan biri olan Lombok’u projenize entegre ederek Getter/Setter oluşturmasını büyük ölçüde kolaylaştırabilirsiniz. Argümanlı getter/setter’lar için @AllArgs.. şeklinde, argümansız olanlar içinse @NoArgs… şeklinde etiketleme yaparak Lombok’un özelliklerinden faydalanabilirsiniz.

 

3. Modellerimizin CRUD işlemlerini implement edeceği bir Repositoy yapısı oluşturulur. Repositories sınıfı altında oluşturulan classların CrudRepository’den implemente edilmesi sağlanır.

 

4. Crud işlemleri de çağrıldıktan sonra bu sefer asıl işlemleri yapacak Service yapıları oluşturulur. Yine bir başka service paketi içerisinde classların her birine ait service ve serviceImpl yapıları oluşturulur. Service’de tanımlanan metotlar Impl uzantılı diğer classta açıkça yazılır. Crud işlemleri de bu kısımda gerekliyse kullanılabilir.

 

5. Bir sonraki aşamada ise MVC’nin View kısmına geçerek kullanıcının deneyimleyeceği View classlarını ve özelliklerini oluşturarak metotları viewlarda çalışacağı yerlere çağırabiliriz. Spring ile programlama da alışık olduğumuz Frontend’ten başka olarak Vaadin.com yapısından hazır componentleri de istersek projemizde kullanabiliriz. Bu kısımdan sonrası tamamen tasarım, düzen ve hangi metotun nerede çağırılacağı şeklinde ilerler.

 

6. View’larımızda tasarımlarımız bittikten sonra MainLayout’ta viewlarımızın gösterilme tasarımını da düzenleyerek sayfamızı doğru bir şekilde kullanıcıya sunabiliriz.

 

7. Projede kullanmak istediğimiz veritabanları ile ilgili işlemler ya da mail gönderme gibi durumlarda eğer gerekliyse çeşitli eklemeler applicationproperties isimli dosyada yapılır. In memory database kullanmak istemezsek, kalıcı durumlar için Sql yapısını da projemize entegre ederek istediğimiz şekilde kullanabiliriz. (Statik veri tanımlamaları için bootstrap data yapısından faydalanarak başka bir paket içerisinde kendi metotlarımızı çağırıp kayıt yapabiliriz.)

Bahsettiğimiz tüm kavramlardan sonra Spring yapısını kullanıp tecrübe ederek, lazım oldukça pek çok başka özelliğini de kullanarak istediğimiz tasarımı geliştirebiliriz. Aklınıza takılan noktalar için bize ulaşabilirsiniz!