• 30.10.2026 19:00:11
  • İbrahim Gökyar

Spring Web Services (Spring-WS) ile SOAP servisleri yönetmenin incelikleri ve bunlardan REST/HTTP/Reactive alternatiflere geçiş yolları. Uygulama örnekleri, kontrat yaklaşımları ve pratik geçiş stratejileri içerir.

Spring Web Services ile SOAP'tan REST'e Geçiş: Modern Yaklaşımlar

Spring Web Services (Spring-WS), Java ekosisteminde SOAP tabanlı web servisleri oluşturmak için uzun süredir kullanılan bir kütüphanedir. Kurumsal dünyada hâlâ yoğun şekilde kullanılan SOAP servisleriyle çalışırken, modern mimarilere (REST, Reactive, gRPC) geçiş ihtiyacı sıkça gündeme gelir. Bu makalede Spring-WS'nin temel kavramlarını, kontrat-first vs code-first yaklaşımlarını, performans ve bakım açısından dikkat edilmesi gerekenleri ve SOAP'tan REST/Reactive/gRPC'ye geçiş stratejilerini örnek kodlarla ele alacağım.

Spring Web Services temelleri ve kontrat yaklaşımları

Spring-WS, özellikle WSDL ve XSD temelli sözleşme (contract) geliştirmeyi kolaylaştırır. 'Contract-first' yaklaşımıyla önce XSD/WSDL tanımları yazılır, daha sonra bu tanımlar JAXB veya başka araçlarla Java sınıflarına dönüştürülür. Böylece servis sözleşmesi sabitlenir ve istemcilerle net bir kontrat paylaşılabilir.

Diğer yandan 'code-first' (veya POJO-first) yaklaşımda önce Java sınıfları yazılır; WSDL veya XSD ihtiyaç duyulursa sonradan türetilir. Kurumsal projelerde interoperabilite ve uzun vadeli sözleşme stabilitesi için contract-first tercih edilirken, hızlı prototiplerde code-first tercih edilebilir.

<!-- pom.xml için örnek Spring-WS bağımlılığı (Spring Boot ile) -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web-services</artifactId>
</dependency>

Örnek: Basit bir SOAP endpoint (Contract-first)

Aşağıda basit bir contract-first örneği gösterilmiştir. Önce XSD tanımı oluşturup JAXB ile sınıfları üretiriz, sonra Spring-WS üzerinden endpoint implementasyonu yazarız. Böylece payload tabanlı mapping yapabiliriz (MarshallingUnmarshalling).

<!-- örnek XSD: order.xsd -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           targetNamespace="http://example.com/order" 
           xmlns:tns="http://example.com/order" elementFormDefault="qualified">
  <xs:element name="PlaceOrderRequest" type="tns:PlaceOrderRequestType"/>
  <xs:complexType name="PlaceOrderRequestType">
    <xs:sequence>
      <xs:element name="itemId" type="xs:string"/>
      <xs:element name="quantity" type="xs:int"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

<!-- Endpoint -->
package com.example.ws;

@Endpoint
public class OrderEndpoint {
  private static final String NAMESPACE = "http://example.com/order";

  @PayloadRoot(namespace = NAMESPACE, localPart = "PlaceOrderRequest")
  @ResponsePayload
  public JAXBElement<PlaceOrderResponseType> placeOrder(@RequestPayload JAXBElement<PlaceOrderRequestType> request) {
    // iş mantığı
  }
}

Neden REST veya Reactive'e geçilmeli? Artıları ve sınırlamalar

SOAP güçlü bir standart, işlem güvenliği (WS-Security), işlem yönetimi ve gelişmiş sözleşme yetenekleri sunar. Ancak JSON/HTTP tabanlı REST servisleri, daha basit istemci desteği, daha düşük bant genişliği kullanımı ve bulut-native mimarilerle daha iyi uyum sağlar. Ayrıca modern API gateway, servis mesh ve mobil/web istemciler için REST genellikle daha pratiktir.

Reactive (Spring WebFlux) ise I/O-bound, yüksek eşzamanlılık gerektiren senaryolarda tercih edilir. Yüksek bağlantı sayısında thread tüketimini azaltır ve kaynak kullanımını optimize eder. Ancak reactive programlama zihniyeti ve veri akışına uygun tasarım gerektirir; tüm bağımlılıklarınız reaktif olmalı veya adaptasyon katmanı eklemelisiniz.

SOAP'tan REST'e geçiş stratejisi: adım adım

Geçiş sürecini birkaç etapta ele almak uygulanabilirliği artırır ve riski azaltır. Önerilen adımlar şunlardır:

  • Mevcut servislerin en sık kullanılan operasyonlarını ve sözleşmelerini analiz et.
  • Hangi yöntemlerin transactional/WS-Security gerektirdiğini belirle; kritik olanları önceliklendir.
  • Contract-first ise JSON Schema / OpenAPI (Swagger) tanımlarını oluştur; mevcut XSD'den dönüştürme ve uyumluluk katmanı oluştur.
  • Yeni REST API'leri small-grained (küçük, tek sorumluluklu) endpointlere böl; idempotency, hata kodları ve versiyonlama stratejisini belirle.
  • Gateway/adapter kullanarak SOAP ve REST'i paralel çalıştır; bir süreliğine her iki ara yüzü de destekle ve istemcileri kademeli taşı.

