🐡
Spring BootでGraphQLの始め方
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. エンティティの作成
以下に、Book
とAuthor
のエンティティクラスを定義します。
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