Gereksinimler ve Ön Hazırlık
Projeye başlamadan önce geliştirme ortamınızın güncel olduğundan emin olmalısınız. 2026 yılı itibarıyla Java 21 veya üzeri sürümler, performans ve güvenlik iyileştirmeleri nedeniyle önerilen sürümlerdir.
- Java Development Kit (JDK): En az 21 sürümü.
- Build Tool: Maven veya Gradle (Bu rehberde Maven kullanılacaktır).
- IDE: IntelliJ IDEA veya Eclipse.
- Spring Initializr: Proje iskeletini oluşturmak için start.spring.io adresi.
Projenizi oluştururken "Spring Web", "Spring Data JPA" ve "H2 Database" (veya PostgreSQL) bağımlılıklarını seçmeyi unutmayın. Bu bağımlılıklar, HTTP isteklerini yönetmek ve veritabanı işlemlerini kolaylaştırmak için gereklidir.
Spring Boot Proje Yapısı ve İlk REST Controller
Spring Boot, "Convention over Configuration" (yapılandırmadan ziyade gelenekler) prensibiyle çalışır. Bir REST servisi oluştururken temel yapı taşı @RestController anotasyonudur. Bu anotasyon, sınıfın bir web servisi olduğunu ve metodların doğrudan JSON çıktısı üreteceğini belirtir.
@RestController
@RequestMapping("/api/v1/urunler")
public class UrunController {
@GetMapping
public List tumUrunleriGetir() {
return List.of("Laptop", "Akıllı Telefon", "Tablet");
}
}
Yukarıdaki kod, /api/v1/urunler adresine yapılan GET isteklerine bir liste döndürür. @RequestMapping, tüm metodların ortak yolunu belirlerken, @GetMapping sadece HTTP GET metodunu dinler.
Veri Modeli ve Veritabanı Entegrasyonu
Gerçek bir projede veriler statik değildir. Bir veritabanı tablosunu temsil eden "Entity" (varlık) sınıfları oluşturmanız gerekir. JPA (Java Persistence API), nesneleri veritabanı satırlarına eşlemek için kullanılır.
@Entity
public class Urun {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String isim;
private Double fiyat;
// Getter ve Setter metodları buraya gelecek
}
Bu sınıf, veritabanında "Urun" adında bir tablo oluşturur. @Id anotasyonu birincil anahtarı, @GeneratedValue ise ID değerinin veritabanı tarafından otomatik artırılacağını belirtir.
CRUD İşlemleri İçin Repository Katmanı
Spring Data JPA, SQL sorguları yazmadan veritabanı işlemleri yapmanızı sağlar. Sadece bir arayüz (interface) tanımlayarak tüm CRUD (Create, Read, Update, Delete) fonksiyonlarına sahip olursunuz.
@Repository
public interface UrunRepository extends JpaRepository {
// Ekstra sorgu metodları buraya eklenebilir
}
JpaRepository sınıfını genişleterek, save(), findAll(), deleteById() gibi hazır metodları kullanabilirsiniz. Bu, veritabanı katmanında hata yapma riskini minimize eder.
REST Servislerinde Hata Yönetimi ve Güvenlik
RESTful servislerde istemciye doğru HTTP durum kodlarını dönmek kritiktir. Örneğin, bulunamayan bir kaynak için 404, hatalı istek için 400 kodu dönülmelidir. @ControllerAdvice kullanarak merkezi bir hata yönetimi sağlayabilirsiniz.
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity handleNotFound(ResourceNotFoundException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
}
}
Kritik Güvenlik Uyarısı: REST servislerinde SQL Injection saldırılarını önlemek için asla dinamik SQL sorguları oluşturmayın. Spring Data JPA, hazır metodları ile otomatik olarak parametreli sorgular (Prepared Statements) kullanarak bu açığı kapatır. Ayrıca, hassas verileri loglamaktan kaçının.
RESTful Servis Tasarım Yöntemleri Karşılaştırması
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| Spring Data JPA | Hızlı geliştirme, standart yapı | Karmaşık sorgularda özelleştirme zorluğu |
| JdbcTemplate | Düşük seviye kontrol, yüksek performans | Daha fazla kod yazımı (boilerplate) |
Servis Katmanı (Service Layer) Kullanımı
Controller ile Repository arasına bir servis katmanı koymak, iş mantığını (business logic) ayırmak için en iyi pratiktir. Controller sadece isteği alır, servis ise işi yapar.
@Service
public class UrunService {
@Autowired
private UrunRepository urunRepository;
public Urun urunKaydet(Urun urun) {
return urunRepository.save(urun);
}
}
Bu yapı, kodunuzun test edilebilirliğini artırır. Birim testlerde (Unit Test) UrunRepository'i kolayca "mock"layabilirsiniz.
Sıkça Sorulan Sorular
Spring Boot ile REST servislerinde JSON dönüşümü nasıl özelleştirilir?
Spring Boot varsayılan olarak Jackson kütüphanesini kullanır. @JsonProperty veya @JsonIgnore anotasyonları ile alanların JSON çıktısındaki isimlerini değiştirebilir veya gizleyebilirsiniz.
Neden @Autowired yerine Constructor Injection kullanmalıyım?
Constructor Injection, bağımlılıkların zorunlu olduğunu garanti eder ve birim test yazarken nesneleri manuel olarak enjekte etmeyi kolaylaştırır. 2026 standartlarında en güvenli yöntem budur.
REST servislerinde versiyonlama nasıl yapılır?
Genellikle URL üzerinden (/api/v1/) veya Header üzerinden (Accept-Version) yapılır. URL versiyonlaması, istemciler için en anlaşılır ve yönetilebilir olanıdır.
H2 veritabanını üretim ortamında kullanabilir miyim?
Hayır, H2 bir bellek içi (in-memory) veritabanıdır ve test süreçleri için tasarlanmıştır. Üretim ortamında PostgreSQL, MySQL veya Oracle gibi kalıcı veritabanları tercih edilmelidir.
Spring Security ile REST servisini nasıl korurum?
Spring Security bağımlılığını ekleyerek JWT (JSON Web Token) veya OAuth2 protokollerini uygulayarak servislerinizi yetkisiz erişimlere karşı koruyabilirsiniz.
Spring Boot REST Servislerinde Performans Optimizasyonu
RESTful servislerinizin ölçeklenebilirliği, sadece kodun doğruluğuna değil, aynı zamanda sistem kaynaklarını nasıl yönettiğinize de bağlıdır. Yüksek trafik alan uygulamalarda veritabanı sorgularını minimize etmek ve ağ trafiğini optimize etmek kritik öneme sahiptir.
Pagination ve Sorting Kullanımı
Veritabanından binlerce kayıt çekmek hem bellek (RAM) tüketimini artırır hem de ağ gecikmelerine neden olur. Spring Data JPA'nın sunduğu Pageable arayüzünü kullanarak verileri parçalar halinde sunmalısınız.
@GetMapping("/products")
public Page getAllProducts(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size) {
Pageable paging = PageRequest.of(page, size);
return productRepository.findAll(paging);
}
Caching (Önbellekleme) Mekanizması
Sık değişmeyen veriler için veritabanına her seferinde sorgu atmak yerine Spring Cache kullanabilirsiniz. @Cacheable anotasyonu, metodun sonucunu belleğe alarak bir sonraki çağrıda veritabanı yükünü sıfırlar.
@Cacheable(value = "products", key = "#id")
public Product getProductById(Long id) {
return productRepository.findById(id).orElseThrow();
}
REST Servislerinde Entegrasyon Testleri
Unit testler iş mantığını doğrulamak için yeterli olsa da, REST servislerinde HTTP katmanını ve JSON serileştirme süreçlerini test etmek için MockMvc veya @SpringBootTest kullanılmalıdır.
MockMvc ile Controller Testi
Servis katmanını izole ederek sadece Controller'ın gelen isteklere nasıl yanıt verdiğini test edebilirsiniz.
@WebMvcTest(ProductController.class)
public class ProductControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private ProductService productService;
@Test
public void shouldReturnProductList() throws Exception {
mockMvc.perform(get("/api/products"))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON));
}
}
Performans İpuçları Tablosu
| Strateji | Avantajı |
|---|---|
| Lazy Loading | Gereksiz ilişkili verilerin yüklenmesini engeller. |
| GZIP Sıkıştırma | JSON yanıtlarının boyutunu küçülterek ağ trafiğini azaltır. |
| Asenkron İşlemler | @Async ile uzun süren işlemleri arka plana atar. |
Uygulamanızı canlıya almadan önce Actuator kütüphanesini ekleyerek /actuator/health ve /actuator/metrics uç noktaları üzerinden sistemin anlık durumunu izlemeyi unutmayın. Bu, üretim ortamındaki darboğazları tespit etmek için en hızlı yoldur.
Sonuç
Java ile Spring Boot kullanarak RESTful servis geliştirmek, günümüz yazılım dünyasında hem standart hem de oldukça verimli bir süreçtir. Bu rehberde, bir projenin kurulumundan veritabanı etkileşimine, hata yönetiminden servis katmanı mantığına kadar temel adımları tamamladınız. Bir sonraki adım olarak, Spring Security entegrasyonu ile JWT tabanlı kimlik doğrulama mekanizmalarını araştırmanızı öneririm.
Sorumluluk Reddi: Bu rehber eğitim amaçlıdır. Üretim ortamına alacağınız uygulamalarda mutlaka güncel güvenlik yamalarını takip edin, veritabanı bağlantı şifrelerini çevre değişkenlerinde (environment variables) saklayın ve uygulamalarınızı düzenli olarak sızma testlerine tabi tutun.


Yorumlar (0)
Yorum Yaz