Spring Boot CRUD: READ (Veri Okuma ve Listeleme) İşlemi
Spring Boot uygulamasında veritabanındaki kayıtları okumak (READ) için Spring Data JPA'nın sunduğu findAll() veya findById() metotları kullanılır. Controller katmanında @GetMapping anotasyonu ile bir endpoint oluşturulur ve Service katmanından çekilen veriler istemciye JSON formatında (tercihen 200 OK durum koduyla) döndürülür.
Bu rehberde Spring Boot CRUD operasyonlarından Read (veri okuma) işlemini modern standartlara uygun şekilde nasıl gerçekleştirebileceğinizi adım adım öğreneceksiniz.
1. Spring Boot Proje Mimarisi
Modern ve sürdürülebilir Spring Boot uygulamalarında "Spaghetti Code" yazmamak için kodlar katmanlara ayrılır:
- Entity (Model): Veritabanı tablolarını temsil eder.
- Repository: Veritabanı ile doğrudan iletişim kuran (SQL sorgularını yöneten) katmandır.
- Service: Tüm iş kurallarının (Business Logic) yazıldığı ana beyindir.
- Controller: Frontend, Mobil veya dış istemcilere API uçlarını (Endpoint) açar.
2. Model (Entity) Oluşturma
İlk olarak veritabanındaki users tablosuna karşılık gelen User entity sınıfımızı oluşturuyoruz. Kod kalabalığını önlemek için Lombok, modern Spring Boot 3 standartlarına uymak için ise jakarta.persistence kütüphanesini kullanıyoruz.
package com.example.demo.model;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import lombok.NoArgsConstructor;
@Entity
@Table(name = "users")
@Getter
@Setter
@NoArgsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
}
3. Repository Katmanı
Veritabanı işlemleri için UserRepository interface'ini oluşturuyoruz. JpaRepository'i miras alarak tüm okuma (SELECT) metotlarına ücretsiz sahip olacağız.
package com.example.demo.repository;
import com.example.demo.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
// JpaRepository sayesinde findAll(), findById() gibi metotlar otomatik gelir.
}
4. Service Katmanı (İş Mantığı)
Veriyi doğrudan Controller üzerinden çekmek yerine araya bir Service katmanı koyuyoruz. Bu, ileride verileri listelemeden önce filtreleme veya dönüştürme (DTO mapping) yapmak isterseniz uygulamanızı koruyacaktır.
package com.example.demo.service;
import com.example.demo.model.User;
import com.example.demo.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
public List<User> getAllUsers() {
// Veritabanındaki tüm kullanıcıları liste halinde döner
return userRepository.findAll();
}
}
5. Controller Katmanı (GET Endpoint)
Dış dünyadan gelen HTTP isteklerini karşılamak için UserController sınıfını yazıyoruz. Veri okuma işlemleri her zaman GET metodu (@GetMapping) ile yapılmalıdır.
package com.example.demo.controller;
import com.example.demo.model.User;
import com.example.demo.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/users")
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@GetMapping
public ResponseEntity<List<User>> getAllUsers() {
List<User> users = userService.getAllUsers();
return ResponseEntity.ok(users); // 200 OK durumu ile JSON döner
}
}
6. PostgreSQL Veritabanı Bağlantısı
Uygulamanın veritabanına bağlanabilmesi için src/main/resources/application.properties dosyasına aşağıdaki ayarları ekleyin.
spring.datasource.url=jdbc:postgresql://localhost:5432/databaseAdi
spring.datasource.username=postgres
spring.datasource.password=sifre
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
7. API Test Etme
Uygulamayı çalıştırdıktan sonra tarayıcınızdan veya Postman gibi bir araçtan aşağıdaki URL'ye bir GET isteği göndererek verileri listeleyebilirsiniz:
http://localhost:8080/api/users
Eğer veritabanınızda daha önceden eklenmiş veriler varsa, bu endpoint size tüm kullanıcıların bilgisini temiz bir JSON dizisi olarak döndürecektir.
Sonuç
Bu yazıda Spring Boot CRUD işlemlerinden Read operasyonunu, modern best-practice'lere (Lombok, Constructor Injection, Service katmanı) uygun olarak katmanlı mimaride başarıyla gerçekleştirdik.
Veri ekleme ve silme süreçlerini merak ediyorsanız CREATE ve DELETE rehberlerimizi incelemeyi unutmayın!