Kotlin CRUD Rest Api Applitacion with Spring Boot, Hibernate, Postgres, Docker and Docker Compose

M.Feyzi Sağlam
AgeSA İş Teknolojileri
5 min readJun 28, 2024

Servis tabanlı çalışan uygulama mimarisinde farklı servislerin aynı jvm üzerinde hem kotlin hem java kodlayarak spring boot framework üzerinde çalışabilmektedir.

Projemizdeki temel motivasyon spring boot frameworkte yoğun bir şekilde kullanılan java uygulamalarındaki lombook annotation larından ziyade kotlin kullanarak temel yapıda daha temiz kod mimarisine geçişi hedefliyoruz.

Kotlin ve Spring Boot kullanarak REST CRUD API oluşturmayı adım adım gerçekleştirelim:

Kullanılan Tech Stack

  • Spring boot
  • Gradle
  • Hibernate
  • Postgres
  • Docker
  • Docker Compose

Oluşturacağımız uygulama mimarisinin şeması aşağıda verilmiştir:

Temel CRUD işlemleri için 5 end point oluşturacağız:

  • Create → Nesnenin veri tabanında oluşturulması
  • Read all → Veri tabanından tüm kayıtların okunması
  • Read one → Sadece ilgi kaydın veri tabanından getirilmesi
  • Update → İlgili kaydın veri tabanında güncellenmesi
  • Delete → İlgili kaydın veri tabanından silinmesi

Projenin gerçeklenmnesi için yapılması gereken adımlar:

  1. Spring Initializr’ı kullanarak bir Spring Boot projesi oluşturma
  2. Veri tabanı bağlantısını yapılandırılması
  3. User.kt, UserRepository.kt and UserService.kt oluşturulması
  4. Dockerize the application
  5. Veri tabanını ve uygulamayı çalıştırmak için docker-compose.yml dosyasını oluşturulması

Gereksinimler:

  • Kotlini yükleyiniz
  • Docker kendi ortamınızda kurun ve çalıştırınız
  • (Opsiyonel): Postman üzerinden yazılan end pointlerini test edebilmeniz için lokal makinanıza kurup deneyebilirsiniz.

🚀 Yeni Kotlin Projesi Oluşturma

Yeni bir Kotlin projesi oluşturmanın birçok yolu var ama ben Spring Initializr’ı kullanacağım.

İntellij ide sini açarak “New Project” tıklayınız.

Bu, ekranı next ile ilerledikten sonra açılan yeni prompt ekranında bir bilgi istemi açacaktır. Sırayla aşağıdakilere tıklayın ;

  • Spring Web ( Rest API oluşturmak için )
  • Spring Data JPA ( Hibernate kullanımı için )
  • PostgreSQL Driver (Postgres veri tabanı bağlantısı için)

Dependency seçimleri yapıldıktan sonra Create tuşuna basarak projemizi kendi makinamızda hazır hale getirmiş oluyoruz.

👩‍💻 Code the application

Uygulamayı kodlamanın iki adımı vardır:

  • Veri tabanı bağlantısını kurulması ve yapılandırılması
  • User entity, the UserRepository and the UserService oluşturulması.

🔗 Veri tabanı bağlantısını yapılandırılması

application.properties dosyasını açın, dosya dizni src/main/resources (açılan dosya muhtemelen yapılandırılmamış ve boş olacaktır).

Aşağıdaki içeriği ekleyin:

Açıklama:

  • spring.datasource.url: veri tabanının URL’i.
  • spring.datasource.username: veri tabanının kullanıcı adı.
  • spring.datasource.password: veri tabanının şifresi.
  • spring.jpa.hibernate.ddl-auto:veri tabanını güncelleme şeklimiz. Tablolar mevcut değilse oluşturmak için güncellemeyi kullanacağız ve varsa bunları güncelleyeceğiz.
  • spring.jpa.properties.hibernate.dialect: veri tabanının dialecti olarak PostgreSQL kullanacağız.

📁 Kaynak yapısını oluşturulması

Kotlin Example klasöründe (veya projenizde nasıl adlandırdıysanız) Users adında yeni bir klasör oluşturun.

Bu klasörde dört dosya oluşturun:

  • User.kt
  • UserRepository.kt
  • UserService.kt
  • UserController.kt

