Kotlin CRUD Rest Api Applitacion with Spring Boot, Hibernate, Postgres, Docker and Docker Compose
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:
- Spring Initializr’ı kullanarak bir Spring Boot projesi oluşturma
- Veri tabanı bağlantısını yapılandırılması
- User.kt, UserRepository.kt and UserService.kt oluşturulması
- Dockerize the application
- 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ürUser
veInt
(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