Software Craftmanship

GraphQL et Spring Boot

Découvrez nos jobs
Vous ambitionnez de devenir Tech Lead ou de faire du conseil de haut-niveau ? Nous avons des challenges à votre hauteur !

L’objectif de ce petit projet est de créer un microservice GraphQL qui va gérer deux ressources : Des titres de musiques et des artistes.

Pour simplifier nous allons utiliser une base de données stockée en mémoire de type H2.

CRÉATION DU PROJET :

On commence par créer un nouveau projet sur https://start.spring.io/ avec les dépendances « Spring web », « H2 Database » et « JPA » :

Cliquez sur « Generate » puis importez le projet dans votre IDE.

CRÉATION DE BEANS ET DE LA BASE DE DONNÉES

On va créer les deux objets Artist et Song, les repository pour gérer ces objets et quelques données de tests.

Créez un package « model » et dans ce package on crée les deux beans Artist et Song.

Un Artist est simplement définit par un id et un nom, et une objet Song est définit par un id, un titre, une durée et un artiste.

Voilà le code de ces deux classes, je ne reviendrais pas sur leur fonctionnement car nous avons déjà abordé JPA dans des articles précédents.

package com.example.graphql.model;

import javax.persistence.*;

@Entity
public class Artist {
  
  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  private Long id;
  
  private String name;

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
  
  @Override
  public boolean equals(Object o) {
      if (this == o) return true;
      if (o == null || getClass() != o.getClass()) return false;

      Artist author = (Artist) o;

      return id.equals(author.id);
  }

  @Override
  public int hashCode() {
      return id.hashCode();
  }  
  
  @Override
  public String toString() {
      return "Author{" +
              "id=" + id +
              ", name='" + name + '\'' +
              '}';
  }  
}
package com.example.graphql.model;

import javax.persistence.*;

@Entity
public class Song {
  
  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  private Long id;
  
  private String title;
  
  @ManyToOne
  @JoinColumn(name = "artist_id",
          nullable = false, updatable = false)  
  private Artist artist;
  
  private int lengthInSeconds;

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getTitle() {
    return title;
  }

  public void setTitle(String title) {
    this.title = title;
  }

  public Artist getArtist() {
    return artist;
  }

  public void setArtist(Artist artist) {
    this.artist = artist;
  }  
  
  public int getLengthIsSeconds() {
    return lengthInSeconds;
  }

  public void setLengthInSeconds(int lengthInSeconds) {
    this.lengthInSeconds = lengthInSeconds;
  }  
  
  @Override
  public boolean equals(Object o) {
      if (this == o) return true;
      if (o == null || getClass() != o.getClass()) return false;

      Song author = (Song) o;

      return id.equals(author.id);
  }

  @Override
  public int hashCode() {
      return id.hashCode();
  }  
  
  @Override
  public String toString() {
      return "Song{" +
              "id=" + id +
              ", title='" + title + '\'' +
              ", artist=" + artist +              
              '}';
  }
}

Pour accéder à ces objets, nous allons créer les deux repository correspondant :

package com.example.graphql.repository;

import org.springframework.data.repository.CrudRepository;

import com.example.graphql.model.Artist;

public interface ArtistRepository extends CrudRepository<Artist, Long> {

}
package com.example.graphql.repository;

import org.springframework.data.repository.CrudRepository;

import com.example.graphql.model.Song;

public interface SongRepository extends CrudRepository<Song, Long> {

}

Spring Boot nous fournit des méthodes pour accéder facilement aux objets, nous verrons plus tard comment les utiliser.

package com.example.graphql;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

import com.example.graphql.model.Artist;
import com.example.graphql.model.Song;
import com.example.graphql.repository.ArtistRepository;
import com.example.graphql.repository.SongRepository;

@SpringBootApplication
public class GraphQLRunner {

    @Bean
    public CommandLineRunner demo(ArtistRepository artistRepository, SongRepository songRepository) {
            return (args) -> {
                    Artist artist = new Artist();
                    artist.setName("Depeche Mode");
                    artistRepository.save(artist);
                    
                    Song song1 = new Song();
                    song1.setArtist(artist);
                    song1.setTitle("Enjoy the silence");
                    song1.setLengthInSeconds(365);
                    songRepository.save(song1);

                    Song song2 = new Song();
                    song2.setArtist(artist);
                    song2.setTitle("The Darkest Star");
                    song2.setLengthInSeconds(458);
                    songRepository.save(song2);
            };
    }
}
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
0