Spring Boot H2 Gömülü Veritabanı Projesi

Adım 1: Spring Boot Projesi Oluşturma

İlk olarak, Spring Boot projesi oluşturmanız gerekiyor. Bu örnekte, Maven kullanacağız.

  1. VS Code’u açın ve bir proje klasörü oluşturun. Proje klasörünü açmak için File > Open Folder‘ı tıklayın ve bir klasör seçin.
  2. VS Code’un sol kenar çubuğunda, Extensions ikonuna tıklayın ve Spring Boot Extension Pack aramak için arama kutusunu kullanın. Spring Boot Extension Pack eklentisini yükleyin ve kurulumu tamamlayın.
  3. Sol kenar çubuğunda, Explorer bölmesinde, projenizin kök klasörüne sağ tıklayın ve Open in Terminal seçeneğini seçin.
  4. Açılan terminal penceresinde, aşağıdaki komutu yazarak Spring Boot uygulaması için temel yapıyı oluşturun:
spring init --dependencies=web,data-jpa,h2 my-spring-boot-app

Yukarıdaki komut, web, data-jpa ve h2 bağımlılıklarını içeren bir Spring Boot uygulaması oluşturur. my-spring-boot-app, oluşturmak istediğiniz uygulamanın adıdır. Bu adı değiştirebilirsiniz.

  1. Komut çalıştırıldıktan sonra, projenizde birkaç dosya ve klasör oluşacaktır. Bu dosyalar, projenizde Spring Boot uygulamanızı oluşturmanıza yardımcı olacaktır.
  2. Projenizi VS Code’da açın ve src/main/java altındaki com.example.demo paketinde DemoApplication.java adlı bir sınıf oluşturun. Bu sınıf, uygulamanızın giriş noktasıdır.

Adım 2: Veritabanı Bağlantısını Yapılandırma

Şimdi, H2 veritabanına bağlanmak için Spring Boot’u yapılandırmamız gerekiyor. Bu örnekte, application.properties dosyasında yapılandıracağız.

spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.path=/h2-console

Yukarıdaki ayarlar, gömülü H2 veritabanına bağlanmamızı sağlar. spring.h2.console.enabled özelliği, H2 veritabanı konsolunu etkinleştirir. spring.datasource.url özelliği, veritabanı URL’sini belirtir. spring.datasource.driverClassName özelliği, veritabanı sürücüsünü belirtir. spring.jpa.database-platform özelliği, Hibernate tarafından kullanılacak veritabanı platformunu belirtir.

Şekil 1. h2-console Ekranı

CREATE TABLE person (
  id BIGINT NOT NULL AUTO_INCREMENT,
  firstName VARCHAR(255) NOT NULL,
  lastName VARCHAR(255) NOT NULL,
  PRIMARY KEY (id)
);

Şekil 2. h2-console Ekranı-2

Adım 3: Veritabanı Tablosu ve Test Verileri Oluşturma

Şimdi, H2 veritabanında bir tablo oluşturmanız gerekiyor. Bu örnekte, “Person” adlı bir tablo oluşturacağız. Ayrıca, tabloya birkaç test verisi de ekleyeceğiz.

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String lastName;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String

Adım 4: Restful Web Servislerini Ekleme

Şimdi, RESTful web servislerimizi oluşturacağız. Bu örnekte, “Person” adlı bir RESTful web servisi oluşturacağız.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Optional;

@RestController
@RequestMapping("/person")
public class PersonController {
    @Autowired
    private PersonRepository personRepository;

    @PostMapping
    public Person savePerson(@RequestBody Person person) {
        return personRepository.save(person);
    }

    @GetMapping
    public List<Person> getPersons() {
        return personRepository.findAll();
    }

    @GetMapping("/{id}")
    public Optional<Person> getPerson(@PathVariable Long id) {
        return personRepository.findById(id);
    }

    @PutMapping("/{id}")
    public Person updatePerson(@PathVariable Long id, @RequestBody Person person) {
        person.setId(id);
        return personRepository.save(person);
    }

    @DeleteMapping("/{id}")
    public void deletePerson(@PathVariable Long id) {
        personRepository.deleteById(id);
    }
}

