Discover millions of ebooks, audiobooks, and so much more with a free trial

Only $11.99/month after trial. Cancel anytime.

Derinlemesine Spring Boot Fundamentals
Derinlemesine Spring Boot Fundamentals
Derinlemesine Spring Boot Fundamentals
Ebook358 pages2 hours

Derinlemesine Spring Boot Fundamentals

Rating: 0 out of 5 stars

()

Read preview

About this ebook

Bu kitap Spring Framework & onun üzerinde kurulu Spring Boot için kurulum ve yapılandırma konularıyla başlamaktadır. Database, SQL, ORM & Hibernate ile Web, REST, JSON, API konularınını hem temel hem de ileri düzeyde anlatmaktadır. HTML, MVC ile ilgili konular da kitabın kapsamındadır. REST için RestTemplate ile client yazılması gibi MicroServices konuları içerilmektedir. Birden çok entity ile relation konuları, layer kullanarak service ve DTO nesnelerinin yapılması gibi profesyonellerin bilmesi gerekenler de kitaba koyulmuştur. Bunun dışında errors, properties ve messages gibi konuar da kapsama alınmıştır.

Yazar

Kitabın yazarı bilgisayar mühendisi Önder Teker, yazılım geliştirme alanında 1990'lı yılların sonlarından beri projeler geliştirmekte, 2000'li yılların başından beri eğitimler vermekte, 2010'lu yılların başından beri de kitap ve eğitim setleri üretmektedir.

LanguageTürkçe
PublisherGodoro
Release dateMay 4, 2023
ISBN9786057172556
Derinlemesine Spring Boot Fundamentals

Read more from Onder Teker

Related to Derinlemesine Spring Boot Fundamentals

Related ebooks

Reviews for Derinlemesine Spring Boot Fundamentals

Rating: 0 out of 5 stars
0 ratings

0 ratings0 reviews

What did you think?

Tap to rate

