Java İle Spring Boot Üzerinden Rest Apı Nasıl Yapılır?

Java İle Spring Boot Üzerinden Rest Apı Nasıl Yapılır?
Java İle Spring Boot Üzerinden Rest Apı Nasıl Yapılır?

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. Spring Boot 3.x sürümleri, en az Java 17, önerilen olarak ise Java 21 gerektirir. İhtiyacınız olan temel araçlar şunlardır:

  • JDK 21 veya üzeri: Uygulamanın çalışacağı temel Java ortamı.
  • IDE: IntelliJ IDEA (Community veya Ultimate) veya Eclipse.
  • Build Tool: Maven veya Gradle.
  • Spring Initializr: Proje iskeletini oluşturmak için start.spring.io adresini kullanacağız.

Projenizi oluştururken "Spring Web", "Spring Data JPA", "H2 Database" (veya PostgreSQL) ve "Lombok" bağımlılıklarını seçmeniz, geliştirme sürecinizi oldukça hızlandıracaktır.

Spring Boot Proje Yapısını Anlamak

Spring Boot, "Convention over Configuration" (Yapılandırmadan ziyade kural) prensibiyle çalışır. Bu, standart bir klasör yapısına uyduğunuzda Spring'in birçok şeyi otomatik halledeceği anlamına gelir. Projenizde dikkat etmeniz gereken katmanlar şunlardır:

  • Controller: HTTP isteklerini karşılayan ve yanıtı döndüren katman.
  • Service: İş mantığının (business logic) yürütüldüğü katman.
  • Repository: Veritabanı işlemlerinin (CRUD) yapıldığı katman.
  • Model/Entity: Veritabanı tablolarını temsil eden Java sınıfları.

Adım Adım Model ve Repository Oluşturma

API'nizin temelini oluşturacak olan Entity sınıfını tanımlayalım. Bir "Ürün" (Product) yönetimi yaptığımızı varsayalım. Entity sınıfı, veritabanındaki tablonun bir yansımasıdır.


@Entity
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private Double price;

    // Getter ve Setter metotları (Lombok @Data anotasyonu ile otomatik oluşturulabilir)
}

Ardından, veritabanı işlemlerini kolaylaştıran Repository arayüzünü oluşturalım. Spring Data JPA sayesinde SQL yazmanıza gerek kalmadan veritabanı sorgularını yönetebilirsiniz.


@Repository
public interface ProductRepository extends JpaRepository {
    // Ekstra sorgular buraya eklenebilir
}

Controller Katmanı ile REST Endpoint'lerini Yazma

REST API'nin dış dünyaya açılan kapısı Controller sınıfıdır. Burada @RestController anotasyonu, sınıfın bir REST API olduğunu belirtir. @RequestMapping ise API'nin temel yolunu tanımlar.


@RestController
@RequestMapping("/api/products")
public class ProductController {
    
    @Autowired
    private ProductRepository repository;

    @GetMapping
    public List getAllProducts() {
        return repository.findAll();
    }

    @PostMapping
    public Product createProduct(@RequestBody Product product) {
        return repository.save(product);
    }
}

Bu kod bloğu, HTTP GET isteği geldiğinde tüm ürünleri listeler, POST isteği geldiğinde ise JSON formatındaki veriyi veritabanına kaydeder.

Veri Doğrulama ve Hata Yönetimi

API'nizin güvenilir olması için gelen verileri doğrulamanız şarttır. jakarta.validation kütüphanesini kullanarak hatalı girişleri engelleyebilirsiniz. Aşağıdaki örnekte, ürün isminin boş olamayacağını belirtiyoruz.


public class Product {
    @NotNull(message = "Ürün ismi boş olamaz")
    private String name;
    
    @Min(value = 0, message = "Fiyat negatif olamaz")
    private Double price;
}

Hata yönetimi için @ControllerAdvice kullanarak tüm uygulamada geçerli olacak merkezi bir hata yakalama mekanizması kurabilirsiniz. Bu, kullanıcılara anlamlı hata mesajları döndürmenizi sağlar.

REST API Güvenliği ve İpuçları

Kritik Güvenlik Uyarısı: Üretim ortamında (Production) asla varsayılan veritabanı şifrelerini kullanmayın. API'nizi korumak için Spring Security entegrasyonu yapın ve JWT (JSON Web Token) gibi modern kimlik doğrulama yöntemlerini tercih edin. Ayrıca, SQL Injection riskine karşı her zaman JPA'nın sunduğu hazır metotları veya güvenli sorgu parametrelerini kullanın.

API geliştirirken dikkat etmeniz gereken yöntemlerin karşılaştırması aşağıdadır:

Yöntem Avantajı Dezavantajı
Spring Data JPA Hızlı geliştirme, standart sorgular Karmaşık sorgularda performans kaybı
Native SQL Yüksek performans Güvenlik riskleri (SQL Injection)

Sıkça Sorulan Sorular

Spring Boot'ta neden @RestController kullanmalıyız?

@RestController, @Controller ve @ResponseBody anotasyonlarının birleşimidir. Bu sayede metodun döndürdüğü nesne doğrudan JSON formatına dönüştürülerek HTTP yanıt gövdesine yazılır.

Uygulamayı nasıl test edebilirim?