Yukarıdaki sınıf, “Person” tablosundaki verilerin alınmasını, ekleme, güncelleme ve silme işlemlerini gerçekleştirmek için kullanılır. “Person” nesnelerinin oluşturulmasını sağlamak için @RequestBody kullanılır. Ayrıca, @GetMapping ve @PostMapping gibi farklı HTTP yöntemlerini kullanarak web servislerimizi tanımlarız.

Adım 5: Veritabanı Erişim Katmanını Oluşturma

Şimdi, veritabanına erişmek için bir erişim katmanı oluşturacağız. Bu örnekte, JPA (Java Persistence API) kullanacağız.

import org.springframework.data.jpa.repository.JpaRepository;

public interface PersonRepository extends JpaRepository<Person, Long> {
}

Yukarıdaki sınıf, “Person” tablosuna erişmek için JpaRepository arayüzünü genişletir. JpaRepository, veritabanına erişmek için bir dizi hazır yöntem sağlar. Bu nedenle, PersonRepository sınıfını manuel olarak bir sorgu oluşturmaya gerek kalmadan, veritabanına erişmek için kullanabilirsiniz.

Adım 6: Uygulamayı Başlatma

Son olarak, uygulamanızı başlatmanız gerekiyor. Bu örnekte, Spring Boot uygulamasını “H2demoApplication” sınıfı ile başlatıyoruz.


			

Spring Boot Developer Tools Kullanımı

Spring Boot Developer Tools, Spring Boot uygulamanızın geliştirme sürecini hızlandırmak ve kolaylaştırmak için bir dizi araç ve özellikler içeren bir kütüphanedir. Bu araçlar arasında otomatik yeniden yükleme, hızlı yeniden başlatma, anlık yenileme, otomatik yeniden yapılandırma vb. yer alır.

Spring Boot Developer Tools’u kullanarak, Spring Boot uygulamanızı anında yeniden yükleyebilirsiniz. Bu sayede, kod değişikliklerinizi kaydettikten hemen sonra uygulamanızı yeniden başlatmanız gerekmez, Spring Boot Developer Tools bunu sizin için otomatik olarak yapar.

Aşağıda, Spring Boot Developer Tools kullanarak hızlı bir şekilde bir “Merhaba Dünya” uygulaması oluşturmak için bir örnek kod bulunmaktadır:

İlk olarak, Spring Boot’u ve Developer Tools’u projenize ekleyin. Bu örnekte, Maven kullanarak projeyi yönetiyoruz.

pom.xml dosyasına aşağıdaki bağımlılıkları ekleyin:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
  </dependency>
</dependencies>

Daha sonra, Spring Boot uygulamanızı oluşturun. Bu örnekte, HelloController adında bir controller sınıfı ve /hello isteğine cevap verecek bir hello metodu kullanıyoruz.

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "Merhaba Dünya!";
    }
}

Son olarak, uygulamanızı başlatın ve /hello isteğine bir tarayıcıdan erişin.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

Bu kadar! Şimdi, HelloController sınıfındaki metodu değiştirin ve kaydedin. Spring Boot Developer Tools, uygulamanızı otomatik olarak yeniden yükleyecek ve yeni değişiklikleri görebileceksiniz.

Spring Boot Developer Tools’un sağladığı diğer özellikler arasında, statik içeriği yeniden yüklemek, sabit dosyaları yeniden yüklemek, thymeleaf şablonlarını yeniden yüklemek vb. yer alır. Bu özellikler sayesinde, Spring Boot uygulamanızı hızlı ve kolay bir şekilde geliştirebilirsiniz.

Profile ve Farklı Interface İçeren Spring Boot Örneği

Örneğimizde, DatabaseConfiguration adında bir sınıfımız ve bu sınıfın uygulama için iki farklı profile’ı var: dev ve prod.

DatabaseConfiguration.java

@Configuration
public class DatabaseConfiguration {

    @Value("${database.username}")
    private String username;

    @Value("${database.password}")
    private String password;

    @Value("${database.dev-url}")
    private String devUrl;

    @Value("${database.prod-url}")
    private String prodUrl;

