🐡

Spring BootでGraphQLの始め方

2024/06/28に公開

1. 必要な依存関係の追加

build.gradleまたはpom.xmlに以下の依存関係を追加します。

Gradleの場合:

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'com.graphql-java-kickstart:graphql-spring-boot-starter:12.0.0'
    implementation 'com.graphql-java-kickstart:graphql-java-tools:12.0.0'
}

Mavenの場合:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.graphql-java-kickstart</groupId>
        <artifactId>graphql-spring-boot-starter</artifactId>
        <version>12.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.graphql-java-kickstart</groupId>
        <artifactId>graphql-java-tools</artifactId>
        <version>12.0.0</version>
    </dependency>
</dependencies>

2. エンティティの作成

以下に、BookAuthorのエンティティクラスを定義します。

package com.example.demo;

import javax.persistence.*;
import java.util.List;

@Entity
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;

    @ManyToOne
    @JoinColumn(name = "author_id")
    private Author author;

    // Getters and Setters
}

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

    @OneToMany(mappedBy = "author")
    private List<Book> books;

    // Getters and Setters
}

3. リポジトリの作成

リポジトリインターフェースを定義します。

package com.example.demo;

import org.springframework.data.jpa.repository.JpaRepository;

public interface BookRepository extends JpaRepository<Book, Long> {}

public interface AuthorRepository extends JpaRepository<Author, Long> {}

4. GraphQL Resolverの作成

クエリとミューテーションのリゾルバを定義します。

package com.example.demo;

import com.coxautodev.graphql.tools.GraphQLMutationResolver;
import com.coxautodev.graphql.tools.GraphQLQueryResolver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Optional;

@Component
public class Query implements GraphQLQueryResolver {

    @Autowired
    private BookRepository bookRepository;

    @Autowired
    private AuthorRepository authorRepository;

    public Optional<Book> bookById(Long id) {
        return bookRepository.findById(id);
    }

    public Iterable<Book> allBooks() {
        return bookRepository.findAll();
    }

    public Iterable<Author> allAuthors() {
        return authorRepository.findAll();
    }
}

@Component
public class Mutation implements GraphQLMutationResolver {

    @Autowired
    private BookRepository bookRepository;

    @Autowired
    private AuthorRepository authorRepository;

    public Book addBook(String title, Long authorId) {
        Book book = new Book();
        book.setTitle(title);
        Author author = authorRepository.findById(authorId).orElseThrow(() -> new RuntimeException("Author not found"));
        book.setAuthor(author);
        return bookRepository.save(book);
    }

    public Author addAuthor(String name) {
        Author author = new Author();
        author.setName(name);
        return authorRepository.save(author);
    }
}

5. 自動生成されたスキーマの確認

プロジェクトをビルドして実行すると、graphql-java-toolsがJavaのクラス定義からスキーマを自動生成します。生成されたスキーマは/graphqlエンドポイントで確認できます。

これで、手動でschema.graphqlsファイルを作成する手間を省き、Javaのクラス定義から自動的にGraphQLスキーマを生成できます。これにより、スキーマの一貫性と保守性が向上します。

Discussion