Postman veya Insomnia gibi araçları kullanabilirsiniz. Ayrıca, Spring Boot ile gelen MockMvc sınıfı ile birim (unit) testleri yazarak API uç noktalarınızı otomatize edebilirsiniz.

Veritabanı bağlantısını nasıl ayarlarım?

Projenizdeki src/main/resources/application.properties dosyasına veritabanı URL'nizi, kullanıcı adınızı ve şifrenizi ekleyerek bağlantıyı yapılandırabilirsiniz.

Hangi veritabanını kullanmalıyım?

Geliştirme aşamasında H2 (in-memory) idealdir. Ancak canlıya çıkarken PostgreSQL veya MySQL gibi dayanıklı veritabanı sistemleri tercih edilmelidir.

API versiyonlaması nasıl yapılır?

URL üzerinden (örn: /api/v1/products) veya Header üzerinden versiyonlama yapmak, gelecekteki değişikliklerde geriye dönük uyumluluğu korumanızı sağlar.

API Performansını Optimize Etme Stratejileri

REST API'nizin ölçeklenebilirliği, kullanıcı sayısı arttıkça kritik bir öneme sahip olur. Spring Boot uygulamalarında performans darboğazlarını aşmak için aşağıdaki yöntemleri uygulayabilirsiniz.

1. Veritabanı Sorgularını İyileştirme (N+1 Problemi)

JPA kullanırken en sık karşılaşılan performans sorunu N+1 problemidir. Bir ana varlığı çekerken ilişkili verileri tek tek sorgulamak yerine JOIN FETCH kullanarak sorgu sayısını minimize edin.

@Query("SELECT u FROM User u JOIN FETCH u.orders WHERE u.id = :id")
Optional findByIdWithOrders(@Param("id") Long id);

2. Response Cache (Yanıt Önbellekleme)

Sık değişmeyen veriler için @Cacheable anotasyonunu kullanarak veritabanı yükünü azaltabilirsiniz. Spring Boot'un yerleşik önbellek mekanizması, uygulama performansını ciddi oranda artırır.

@Cacheable(value = "products", key = "#id")
public Product getProductById(Long id) {
    return productRepository.findById(id).orElseThrow();
}

Spring Boot API'lerinde İleri Düzey Hata Ayıklama (Debugging)

Üretim ortamında oluşan hataları izlemek için standart loglamanın ötesine geçmeniz gerekir. Spring Boot Actuator, uygulamanızın sağlık durumunu izlemek için en güçlü araçtır.

Actuator ile İzlenebilirlik

pom.xml dosyanıza spring-boot-starter-actuator bağımlılığını ekleyerek uygulamanızın çalışma zamanı metriklerine erişebilirsiniz. Bu araç, uygulamanın bellek kullanımı, thread durumu ve veritabanı bağlantı havuzu hakkında detaylı bilgi sağlar.


    org.springframework.boot
    spring-boot-starter-actuator

Uygulamanız çalışırken /actuator/health endpoint'ine giderek sistemin genel sağlık durumunu kontrol edebilirsiniz. Üretim ortamında bu endpoint'leri korumak için application.properties üzerinde şu ayarları yapmanız önerilir:

management.endpoints.web.exposure.include=health,info,metrics
management.endpoint.health.show-details=when_authorized

Global Exception Handler ile Detaylı Loglama

Hata ayıklamayı kolaylaştırmak için @ControllerAdvice kullanarak tüm hataları merkezi bir noktada yakalayın ve bunları log dosyalarına anlamlı bir formatta yazdırın.

@ControllerAdvice
public class GlobalExceptionHandler {
    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    @ExceptionHandler(Exception.class)
    public ResponseEntity handleAllExceptions(Exception ex) {
        logger.error("Beklenmeyen hata oluştu: ", ex);
        return ResponseEntity.status(500).body("Sistem hatası oluştu, lütfen daha sonra tekrar deneyin.");
    }
}

Sonuç

Java ile Spring Boot kullanarak REST API geliştirmek, doğru yapılandırıldığında oldukça verimli ve sürdürülebilir bir süreçtir. Bu rehberde; proje kurulumundan, katmanlı mimariye, veri doğrulamasından güvenlik temellerine kadar kritik adımları öğrendiniz. Bir sonraki adım olarak, Spring Security ile JWT tabanlı kimlik doğrulama ekleyerek API'nizi daha güvenli hale getirebilir veya Swagger (OpenAPI) entegrasyonu ile API dokümantasyonunuzu otomatikleştirerek geliştirici deneyimini iyileştirebilirsiniz.

Yasal Sorumluluk Reddi: Bu içerik eğitim amaçlıdır. Yazılım güvenliği sorumluluğu geliştiriciye aittir. Paylaşılan kod örnekleri, üretim ortamına taşınmadan önce güvenlik testlerinden geçirilmeli ve güncel güvenlik yamaları uygulanmalıdır.

Bu yazıya tepkinizi paylaşın:
Deniz Aydın

On yıllık yaşam tarzı editörlüğü deneyimimle karmaşık süreçleri herkesin anlayabileceği basit adımlara dönüştürüyorum. Okuyucuların günlük yaşam kalitesini artıracak uygulanabilir çözümler üretmeye odaklanıyorum.

Yorumlar (0)

Yorum Yaz