Herkese selamlar son günlerde C# kampının ardından son günlerde Java ile oldukça içli dışlıyım. Temel syntax olarak C# dan çok farklı olduğunu söyleyemem. O yüzden Java ile kodlama yapmanın zevkli ve alışması kolay olduğunu rahatlıkla dile getirebilirim :) Bu yazımda da Spring Boot mimarisini ele alacağım tabi ki en süper ,muhteşem, çılgın😊 IDE IntelliJ IDEA üzerinden haydi gelin başlayalım.
Öncelikle Spring Boot projemizi oluşturmak için IntelliJ IDEA’nin Ultimate sürümüne sahip olmamız gerekli. Bildiğim kadarıyla her hangi extra bir plugin ile kullanılmıyorsa Community ve Education sürümlerinde maalesef Spring Initializr kullanamıyoruz. Ücretli IDE’nin dezavantajları dostlar. Fakat benim gibi öğrenciyseniz ve .edu isimli bir e-mail adresiniz var ise bu adres: https://www.jetbrains.com/shop/eform/students üzerinden üye olarak 1 yıl bütün JetBrains ürünlerine ücretsiz erişim sağlayabilirsiniz bilginize. Ayrıca JetBrains “Toolbox” uygulamasını da kullanabilirsiniz extra bir kurulum ile uğraşmadan sizin için indirmeleri ve güncellemeleri rahatlıkla yapmanızı sağlıyor. Bu kadar JetBrains reklamından sonra bunu da ufak bir not olarak buraya düşelim öğrenci arkadaşlarımın çok işine yarayacaktır. :)
İlk projemizi nasıl oluşturur ve ayağa kaldırırız?
Öncelikle IDE’mizin File > New > Project Kısmına gitmemiz gerekli. Daha sonranda ise böyle bir ekran bizleri karşılayacak. Buradan Spring Initializr seçiyoruz. Projemizin oluşturulacağı yeri, Package ismimiz gibi gerekli ayarları buradan yapıyoruz. Ben SDK olarak 16 kullanıyorum siz istediğiniz versiyonu kullanabilirsiniz. Bu kısımda projemin ismini “demo” olarak default bırakacağım. Ayrıca bknz: https://start.spring.io/
Next seçeneğine tıkladıktan sonra ise karşımıza böyle bir ekran çıkacak.
Bu kısımda projemiz içerisinde olan “Dependencies” kısımlarını belirleyeceğiz. Spring Boot bu noktada bizlere oldukça seçenek sunuyor. Burada ki Özellikleri hazır bir şekilde projelerimizde kullanabiliyoruz. Bu projede bir web projesi geliştireceğim. Aynı zamanda PostgreSQL veri tabanına bağlayacağımız için seçimlerimi bu şekilde yaptım. Yazımızın çok uzamaması için bu bağımlılıkların ne iş yaradıklarını farklı kaynaklardan linkler ile bırakacağım dileyenler detaylı inceleyebilirler.
Spring Boot Dev Tools: https://blog.burakkutbay.com/spring-boot-developer-tools-nedir-ve-kullanimi.html/
Lombok: https://blog.burakkutbay.com/project-lombok-nedir-lombok-kullanim-uygulama-ornegi.html/
Spring Data JPA : https://blog.burakkutbay.com/java-persistance-api-jpa-nedir.html/
PostgreSQL Driver : https://blog.burakkutbay.com/spring-boot-dersleri-coklu-veritabanlari-ile-calismak-spring-data.html/
Kaynaklar için Burak Kutbay’a teşekkürler.
Bu adımı da geçtiğimize göre artık sadece projemizi oluşturmak kalıyor. Finish diyelim ve projemiz bizim için oluşturulsun..
Demo isimli projemiz karşımızda buraya kadar her şey sıkıntısız gittiyse doğru yoldayız demektir :) “pom.xml” isimli dosyada gerekli bağımlılıklarımızı görebiliriz. Ayrıca DemoApplication.java isimli dosyamız ise Main Methodumuzun olduğu Classımız.
Şimdi ise katmanlı mimarı yapımızı oluşturmaya ufaktan başlayalım Business, DataAccess, Entity ve Api katmanlarımızı projemizin içine oluşturalım.
Katmanlarımızı oluşturduk. İsimlendirme kurallarından şaşmıyoruz tabi ki :) Bu örnek projede “Northwind” veri tabanını kullanacağım. Entities klasörümüze Product isimli bir Class oluşturup gerekli alanlarımızı yazıyoruz. Veri tabanımıza uygun olacak şekilde. Buraya kadar her şey normal şimdi ise Spring’in nimetlerinden yararlanmaya başlayalım isterseniz.
Daha sonrasında ise Classımın üstüne “@Data” Notasyonumu ekliyorum. Data bizim için Getter,Setterlarımızı ve Constructors yapımızı getirecektir. C# ‘da yaptığımız “Attribute” olayının aslında aynısını uygulamış olduk bu kısımda. Daha bu kısımda yapacaklarımız henüz bitmedi. “@Entity” Notasyonumuz ile bu Classımızın bir veri tabanı nesnesi olduğunu belirtmemiz gerekli. “@Table(name=”products”)” ile de veri tabanımız da hangi tabloya karşılık geldiğini ifade edelim. Son olarak ise “@Column” Notasyonu ile de alanlarımızın veri tabanımız da hangi kolonlara karşılık geldiğini yazmamız gerekli.
Son görüntümüz bu şekilde Product Classımız bize hala kızgın gördüğünüz üzere. Son olarak ise “@Id” ve “@GeneratedValue” alanlarımızı verelim. Generated Value “Id” alanımızın bir bir artacağını kast ediyor. Veri tabanın da tutuğumuz şekliyle. Burada yapacağımız işlerimizi sonlandırdık.
Bu yazımda Northwind veri tabanını kurmayı göstermeyeceğim. Direk olarak “resources > application.properties” içerisinde PostgreSQL bağlanmak için gerekli ayarlarımızı oluşturalım. Ben port olarak “3306” kullanıyorum. Sizde muhtemelen olarak default olarak “5432”’dir. Veri tabanı ismimizin ve şifremizin doğru olduğundan emin olalım.
Bir sonra ki adımda ise “DataAccess” katmanımızda “Abstracts” klasörü içerisinde “ProductDao” Interfaceimizi oluşturalım. C#’da IProductDal’a çokta alışmıştım halbuki :) Burada yapmamız gereken “JpaRepository” Inherit etmek. Bunu C#’da “EfEntityRepositoryBase” yapısı ile aslında daha uzun bir yoldan yapıyorduk diyebiliriz :) O projeyi incelemek isteyenler için: https://github.com/TarikSogukpinar/CarRentalDemo adresini ziyaret edebilirler. Spring bu noktada işlerimizi baya baya kolaylaştırıyor.
Sonlara doğru iyice yaklaştık. “Business” katmanızda “Abstracts” klasörümüz içerisinde “ProductService” isimli Interfaceimizi oluşturuyoruz. İçerisine “getAll” isimli methodumuzu yazıyoruz.
Daha sonra ise doğal olarak bu sınıfımızın somut nesnesini yazmamız gerekli “Business” katmanı içerisinde “Concretes” klasörüne gelip “ProductManager” isimli bir Class oluşturuyorum ve “ProductService” implementasyonunu gerçekleştiriyorum. Bu noktada “ProductDao” Enjekte etmem gerekli. Methodlarıma ulaşmak için. Ayrıca “@Autowired” Notasyonumu da bu noktada kullanıyorum. Spring arka planda bu “Instance” karşılık gelecek bir değer verecek bizim için. C#’da Autofac, Ninject gibi paketler ile bu işlemi yapıyorduk. “@Service” Notasyonumuz da eklemeyi unutmayalım. Son halimiz bu şekilde.
Gelelim şimdi ise API kısmımıza “Api” katmanımıza gelip “ProductsController” isimli bir Class oluşturuyoruz. Daha sonra ise Spring yardımı ile “@RestController” Notasyonumu ve “@RequestMapping” rotasyonumu Classımın üstüne yazmam gerekli. ProductManager’da yaptığımız gibi ProductService Injectionımı da burada da uyguluyorum ve en son olarakta API’min dış dünyaya açılması için “@GetMapping” Notasyonu yardımı ile “getAll” methodumu oluşturuyorum ve sonuç olarak projemiz artık Products tablomuzda ki ürünleri getirmeye hazır.
Hemen Postman yardımı ile bakalım her hangi bir hata yaptık mı acaba diye kontrol edelim.
Apimiz bu adrese istek yapacak: http://localhost:8080/api/products/getall
Eveet her hangi bir sorun yok. Apimiz sağlıklı bir şekilde çalışıyor.
Sonuç olarak güzel ve detaylı bir yazının daha sonuna geldik. Şu günlerde devam eden Java Kampı için benim açımdan çok güzel bir tekrar olduğunu söyleyebilirim. Tarık şurası eksik, burası şöyle olsaydı daha güzel olurdu dediğiniz yerleri lütfen bana bildirin. Ayrıca bu projenin kodlarına buradan: https://github.com/TarikSogukpinar/JavaDemoSpringProject ulaşabilirsiniz. Bir sonra ki yazımda görüşmek dileğiyle..