    @Bean
    @Profile("dev")
    public DataSource devDataSource() {
        return new DevDataSource(username, password, devUrl);
    }

    @Bean
    @Profile("prod")
    public DataSource prodDataSource() {
        return new ProdDataSource(username, password, prodUrl);
    }
}

Yukarıdaki kod bloğunda, DatabaseConfiguration adlı bir sınıfımız var ve burada DataSource adlı bir başka sınıfımızı kullanıyoruz. Bu DataSource sınıfı, iki farklı profilde çalışacak şekilde yapılandırılmıştır: dev ve prod.

Ayrıca, @Value anotasyonu kullanarak application.properties dosyasında tanımladığımız veritabanı kullanıcı adı ve şifresini ayarlarız.

application.properties

# Veritabanı ayarları
database.username=myuser
database.password=mypassword

# Uygulama ayarları
spring.profiles.active=dev

Aşağıda, DataSource sınıfımızın arayüzünü gösteren bir örnek kod bloğu bulunmaktadır:

public interface DataSource {
    void connect();
}

DevDataSource.java

public class DevDataSource implements DataSource {
    private String username;
    private String password;
    private String url;

    public DevDataSource(String username, String password, String url) {
        this.username = username;
        this.password = password;
        this.url = url;
    }

    @Override
    public void connect() {
        System.out.println("DevDataSource connected to " + url + " with username " + username + " and password " + password);
    }
}

Bu arayüz, DataSource sınıfımızın uygulama tarafından kullanılacak API’sini tanımlar. connect() metodu burada sadece bir örnek olsun diye eklenmiştir.

Son olarak, DatabaseService adlı bir başka sınıfımız var ve burada DataSource sınıfımızı kullanıyoruz:

@Service
public class DatabaseService {

    private final DataSource dataSource;

    public DatabaseService(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    public void connectToDatabase() {
        dataSource.connect();
    }
}

Yukarıdaki sınıfta, DataSource sınıfı constructor’a parametre olarak geçirilir. connectToDatabase() metodu, DataSource sınıfının connect() metodunu çağırarak veritabanına bağlanır.

ProdDataSource.java

public class ProdDataSource implements DataSource {
    private String username;
    private String password;
    private String url;

    public ProdDataSource(String username, String password, String url) {
        this.username = username;
        this.password = password;
        this.url = url;
    }

    @Override
    public void connect() {
        System.out.println("ProdDataSource connected to " + url + " with username " + username + " and password " + password);
    }
}

DatabaseConfiguration.java

@Configuration
public class DatabaseConfiguration {

    @Value("${database.username}")
    private String username;

    @Value("${database.password}")
    private String password;

    @Value("${database.dev-url}")
    private String devUrl;

    @Value("${database.prod-url}")
    private String prodUrl;

    @Bean
    @Profile("dev")
    public DataSource devDataSource() {
        return new DevDataSource(username, password, devUrl);
    }

    @Bean
    @Profile("prod")
    public DataSource prodDataSource() {
        return new ProdDataSource(username, password, prodUrl);
    }
}

Bu örnekte, DatabaseService sınıfı, DataSource arayüzünü kullanarak veritabanına bağlanır. DatabaseConfiguration sınıfı, DataSource sınıfının iki farklı profil için nasıl yapılandırılacağını gösterir. application.properties dosyasında database.username ve database.password özelliklerini ayarlayarak veritabanı kimlik bilgilerini belirleyebilirsiniz.

Application.java

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
        return args -> {
            DataSource dataSource = (DataSource) ctx.getBean("devDataSource");
            dataSource.connect();
        };
    }
}

Yukarıdaki örnekte, DataSource adlı bir arayüz tanımlıyoruz ve DevDataSource ve ProdDataSource sınıfları bu arayüzü uyguluyor. DatabaseConfiguration sınıfı, uygulama iki farklı profil çalıştırdığında hangi veritabanı bağlantısı sınıfını kullanacağını belirler. application.properties dosyasında veritabanı kullanıcı adı, şifre ve iki farklı URL tanımlanır. Son olarak, Application sınıfı, CommandLineRunner arabirimi aracılığıyla DevDataSource nesnesini elde eder ve veritabanına bağlanır.