Review must be at least 10 words

    Book preview

    Derinlemesine Spring Boot Fundamentals - Onder Teker

    Derinlemesine

    Spring

    Boot

    Fundamentals

    Önder Teker

    Godoro Yayıncılık

    GODORO YAYINCILIK

    Yayıncı Sertifikası No: 40946

    Kitabın Adı:

    Derinlemesine Spring Boot Fundamentals

    Copyright © 2023 Godoro Yayıncılık

    Kitabın Yazarı:

    Önder Teker

    Birinci Basım, Mayıs 2023, İstanbul

    ISBN:

    978-605-71725-5-6

    Kapak Tasarımı ve Mizanpaj:

    Önder Teker

    Baskı ve Ciltleme:

    Godoro

    Özel Baskı Çözümleri

    Atikali Mah. Fatih Cad. No: 81 D: 2

    Fatih / İstanbul

    Telefon : (533) 561-2435

    http://www.godoro.com

    GODORO YAYINCILIK

    Atikali Mah. Fatih Cad. No: 81 D: 2

    Fatih / İstanbul

    Telefon : (533) 561-2435

    Takılım (Setup)

    Bu bölümde bir Spring Boot uygulamasının nasıl oluşturulacağı ve çalışır duruma getirileceği gösterilmektedir. Herhangi bir geliştirme çevresi (development environment) için olanlar yerine genel, her birinde geçerli olan bilgilendirmeler verilmektedir. Konular Maven ile anlatılmaktadır. Gradle ile işlemler, Maven ile yapılanların kısa sürümü biçiminde olduğundan kolaylıkla yapılabilir.

    POM

    Uygulama geliştirme için Maven kullanılması durumunda pom.xml adlı bir dosya ile geliştirme yapılır. Proje ile ilgili tüm takılımlar bu dosya içinde yer alır. Proje oluşturulduktan sonra eklenecek özellikler de bu dosyaya koyulur. POM (Project Object Model - İzdüşü Nesne Tasımı), projenin bir özeti, giriş kapısı anlamına gelmektedir. Bu dosyaya göre derleme (compile), yapılama (build), koşturma (run) ve konuşlandırma (deploy) gibi işlemler yürütülür.

    Ana Yapı

    POM dosyasının ana yapısı aşağıdaki gibidir:

    xmlns=http://maven.apache.org/POM/4.0.0

       xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance

        xsi:schemaLocation="

          http://maven.apache.org/POM/4.0.0

          https://maven.apache.org/xsd/maven-4.0.0.xsd">

      4.0.0

    ...

    <groupId>com.godoro

    <artifactId>spring-00-test

    <version>0.0.1-SNAPSHOT

    <name>spring-00-test

     Demo project for Spring Boot

     ...

    <dependencies>

     ...

     <plugins>

       ...

     

    Genel Bilgilendirme (General Information)

    Burada groupId (öbek özdeşliği) bu projenin de içinde olduğu ana projeyi gösterirken, artifactId (yapaylık özdeşliği) ise bu projenin kendisini belirti. Burada version (sürüm), her değişiklikte artırılması gereken bir bilgilendirmedir. Buna karşın name (ad) ise dışarıdan görülecek, insanlar için anlamlı bir sicimdir. POM dosyasında properties (özellikler) ile gerektiğinde kullanılacak bilgilendirmeler verilir.

    Bağımlılıklar (Dependencies)

    Dosyadaki dependencies (bağımlılıklar), projenin kullandığı başka projeleri ve betiklik (library) ya da bohça (package) adı verilen birimleri gösterir. Kullanılan her birim, dependency (bağımlılık) öğesiyle bildirilir. Örneğin Spring Boot araçlarından Spring Boot Web adlı betiklik kullanılacaksa aşağıdaki gibi bir bağımlılık girilir:

    <dependency>

     org.springframework.boot

     spring-boot-starter-web

    Yapılama (Build) & Eklentiler (Plugins)

    POM içindeki build (yapılama) bölümündeki içerik, geliştirme aşamasında yapılacak işlemlerle ilgili öğelerdir. Dosyadaki plugins (eklentiler) bölümünde ise plugin (eklenti) öğeleriyle, geliştirme çevresine yardımcı olacak  öğeler bildirilir. Burada spring-boot-maven-plugin adlı olanı, Spring ile Maven arasındaki köprüyü kurar. Başka bir deyişle, Maven yapılama aracına Spring için kullanılan buyrukları ekler.

    POM dosyalarında eklenti (plugin) ile bağımlılık (dependency) arasındaki ayrım kimce kullanılacağıyla ilgilidir. Bunlardan bağımlılık, geliştiricinin kullanmak istediği Java gibi dillerde doğrudan başvuru yapacağı birimlerdir. Öte yandan eklenti ise Eclipse gibi bir çevre üzerine kurulu Spring Tools Suite (Spring Araçları Takımı) için gerekli olan buyruklardır. Bunlar yalnızca geliştirme aşamasında kullanılırlar.

    Örnek

    Aşağıdaki pom.xml dosyası uygulamanın Maven ile yapılatılmasını sağlar:

    1.0 encoding=UTF-8?>

    http://maven.apache.org/POM/4.0.0

       xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance

        xsi:schemaLocation="

          http://maven.apache.org/POM/4.0.0

          https://maven.apache.org/xsd/maven-4.0.0.xsd">

      4.0.0

    org.springframework.boot

     

      spring-boot-starter-parent

    2.7.1

    <groupId>com.godoro

    <artifactId>spring-00-test

    <version>0.0.1-SNAPSHOT

    <name>spring-00-test

     Demo project for Spring Boot

     <java.version>17

    <dependencies>

     <dependency>

       org.springframework.boot

       spring-boot-starter

     <dependency>

      org.springframework.boot

      spring-boot-starter-test

      test

     

      <dependency>

       org.springframework.boot

       spring-boot-starter-web

     

     <plugins>

       <plugin>

         org.springframework.boot

         

    spring-boot-maven-plugin      

       

     

    Uygulama (Application)

    Bu bölümde Spring Boot çatımlamasıyla yapılan uygulamaların çalışma biçimi anlatılmaktadır.

    Gömülü (Embedded) Tomcat

    Spring Boot uygulamaları web (örün) üzerinden çalışsalar da olağan bir konsol (console) uygulaması olarak yapılandırılırlar. Bunun nedeni Tomcat adlı uygulama işgörücüsü (application server) yazılımının Spring içine gömülü olmasıdır. Bir sınıf @SpringBootApplication (Spring Boot Uygulaması) adlı açımlama (annotation) ile imlendirilip main() (ana) işlevinde SpringApplication adlı sınıfın run() (koştur) işlevi sınıf ile aşağıdaki gibi

    SpringApplication.run(

    Spring00TestApplication.class, args);

    çağrılırsa, o bir uygulama olur.

    Örnek

    Projedeki ana (main) işlevi içeren uygulama (application)  sınıfı aşağıdaki gibidir:

    package com.godoro.test;

    import org.springframework.boot.SpringApplication;

    import org.springframework.boot.autoconfigure

       .SpringBootApplication;

    @SpringBootApplication

    public class Spring00TestApplication {

     public static void main(String[] args) {

    SpringApplication.run(

    Spring00TestApplication.class, args);

     }

    }

    Özel bir değişiklik olmadıkça böyle sınıfın her projede olduğu var sayılıp yeniden anlatılmayacaktır.

    Çalıştırma (Run)

    Uygulama çalıştığında aşağıdaki gibi bir konsol çıktısı üretir:

      .   ____          _            __ _ _

    /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \

    ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \

    \\/  ___)| |_)| | | | | || (_| |  ) ) ) )

     '  |____| .__|_| |_|_| |_\__, | / / / /

    =========|_|==============|___/=/_/_/_/

    :: Spring Boot ::                (v2.7.1)

    2022-07-15 11:30:00.494  INFO 17828 --- [           main] com.godoro.test.Spring00TestApplication  : Starting Spring00TestApplication using Java 17.0.3 on DESKTOP-SB3OC6Q with PID 17828 (D:\Godoro\Examples\JavaEnterprise\SpringBoot\workspace\spring-00-test\target\classes started by Godoro in D:\Godoro\Examples\JavaEnterprise\SpringBoot\workspace\spring-00-test)

    2022-07-15 11:30:00.497  INFO 17828 --- [           main] com.godoro.test.Spring00TestApplication  : No active profile set, falling back to 1 default profile: "default"

    2022-07-15 11:30:01.213  INFO 17828 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)

    2022-07-15 11:30:01.223  INFO 17828 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]

    2022-07-15 11:30:01.223  INFO 17828 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.64]

    2022-07-15 11:30:01.309  INFO 17828 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext

    2022-07-15 11:30:01.309  INFO 17828 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 766 ms

    2022-07-15 11:30:01.616  INFO 17828 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''

    2022-07-15 11:30:01.624  INFO 17828 --- [           main] com.godoro.test.Spring00TestApplication  : Started Spring00TestApplication in 1.46 seconds (JVM running for 2.065)

    Başlatma (Start) & Başlandırma (Restart)

    Uygulama bir kez çalıştırıldıktan sonra yeninden çalıştırılmaya çalışılırsa konsolda yanlışlık bildirimi gösterilir:

    ***************************

    APPLICATION FAILED TO START

    ***************************

    Description:

    Web server failed to start. Port 8080 was already in use.

    Action:

    Identify and stop the process that's listening on port 8080 or configure this application to listen on another port.

    Bunun anlamı başlatma (start) işleminin başarısız olmasıdır. Burada 80 sayılı kapıda başka bir uygulama olduğundan yakınılmaktadır.  Eskisi durdurulup yenisi başlatılmalıdır. Ya da başlandırma (restart) ya da yeniden ortaya sürme (relaunch) gibi bir araçla durdurup başlatma yapılmalıdır.

    Denetleyici (Controller)

    En yalın uygulama için denetleyici (controller) sınıfı yaratılabilir. Buna MVC için kullanılan denetleyici yazılarak ekranda bir sonuç gösteren bir parça düzgü yazılabilir. Bir sınıfın örün (web) üzerinden erişilebilmesi için @Controller (Denetleyici) adlı açımlama (annotation) kullanılabilir. Örnek:

    @Controller

    public class TestController {

    }

    Yöntem (Method)

    HTTP adı verilen önkurallık (protocol), erişim için kullanılan, adına yöntem (method) denen bir takım eylemleri desteklemektedir. Bunların her biri için bir denetleyici sınıfında bir yöntem (method) yazılabilir. Hem HTTP eylemlerine hem de Java işlevlerine yöntem denildiğinden bunlar birbiriyle karıştırılmamalıdır. HTTP yöntemleri GET (Edin), POST (Yolla), PUT (Koy) ve DELETE (Sil) gibi adlar taşırlar.

    Eşlemleme (Mapping)

    Yazılan her Java yöntemi ile HTTP yöntemi arasındaki ilişki kurmak için mapping (eşlemleme) yapılması gerekir. Bunun için bir takım açımlama (annotation) öğeleri bulunmaktadır. Örneğin @GetMapping (Edinme Eşlemleme) adlı olan, GET (Edinme) yöntem için eşlemleme yapar:

    @GetMapping( ... )

    public String getTest() {

     ...

    }

    Yolak (Path)

    Eşlemleme açımlamasına yolak (path) bilgisi verilir. HTTP üzerinden uygulamaya erişen herhangi bir istemci, bu yolak bilgilendirmesini vererek söz konusu yöntemi çalıştırır. Örnek olarak, GET (Edin) yöntemi için çalışan bir yöntem aşağıdaki gibi yazılabilir:

    @GetMapping( /test )

    public String getTest() {

     return Sınama;

    }

    Yanıt Gövdesi (Response Body)

    Olağan durumlarda MVC için çalışan denetleyiciler ekranda bir görünüm (view), başka bir deyişle HTML gibi bir içerik üreten JSP gibi bir teknolojiyle çalışan bir sayfa getirirler. Ancak bu bir koşul değildir. Döndürülen değerin doğrudan istemciye içerik olarak gönderilmesi için   @ResponseBody (Yanıt Gövdesi) adlı açımlama kullanılabilir. Bu durumda dönen değer bir görünüm olarak değil çıktı olarak algılanır. Kullanımı aşağıdaki gibidir:

    @GetMapping( /test )

    @ResponseBody

    public String getTest() {

     return Sınama;

    }

    Örnek

    Aşağıda sınama (test) amaçlı kullanılan bir denetleyici (controller) sınıfı yer almaktadır:

    package com.godoro.test;

    import org.springframework.stereotype.Controller;

    import org.springframework.web.bind.annotation

       .GetMapping;

    import org.springframework.web.bind.annotation

       .ResponseBody;

    @Controller

    public class TestController {

      @GetMapping( /test )

     @ResponseBody

     public String getTest() {

       return Sınama;

     }

    }

    Eğer gözatıcı (browser) uygulamasının adres çubuğuna ilgili URL aşağıdaki  gibi

    http://localhost:8080/test

    biçiminde yazılırsa ekran çıktısı aşağıdaki gibi olur:

    grafikler1

    Eşlemleme (Mapping)

    Bir yolak (path) ile Java sınıfındaki bir yöntem (method) arasında ilişki kurulmasına eşlemleme (mapping) adı verilir. Kimi durumlarda dışarıdan erişilen yolak için uçdoğrultu (endpoint) sözcüğü kullanılır. Bu da istemci yakasından bağlanılacak nokta anlamı taşımaktadır.

    İstek Eşlemleme (Request Mapping)

    Tüm yöntemler için çalışan, @RequestMapping (İstek Eşlemleme) adlı bir açımlama bulunmaktadır. Bunda ki path (yolak) özniteliğinde örün üzerinden erişim sağlanırken kullanılan göreli adres verilir. Bunun dışında method (yöntem) adlı özniteliğe HTTP önkurallığındaki yöntem adlarından birisi, RequestMethod (İstek Yöntemi) adlı sayılandırma (enum) içerisindeki değerlerden birisi verilebilir. Örnek bir yöntem aşağıdaki gibi yapılabilir:

    @RequestMapping(

    path=/mypath, method=RequestMethod.GET)

    @ResponseBody

    public String getValue() {

     return Değer;

    }

    Yolak (Path)

    Bir eşlemlemede yolak (path) içine yazılabilecekler URI (Uniform Resource Indicator - Tekbiçim Özkaynak Göstergeleyici) ölçününe göre yapılır. Bu ölçün URL ile büyük ölçüde benzer olsa da belli bir dosyaya karşılık gelmeyebilme özelliği bulunmaktadır. Başka bir deyişle, URL varsa karşıda bir dosya olmalıdır ancak URI varsa dosya olması koşul değildir. Bu da REST tekniğine uygundur. Öte yandan, bir çok durum URL ya da URI ayrımı  yapılmaz ve tümüne birden, çok bilindiği için URL adı verilir.

    Bir yolak (path) içindeki tüm özyapı (character) değerleri önemlidir. Örneğin sondaki / (bölü - slash) imi ayrı bir yolak oluşturur. Buna göre aşağıdaki iki yolak aynı değildir:

    /mypath

    /mypath/

    Birisi için yapılan eşlemleme ötekisi için çalışmaz.

    İstek Yöntemi (Request Method)

    Eşlemleme açımlamasına verilebilecek yöntem değerlerini barındıran sayılandırma (enum) aşağıdaki değerleri içerir:

    GET(Edinme)

    POST(Yollama)

    PUT (Koyma)

    DELETE (Silme)

    HEAD (Baş)

    PATCH(Yama)

    OPTIONS(Seçenekler)

    TRACE(İzlendirme)

    Bunlardan ilk dördü temel işlemler için kullanılır. Örneğin GET (Edinme), istemcinin karşı yakadan veri istediği durumlarda; POST (Yolllama) karşı yakaya yeni veri gönderildiğinde kullanılır. Öte yandan PUT (Koy) ise var olan bir içeriği güncellemek için çağrılır. Son olarak DELETE (Sil) ise bir özkaynağın giderilmesi için kullanılır.

    Öteki seçeneklerden HEAD (BAŞ), içerik vermeden ya da almadan, yalnızca özkaynak ile ilgili bilgilendirmeler içeren başlık (header) değerlerin gönderilmesi ve alınması için kullanılır. Bunun nedenlerinden birisi, özellikle büyük verilerde gereksiz yere içeriği almamak ve yalnıza genel bilgilendirme edinmek için olabilir. Yöntemlerden PATCH (Yama), PUT (Koy) gibi çalışır ancak bütün nesneyi güncellemek için değil yalnızca bir kaç tarlasını değiştirmek amacıyla kullanılır. Yöntemlerden OPTIONS (Seçenekler) ise bir özkaynak üzerinden yapılabilecek işlemleri öğrenmek için; TRACE (İzle) ise bir özkaynağa erişmek için hangi yollardan, hangi bilgisayarlardan ya da işgörücülerden geçilerek erişim yapıldığını öğrenmek içindir.

    Kısa Açımlamalar

    Yukarıda sözü edilen @RequestMapping (İstek Eşlemleme) açımlamasını yazılması biraz uzun olduğu için sık kullanılan yöntem (method) seçenekleri için ayrı bir açımlama yapılmıştır. Örneğin @GetMapping (Edinme Eşleme) ve @PostMapping (Yollama Eşlemleme) bu durumda aşağıdaki gibi

    @RequestMapping(

    path=/mypath,method=RequestMethod.GET)

    yazmak gerine daha kısa bir biçimde  şöyle eşlemleme yapılabilir:

    @GetMapping(/mypath)

    Sınıf Eşlemleme (Class Mapping)

    Bir sınıftaki her yöntemin başına bir yolak (path) eklemek için @RequestMapping (İstek Eşlemleme) açımlaması kullanılabilir. Örnek:

    @Controller

    @RequestMapping(/parent)

    public class PathController {

      @GetMapping(/child)

     @ResponseBody

     public String getChild() {

       return Çocuk;

    }

    }

    Bu durumda istek aşağıdaki gibi yolak için yapılır:

    /parent/child

    Öte yandan, sınıfa ana-baba vermek yerine yöntemde iki bölüm de verilebilir. Örnek:

    @GetMapping(/parent/child)

    Ancak bu durumda sınıftaki her yönteme öntakı vermek gerekmektedir.

    Örnek

    Aşağıdaki örnekte istek eşlemleme (request mapping) ile ilgili konular içeren bir denetleyici (controller) bulunmaktadır:

    @Controller

    @RequestMapping(/root)

    public class PathController {

      @GetMapping(/short)

     @ResponseBody

     public String getShort() {

       return Kısa;

     }

      @RequestMapping(

    path=/long,method=RequestMethod.GET)

     @ResponseBody

     public String getLong() {

       return Uzun;

     }

    }

    Bir gözatıcıda aşağıdaki adresi girelim:

    Enjoying the preview?
    Page 1 of 1