Bu strateji sayesinde anında ani kesintiler olmadan, geriye dönük uyumluluk korunarak geçiş yapılabilir.

Örnek: SOAP -> REST adapter nasıl yazılır?

Geçiş sürecinde adapter katmanı, eski SOAP arayüzünü korurken iç iş mantığını yeni REST servislerine yönlendirmek için kullanılır. Bu, istemcileri aynı kalırken altyapıyı modernize etmenizi sağlar.

// Basit adapter örneği (conceptual)
@RestController
@RequestMapping("/api/orders")
public class OrderAdapterController {

  private final SoapOrderClient soapClient; // eski SOAP istemcisi
  private final RestOrderService restService; // yeni REST servisi

  @PostMapping
  public ResponseEntity<OrderResponse> placeOrder(@RequestBody OrderRequest req) {
    // Öncelikle yeni REST servisine çağrı yap
    OrderResponse resp = restService.createOrder(req);
    // Eğer gerekli, SOAP tarafına asenkron replika/aynılaştırma yapılabilir
    return ResponseEntity.status(HttpStatus.CREATED).body(resp);
  }
}

Bu örnekte, adapter doğrudan SOAP istemcisine ihtiyaç duymayabilir; tersine, eski istemcileri korumak için SOAP endpoint'i arka planda çağıran bir adaptör de oluşturabilirsiniz. Amaç istemcilere kesintisiz deneyim sağlamak ve arka uçta modernizasyon yapmaktır.

Alternatifler: gRPC ve WebFlux kullanımı

Eğer servisleriniz microservice mimarisinde yüksek performanslı binary protokoller gerektiriyorsa gRPC değerlendirilmelidir. gRPC, protokol buffer tabanlı daha küçük payload'lar ve güçlü tip kontrolü sağlar; ancak tarayıcı desteği sınırlıdır ve HTTP/2 altyapısı gerektirir. Mobil veya servisler arası iletişim için ideal olabilir.

Reactive tarafında Spring WebFlux, Netty tabanlı non-blocking I/O ile yüksek eşzamanlılık sağlar. Özellikle I/O-bound servisler veya uzun süre açık kalan bağlantılar (SSE, WebSocket) için uygundur. Geçiş yaparken blocking kütüphaneleri reaktif olmayan adaptasyon katmanlarıyla izole etmeyi unutmayın.

Sık Karşılaşılan Sorunlar ve Çözümleri

Geçiş sırasında sık rastlanan problemler genelde uyumluluk, güvenlik ve veri dönüşümleri etrafında şekillenir. Örneğin, SOAP'un header bazlı WS-Security mekanizmalarını REST'te JWT veya OAuth2 ile yeniden tasarlamak gerekir. Burada amaç fonksiyonellik kaybetmeden güvenliği modernize etmektir.

Veri dönüşümlerinde XSD -> JSON Schema dönüşümü dikkat gerektirir; veri tipleri, nullability ve default değerler farklı davranabilir. Bu yüzden otomatik dönüştürücüler kullanıldığında bile kapsamlı entegrasyon testleri şarttır.

Sık Sorulan Sorular

1. Spring-WS projelerini tamamen bırakmalı mıyım?

Hayır, bırakmak zorunda değilsiniz. Eğer sistemleriniz WS-* özelliklerine (ör. WS-Security, reliable messaging) bağımlıysa, Spring-WS ile yol almak mantıklı olabilir. Ancak yeni geliştirmelerde REST/Reactive tercih etmeniz daha sürdürülebilir olacaktır.

2. Contract-first mi yoksa code-first mi daha iyi?

Kurumsal entegrasyonlarda contract-first (XSD/WSDL) daha güvenli ve sürdürülebilirdir. Hızlı prototiplerde veya internal mikroservislerde code-first tercih edilebilir. Geçişte XSD'den OpenAPI'ye dönüşüm katmanı oluşturmak genellikle en risksiz yoldur.

3. Geçiş sürecinde performans nasıl etkilenir?

Geçişin performans etkisi kullanılan teknolojilere bağlıdır. REST/JSON genelde daha düşük bant genişliği ve daha az parsing maliyeti getirir. Reactive tasarım yüksek eşzamanlı bağlantılarda daha iyi kaynak kullanımı sağlar. Ancak doğru benchmark ve yük testleri yapmadan kesin sonuç beklemeyin.

Sonuç

Spring Web Services, kurumsal SOAP tabanlı projeler için hâlâ güçlü bir çözümdür. Ancak modern bulut-native, mobil ve web uygulamaları için REST, Reactive ve gRPC gibi alternatifler daha esnek ve ölçeklenebilir yollar sunar. Geçiş planı hazırlarken kontrat analizine, adapter stratejisine ve kapsamlı testlere öncelik verin. Unutmayın: ani bir 'cutover' yerine kademeli taşıma, rollback planı ve izleme ile daha güvenli ilerlersiniz.

Eğitim bağlantısı: (sistem ekler)

📚 Bu konuyu Opendart Akademi'de öğrenin: Spring Boot eğitimi · Java Spring Boot eğitimi hakkında · YouTube video dersleri · Abone ol