Spring Boot Port Değiştirmek

pring Boot uygulamasının çalışacağı portu değiştirmek için, application.properties veya application.yml dosyalarını kullanarak yapılandırma dosyasını değiştirebilirsiniz. Bu dosyalar, uygulamanın çalışması için gerekli olan ayarları içerir.

application.properties dosyasını kullanarak, uygulamanın çalışacağı portu aşağıdaki şekilde ayarlayabilirsiniz:

server.port=8081

Bu örnekte, uygulamanın 8081 numaralı bağlantı noktası üzerinde çalışacağı belirtilmiştir. Benzer şekilde, application.yml dosyasını kullanarak aynı ayarlamayı yapabilirsiniz:

server:
  port: 8081

Bu dosya, aynı şekilde uygulamanın 8081 numaralı bağlantı noktası üzerinde çalışacağını belirtir. Ancak, programatik olarak da port ayarlamak mümkündür. Bunu yapmak için, application.properties veya application.yml dosyalarında herhangi bir port numarası belirtmeden, aşağıdaki şekilde SpringApplication sınıfı üzerinden run() metodunu çağırarak uygulama başlatılabilir:

package com.hello.hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class HelloApplication {

	public static void main(String[] args) {
		SpringApplication.run(HelloApplication.class, args);
	}
    @GetMapping("/hello")
    public String hello() {
        return "Merhaba Dünya!";
    }
}

Yukarıdaki örnekte, server.port değeri SpringApplication nesnesine özgü bir özellik olarak ayarlanır. Bu şekilde, uygulama çalıştırıldığında, ayarlanan port numarası kullanılacaktır.

Not: Spring Boot uygulaması, bir web uygulaması olarak tasarlanmışsa, SpringBootServletInitializer sınıfını genişletmek gerekebilir. Bu sınıf, uygulamanın dış dünyaya açık olan HTTP bağlantı noktasını ayarlamak için gereklidir.

Merhaba Dünya Spring Boot Projesi

Spring Boot kullanarak basit bir örnek uygulama oluşturabiliriz. VS Code üzerinde adım adım spring boot projesi oluşturmak için basit düzeyde adımları gösterdim.

Şekil 1. VS Code Üzerinde Spring Initializer Yüklemesi.

Şekil 2. VS Code Üzerinde Spring Boot Version Seçme.

Şekil 3. VS Code Üzerinde Spring Boot için Proje Dili.

Şekil 4. VS Code Üzerinde Spring Boot için Paket Adı.

Şekil 5. VS Code Üzerinde Spring Boot için Java Version Seçimi.

Şekil 6. VS Code Üzerinde Spring Boot için Bağımlılıkların Belirlenmesi.

Aşağıdaki örnek, “Merhaba Dünya” mesajını RESTful bir API üzerinden döndürür.

İlk olarak, pom.xml dosyasında gerekli bağımlılıkları ekleyelim:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

Daha sonra, Spring Boot uygulamasının başlangıç sınıfını tanımlayalım:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class HelloApplication {

    public static void main(String[] args) {
        SpringApplication.run(HelloApplication.class, args);
    }

    @GetMapping("/hello")
    public String hello() {
        return "Merhaba Dünya!";
    }
}

Bu sınıf, @SpringBootApplication anotasyonu ile işaretlenir ve Spring Boot uygulamasının başlangıç noktasını tanımlar. Ayrıca, @RestController anotasyonu ile işaretlenir ve bir RESTful API sunucusu olarak davranır.

Son olarak, @GetMapping("/hello") anotasyonu ile /hello yoluna sahip bir HTTP GET isteği tanımlıyoruz. Bu yol, uygulamanın “Merhaba Dünya” mesajını döndürdüğü bir API olarak kullanılır.

Uygulamayı çalıştırdıktan sonra, http://localhost:8080/hello adresine bir GET isteği gönderdiğimizde, “Merhaba Dünya!” mesajını elde ederiz.

Bu, basit bir Spring Boot uygulaması örneğidir ve Spring Boot’u kullanarak daha karmaşık uygulamalar da oluşturabilirsiniz.

Spring Boot Nedir?