Klasör yapınızın son hali şöyle görünmeli:

Şimdi oluşturduğumuz dosyaları kodlayalım.

User.kt

User.kt dosyası kullanıcının varlığını içerecektir.

Dosyayı açın ve aşağıdaki içeriği ekleyin (paket adını projenize uyacak şekilde değiştirin):

Açıklama:

  • @Entity: Hibernate’e bu sınıfın bir entity olduğunu söylemesi.
  • @Table: Hibernate’e veri tabanındaki tablonun adını söyleyecektir (“bu durumda Users”).
  • @Id: Bu alanın birincil alan olduğunu belirtmekte.
  • @GeneratedValue: Yeni bir kullanıcı oluşturduğumuzda kimliği otomatik olarak artırmaktadır.

UserRepository.kt

UserRepository.kt dosyası veri tabanıyla etkileşime girecek arayüzü içerecektir.

UserRepository.kt dosyasını açın ve aşağıdaki içeriği ekleyin (farklı bir ad kullandıysanız paket adını değiştirin):

Açıklama:

  • interface UserRepository: veri tabanıyla etkileşime girecek yöntemleri içerecek arayüz. CrudRepository türünde olacak. Bu, veri tabanıyla etkileşime geçmek için temel yöntemleri içeren genel bir arayüzdür User ve Int (Nesnenin türü user ve birincil anahtarın türünü int olacaktır).

UserController.kt

UserController.kt dosyası Rest API’sini içerecektir

UserController.kt dosyasını açın ve aşağıdaki içeriği ekleyin (farklı bir ad kullandıysanız paket adını değiştirin):

Açıklama:

  • @RestController: Api tabanlı uygulamlarda direk veriyi dönmek için kullanılır.
  • @RequestMapping:Spring’e Rest API’sinin temel URL’sini söylemek için. Bu durumda olacak/api/users.
  • @Autowired: UserRepository sınıfının injekt etmek için kullanılmaktadır. Ben projemde constructor injekt kullandım spring tarafından @Autowired önerilmiyor.

Daha sonra veri tabanıyla etkileşime geçmek için beş yöntemimiz bulunmaktadır.

  • getAllUsers: Veri tabanındaki tüm user listesini getirmektedir.
  • createUser: Veri tabanına yeni bir user kayıt etmektedir.
  • getUserById: id ile eşleşen kullanıcıyı getirmektedir.
  • updateUserById: id ile eşleşen kullanıcıyı yeni bilgileri ile güncellemektedir.
  • deleteUserById: id ile eşleşen kullanıcıyı silmektedir.

🐳 Dockerization

Bu projede Kotlin projesini doğrudan Docker imajının içine inşa etmeye karar verdim.

Diğer bir seçenek de projeyi yerel olarak oluşturmak ve ardından jar dosyasını Docker görüntüsüne kopyalamak olacaktır.

🐋 Dockerfile

Projenin kök dizininde Dockerfile adında yeni bir dosya oluşturun.

Aşağıdaki içeriği ekleyin (yorum satırlarında açıklamalarda bulundum):

⚠️ Buradaki alışılmadık kısım ARG satırlarıdır. Argümanları Docker image iletmek için kullanılırlar. Docker-compose.yml dosyasında tanımlanırlar.

🐙 docker-compose.yml

Projenin kök dizininde docker-compose.yml dosyasını oluşturalım.

Aşağıdaki içeriği ekleyin (açıklama yorumlardadır):

Build and run the project

Artık projeyi derleyip çalıştırabiliriz.

💽Postgres veri tabanını çalıştırın

Öncelikle Postgres veri tabanını çalıştırmamız gerekiyor.

Çalışıp çalışmadığını kontrol etmek için aşağıdaki komutu kullanabilirsiniz:

sonrasında

Çıktı aşağıdaki gibiyse, hazırsınız:

🏗️ Build and Run the project

Projeyi Docker imajının içinde oluşturalım.

Artık projeyi çalıştırabiliriz.

🏁Sonuç

Başardık! Aşağıdakileri kullanarak Kotlin’de bir CRUD API’si oluşturduk:

  • Spring boot
  • Gradle
  • Hibernate
  • Postgres
  • Docker
  • Docker Compose

--

--