Ce guide présente les meilleures pratiques pour concevoir, implémenter et optimiser vos APIs GraphQL avec GraphQL AutoGen.
Organisez votre code par domaine métier plutôt que par couche technique :
com.example.ecommerce/
├─ product/
│ ├─ Product.java
│ ├─ ProductRepository.java
│ ├─ ProductService.java
│ ├─ ProductController.java
│ └─ dto/
│ ├─ ProductInput.java
│ └─ ProductOutput.java
│
├─ order/
│ ├─ Order.java
│ ├─ OrderRepository.java
│ └─ ...
│
└─ user/
├─ User.java
└─ ...
Maintenez une séparation claire entre vos entités JPA et vos DTOs GraphQL :
Suivez ces conventions de nommage pour assurer la cohérence :
Product
, OrderItem
)productName
, getAllProducts
)ORDER_STATUS
avec PENDING
, SHIPPED
)Documentez toujours vos types et champs pour une meilleure expérience développeur :
@GraphQLType(description = "Représente un produit dans le catalogue")
public class Product {
@GraphQLField(description = "Identifiant unique du produit")
private Long id;
@GraphQLField(description = "Nom commercial du produit")
private String name;
@GraphQLField(description = "Prix actuel du produit en euros")
private BigDecimal price;
}
GraphQL AutoGen génère automatiquement des DataLoaders pour vos relations, mais assurez-vous de les configurer correctement :
@GraphQLType
public class Order {
// ...
@GraphQLField
@ManyToOne
@GraphQLDataLoader // Active le DataLoader automatique
private Customer customer;
@GraphQLField
@OneToMany(mappedBy = "order")
@GraphQLDataLoader(batchSize = 100) // Configure la taille du batch
private List items;
}
Utilisez toujours la pagination pour les listes potentiellement grandes :
@GraphQLQuery
public Connection getProducts(@GraphQLArgument int first,
@GraphQLArgument String after,
@GraphQLArgument ProductFilter filter) {
// Implémentation avec Page de Spring Data
}
Intégrez Spring Security avec GraphQL AutoGen :
@GraphQLQuery
@PreAuthorize("hasRole('ADMIN')")
public List getAllUsers() {
return userRepository.findAll();
}
Utilisez Bean Validation avec GraphQL AutoGen :
@GraphQLType
public class ProductInput {
@NotBlank(message = "Le nom ne peut pas être vide")
private String name;
@NotNull
@Min(value = 0, message = "Le prix doit être positif")
private BigDecimal price;
// Getters et setters
}