Spring Boot, Java programlama dili için bir web uygulama geliştirme çerçevesidir. Spring Boot, Spring Framework üzerine inşa edilmiştir ve Spring tabanlı uygulamaların hızlı ve kolay bir şekilde oluşturulmasını sağlar.

Spring Boot, Spring Framework’ün birçok bileşenini bir arada sunar ve uygulama geliştiricilerinin ihtiyaç duydukları birçok işlevi hızlı bir şekilde yapılandırabilmelerine olanak tanır. Örneğin, Spring Boot, veritabanı bağlantıları, güvenlik, oturum açma yönetimi, REST API’lerin oluşturulması ve diğer birçok işlevi hızlı bir şekilde yapılandırmanıza olanak tanır.

Spring Boot, mikro hizmet mimarisi için de kullanılabilir ve Docker, Kubernetes ve diğer bulut teknolojileriyle kolayca entegre edilebilir. Bu nedenle, Spring Boot, Java uygulamaları için çok popüler bir seçimdir. Spring Boot, kendine özgü bir “opinionated” yaklaşım benimser, yani uygulama geliştiricilerinin uygulama yapılandırmasını ve yönetimini kolaylaştırmak için önceden belirlenmiş bir dizi varsayılan ayar ve konfigürasyon ile gelir. Bu yaklaşım, uygulama geliştiricilerinin daha az vakit harcayarak uygulama oluşturmalarına ve daha hızlı bir şekilde işe koyulmalarına olanak tanır.

Spring Boot, Maven veya Gradle gibi popüler yapılandırma araçlarıyla kolayca entegre olabilir. Ayrıca, Spring Boot uygulamaları standart bir Java uygulaması gibi paketlenebilir ve başka bir bilgisayara taşınabilir.

Spring Boot ayrıca büyük bir topluluğa sahiptir ve bu topluluk, uygulama geliştiricilerine yardımcı olmak için çok sayıda kaynak sağlar. Bu kaynaklar arasında belgeler, örnek uygulamalar, forumlar ve tartışma grupları yer alır.

Sonuç olarak, Spring Boot, Java programlama dilinde web uygulamaları geliştirmek için kullanılan popüler bir çerçevedir. Kolay kullanımı, hızlı yapılandırması ve geniş topluluğu sayesinde, Spring Boot, Java uygulama geliştiricilerinin ihtiyaçlarını karşılamak için ideal bir seçenektir.

pom.xml, Maven tabanlı bir proje için yapılandırma dosyasıdır ve proje bağımlılıklarını, sürüm numaralarını, plugin yapılandırmalarını, proje açıklamasını ve diğer detayları içerir.

Bir Maven projesinin kök dizininde yer alan pom.xml dosyası, proje yapısının merkezinde yer alır ve proje geliştiricileri tarafından kolayca düzenlenebilir. pom.xml, proje geliştiricilerinin Maven’ın birçok özelliğini kullanarak proje yapısını kolayca yapılandırmasına olanak tanır.

pom.xml dosyası, <project> etiketiyle başlar ve <modelVersion>, <groupId>, <artifactId>, <version> gibi birçok özellik içerir. Örneğin, groupId, proje grubunu, artifactId, proje adını ve version, proje sürümünü tanımlar.

Ayrıca, pom.xml dosyası, proje bağımlılıklarını içerir. Proje geliştiricileri, diğer kütüphanelere bağımlılıklarını bu dosyada tanımlarlar. Maven, proje derleme işlemi sırasında bu bağımlılıkları otomatik olarak yükler ve projenin düzgün çalışmasını sağlar.

Örneğin, aşağıdaki gibi bir pom.xml dosyası, bir Spring Boot projesinin gerekli bağımlılıklarını içerebilir:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>myproject</artifactId>
  <version>1.0.0</version>
  
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <version>2.6.3</version>
    </dependency>
  </dependencies>
</project>

Bu örnek pom.xml dosyası, org.springframework.boot grubundan spring-boot-starter-web kütüphanesinin 2.6.3 sürümüne bağımlıdır. Bu bağımlılık, proje derleme işlemi sırasında otomatik olarak yüklenecektir.