Gereksinimler ve Ön Hazırlık
Projeye başlamadan önce bilgisayarınızda aşağıdaki araçların kurulu olduğundan emin olmalısınız. 2026 standartlarında Java 21 veya üzeri sürümlerin kullanılması, performans ve güvenlik güncellemelerinden yararlanmanız için kritiktir.
- JDK 21+: Java Development Kit, uygulamanızın çalışması için gerekli temel ortamdır.
- Maven veya Gradle: Proje bağımlılıklarını yönetmek için kullanılan yapılandırma araçlarıdır.
- IDE: IntelliJ IDEA veya Eclipse gibi modern bir geliştirme ortamı.
- Postman veya cURL: Geliştirdiğiniz servisleri test etmek için kullanılacak araçlar.
Spring Initializr (start.spring.io) üzerinden projenizi oluştururken "Spring Web" bağımlılığını eklemeyi unutmayın. Bu bağımlılık, Tomcat sunucusunu ve gerekli REST kütüphanelerini otomatik olarak projenize dahil edecektir.
Spring Boot Proje Yapısı ve İlk REST Denetleyicisi
Spring Boot'ta bir REST servisi oluşturmanın ilk adımı, HTTP isteklerini karşılayacak bir "Controller" (denetleyici) sınıfı oluşturmaktır. Bu sınıf, gelen istekleri işler ve uygun yanıtları döndürür.
@RestController
@RequestMapping("/api/v1/urunler")
public class UrunController {
@GetMapping
public List tumUrunleriGetir() {
return List.of("Laptop", "Akıllı Telefon", "Tablet");
}
}
Yukarıdaki kodda, @RestController anotasyonu, bu sınıfın bir web denetleyicisi olduğunu ve döndürülen verilerin doğrudan JSON formatında yanıt gövdesine yazılacağını belirtir. @GetMapping ise HTTP GET isteklerini bu metoda yönlendirir.
Veri Modeli ve DTO Kullanımı
Gerçek dünya uygulamalarında veriler doğrudan veritabanı nesneleriyle (Entity) dış dünyaya açılmamalıdır. Bunun yerine DTO (Data Transfer Object) kullanımı, veri güvenliği ve API sözleşmelerinin korunması için şarttır.
public record UrunDTO(Long id, String isim, Double fiyat) {}
Java 16+ ile gelen record yapısı, verileri taşımak için oldukça hafif ve güvenlidir. Bu yapıyı kullanarak veritabanından gelen bilgileri güvenli bir şekilde istemciye sunabiliriz.
CRUD İşlemleri: Veri Ekleme ve Güvenlik
REST servislerinde veri girişi için POST metodu kullanılır. Kullanıcıdan gelen veriyi alırken mutlaka doğrulama (validation) yapmalı ve SQL Injection gibi saldırılara karşı hazırlıklı olmalısınız. Spring Boot'ta @Valid anotasyonu ile bu süreci yönetebiliriz.
@PostMapping
public ResponseEntity urunEkle(@Valid @RequestBody UrunDTO urun) {
// Veritabanı kayıt işlemleri burada yapılır
return new ResponseEntity(urun, HttpStatus.CREATED);
}
Burada @RequestBody, gelen JSON verisini Java nesnesine dönüştürür. ResponseEntity kullanımı, HTTP durum kodlarını (201 Created gibi) kontrol etmemizi sağlar.
Kritik Güvenlik Uyarısı: Kullanıcıdan gelen verileri asla doğrudan veritabanı sorgularında kullanmayın. Spring Data JPA kullanıyorsanız, parametreli sorgular (JPQL veya Criteria API) kullanarak SQL Injection saldırılarını otomatik olarak engelleyebilirsiniz.
REST Servislerinde Hata Yönetimi
Beklenmedik durumlarda uygulamanın çökmesini engellemek ve istemciye anlamlı hata mesajları döndürmek için @ControllerAdvice yapısı kullanılır. Bu, uygulamanızın genelinde hata yönetimini merkezileştirir.
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity handleNotFound(ResourceNotFoundException ex) {
return new ResponseEntity(ex.getMessage(), HttpStatus.NOT_FOUND);
}
}
Bu yapı, uygulamanın herhangi bir yerinde ResourceNotFoundException fırlatıldığında, kullanıcının 404 hata koduyla karşılaşmasını sağlar.
REST Servislerini Test Etme Yöntemleri
Geliştirdiğiniz servislerin doğruluğunu kanıtlamak için birim testler (unit test) yazmalısınız. Spring Boot'un sunduğu MockMvc sınıfı, gerçek bir sunucu ayağa kaldırmadan HTTP isteklerini simüle etmenize olanak tanır.
@WebMvcTest(UrunController.class)
class UrunControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
void urunListesiTesti() throws Exception {
mockMvc.perform(get("/api/v1/urunler"))
.andExpect(status().isOk());
}
}
Bu test, /api/v1/urunler endpoint'inin başarılı bir şekilde yanıt verip vermediğini doğrular.
REST Servisleri İçin Karşılaştırma Tablosu
| Yöntem | Kullanım Amacı | Güvenlik Notu |
|---|---|---|
| GET | Veri okuma | Hassas verileri URL'de göndermeyin. |
| POST | Yeni veri oluşturma | CSRF koruması aktif edilmelidir. |
| PUT | Veri güncelleme | Yetkilendirme kontrolü şarttır. |
| DELETE | Veri silme | Admin yetkisi gerektirir. |
Sıkça Sorulan Sorular
Spring Boot ile REST servislerinde neden DTO kullanmalıyım?
DTO kullanımı, veritabanı şemanız ile API sözleşmenizi birbirinden ayırır. Böylece veritabanında yaptığınız bir değişiklik, API'nizi kullanan istemcileri doğrudan etkilemez.
@RestController ve @Controller arasındaki fark nedir?
@RestController, @Controller ve @ResponseBody anotasyonlarının birleşimidir. Tüm metodların otomatik olarak JSON döndürmesini sağlar.
Uygulamamı nasıl güvenli hale getirebilirim?
Spring Security kütüphanesini kullanarak JWT (JSON Web Token) tabanlı kimlik doğrulama mekanizmalarını projenize entegre etmelisiniz.
Hangi veritabanı ile çalışmalıyım?
Spring Boot, Hibernate üzerinden neredeyse tüm ilişkisel veritabanlarını (PostgreSQL, MySQL, Oracle) destekler. Projenin ölçeğine göre seçim yapabilirsiniz.
REST servislerinde versiyonlama nasıl yapılır?
URL içerisinde /api/v1/ veya /api/v2/ şeklinde belirteçler kullanarak veya Header üzerinden versiyon bilgisi göndererek sürüm yönetimini sağlayabilirsiniz.
Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Üretim ortamına (production) çıkmadan önce mutlaka OWASP standartlarına uygun güvenlik denetimlerini yapmalı ve şifreleme/yetkilendirme süreçlerini profesyonelce yapılandırmalısınız.
Spring Boot REST Servislerinde Performans Optimizasyonu
RESTful servisleriniz ölçeklendikçe, veritabanı sorgularının ve JSON serileştirme süreçlerinin performansa etkisi kritik hale gelir. Uygulamanızın yanıt sürelerini düşürmek için aşağıdaki stratejileri uygulayabilirsiniz.
Veritabanı Sorgularında Lazy Loading ve N+1 Problemi
JPA/Hibernate kullanırken ilişkili verileri çekerken "N+1" problemiyle karşılaşmak yaygındır. Bunu engellemek için @EntityGraph veya JOIN FETCH kullanarak ilişkili verileri tek bir sorguda getirmelisiniz.
@Repository
public interface UserRepository extends JpaRepository {
@EntityGraph(attributePaths = {"roles"})
List findAll();
}
Caching (Önbellekleme) Mekanizması
Sık erişilen ancak nadir değişen veriler için Spring Cache desteğini kullanmak, veritabanı yükünü ciddi oranda azaltır. @Cacheable notasyonu ile metodun çıktısını belleğe alabilirsiniz.
@Service
public class ProductService {
@Cacheable(value = "products", key = "#id")
public Product getProductById(Long id) {
return productRepository.findById(id).orElseThrow();
}
}
REST API Dokümantasyonu: OpenAPI ve Swagger Entegrasyonu
Geliştirdiğiniz API'lerin diğer geliştiriciler tarafından kolayca anlaşılması için dokümantasyon şarttır. Spring Boot projelerinde springdoc-openapi kütüphanesi, kodunuzu analiz ederek otomatik bir Swagger UI arayüzü oluşturur.
Bağımlılık Ekleme
Öncelikle pom.xml dosyanıza gerekli kütüphaneyi ekleyin:
org.springdoc
springdoc-openapi-starter-webmvc-ui
2.2.0
API Bilgilerini Yapılandırma
Uygulamanızın genel bilgilerini bir konfigürasyon sınıfı ile özelleştirebilirsiniz:
@Configuration
public class OpenApiConfig {
@Bean
public OpenAPI customOpenAPI() {
return new OpenAPI()
.info(new Info()
.title("Kurumsal REST API")
.version("1.0")
.description("Spring Boot ile geliştirilmiş örnek API dokümantasyonu."));
}
}
Bu yapılandırmadan sonra, uygulamanızı çalıştırıp /swagger-ui.html adresine giderek tüm endpoint'lerinizi görsel bir arayüz üzerinden test edebilir ve dokümanlarını inceleyebilirsiniz.
REST Servislerinde Asenkron İşlemler
Uzun süren işlemler (e-posta gönderimi, büyük dosya işleme vb.) HTTP yanıt süresini uzatır. Bu tür işlemleri @Async kullanarak ana iş parçacığından ayırabilirsiniz.
@Service
public class NotificationService {
@Async
public void sendEmail(String email) {
// Uzun süren e-posta gönderim mantığı
System.out.println("E-posta gönderiliyor: " + email);
}
}
Bu özelliği kullanabilmek için ana uygulama sınıfınızda @EnableAsync notasyonunu aktif etmeyi unutmayın.
Sonuç
Java ile Spring Boot kullanarak RESTful servis geliştirmek, günümüz kurumsal yazılım dünyasının temel taşıdır. Bu rehberde öğrendiğiniz Controller yapısı, DTO kullanımı, hata yönetimi ve test stratejileri, profesyonel bir API geliştirme sürecinin başlangıcıdır. Bir sonraki adım olarak, Spring Security ile güvenli bir kimlik doğrulama sistemi kurmayı ve Swagger/OpenAPI ile API dokümantasyonunuzu otomatik oluşturmayı araştırmanızı öneririm.


Yorumlar (0)
Yorum Yaz