Spring for GraphQL, Spring Boot ile entegre çalışan GraphQL API'lerinin geliştirilmesini kolaylaştırır. Bu rehber, Java ve Kotlin kullanarak bir GraphQL API'si oluşturmanızı, şema tanımlamayı, sorgu işleme ve bağlımlıkların enjekte edilmesini adım adım açıklıyor.
Yazan
Şuayb Şimşek
Spring Boot, güvenlik, mikroservis ve cloud-native mimari konularında pratik teknik notlar paylaşan backend odaklı fullstack geliştirici.
Yeni yazılar yayınlandığında pratik backend ve fullstack notlarını al.
Sosyal
🌟 Neden GraphQL Kullanılmalı?
GraphQL, istemcilerin sadece gerekli olan verileri talep etmesine izin vererek, REST'e göre fazla veya eksik veri alma problemini azaltır. Ayrıca, güçlü tip desteği sunar ve verimli veri alma sağlar, modern API'ler için popüler bir seçenek haline gelir.
📋 Gereksinimler
📋 Aşağıdaki bileşenlerin kurulu olduğundan emin olun:
☕ Java Development Kit (JDK) 17+
📦 Maven veya Gradle kurulu
🔤 Bir Java IDE (IntelliJ IDEA, Eclipse vb.)
🛠️ Adım 1: Bağımlıkları Ekleme
Spring for GraphQL'i etkinleştirmek için aşağıdaki bağlımlıkları projenize ekleyin.
src/main/resources/graphql dizini altında schema.graphqls adlı bir dosya oluşturun.
GRAPHQLschema.graphqls
type Query {
getUser(id: ID!): User
getUsers: [User]
}
type User {
id: ID!
name: String!
email: String!
}
🛠️ Adım 3: Veri Modeli ve Servislerin Tanımlanması
Sorguları işlemek için veri modelinizi ve servis katmanını tanımlayın.
🛠️ Adım 4: GraphQL Controller'ı Uygulama
GraphQL sorgularını ve mutasyonlarını işlemek için @Controller anotasyonunu kullanın.
▶️ Uygulamayı Çalıştırma
Uygulamayı aşağıdaki komutlarla çalıştırın:
Spring Boot (Java/Kotlin):
Kurulumun doğru çalıştığını doğrulamak için uygulamayı tercih ettiğiniz dil yığınıyla başlatın.
BASH
./mvnw spring-boot:run
GraphQL Playground'a erişim sağlamak için http://localhost:8080/graphiql adresine gidin.
🧪 GraphQL API'sini Test Etme
API'nizi test etmek için aşağıdaki sorguları kullanabilirsiniz:
Bir kullanıcıyı ID'ye göre getir:
GRAPHQLquery.graphql
query {
getUser(id: "1") {
id
name
email
}
}
Tüm kullanıcıları getir:
GRAPHQLquery.graphql
query {
getUsers {
id
name
email
}
}
🏁 Sonuç
Artık Spring GraphQL ile API Oluşturma için üretim odaklı bir Spring Boot temeliniz var. Sonraki adımda ayarları kendi domainine uyarlayıp test ve gözlemlenebilirlik katmanını ekleyerek gerçek trafik altında doğrulayın.
Entity
JAVAUser.java
package com.example.demo.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String id;
private String name;
private String email;
}
Servis
JAVAUserService.java
package com.example.demo.service;
import com.example.demo.model.User;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@Service
public class UserService {
private final Map<String, User> userData = Stream.of(
new User("1", "Alice", "alice@example.com"),
new User("2", "Bob", "bob@example.com")
).collect(Collectors.toMap(User::getId, user -> user));
public User getUser(String id) {
return userData.get(id);
}
public List<User> getUsers() {
return List.copyOf(userData.values());
}
}
Entity
KOTLINUser.kt
package com.example.demo.model
data class User(
val id: String,
val name: String,
val email: String
)
Servis
KOTLINUserService.kt
package com.example.demo.service
import com.example.demo.model.User
import org.springframework.stereotype.Service
@Service
class UserService {
private val userData = mapOf(
"1" to User("1", "Alice", "alice@example.com"),
"2" to User("2", "Bob", "bob@example.com")
)
fun getUser(id: String): User? = userData[id]
fun getUsers(): List<User> = userData.values.toList()
}
JAVAUserController.java
package com.example.demo.controller;
import com.example.demo.model.User;
import com.example.demo.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.stereotype.Controller;
import java.util.List;
@Controller
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@QueryMapping
public User getUser(String id) {
return userService.getUser(id);
}
@QueryMapping
public List<User> getUsers() {
return userService.getUsers();
}
}
KOTLINUserController.kt
package com.example.demo.controller
import com.example.demo.model.User
import com.example.demo.service.UserService
import org.springframework.graphql.data.method.annotation.QueryMapping
import org.springframework.stereotype.Controller
@Controller
class UserController(
private val userService: UserService
) {
@QueryMapping
fun getUser(id: String): User? = userService.getUser(id)
@QueryMapping
fun getUsers(): List<User> = userService.getUsers()
}