こんにちは、Yunと申します。
今回は小さい掲示板機能がある Web Application を作りながら Spring Boot と QueryDSL 学んでいきたいと思います。
準備物
- Java21
- Spring Boot 3.x.x
- JPA
- QueryDSL 5.x.x
QueryDSL を使う理由
QueryDSL は RDB と Spring Data JPA を使う時は必ず使用される技術になります。
下記はChatGPTに聞いたQueryDSLを使用する理由とメリットです。
-
型安全なクエリの作成: QueryDSLを使用すると、クエリを文字列ではなく、Javaの型安全なDSL (Domain Specific Language) を使って記述することができます。これにより、コンパイル時にクエリのタイポやシンタックスエラーを検出しやすくなります。
-
IDEのサポート: QueryDSLはIDEによるサポートがあり、コード補完やリファクタリング、シンタックスハイライトなどの恩恵を受けることができます。これにより、開発者は効率的にクエリを記述できます。
-
クエリの再利用性と保守性の向上: QueryDSLを使用すると、クエリを再利用しやすくなります。また、クエリの変更があった場合でも、コンパイル時にエラーが検出されるため、保守性が向上します。
-
SQLインジェクションの防止: QueryDSLはパラメータ化されたクエリを生成するため、SQLインジェクション攻撃からアプリケーションを保護するのに役立ちます。
-
Spring Data JPAとの統合: Spring Bootと組み合わせて使用する場合、Spring Data JPAとシームレスに統合できます。これにより、JPAリポジトリを使用する場合と同様の簡潔なコードで、型安全なクエリを実行できます。
-
リファクタリングのサポート: エンティティやフィールドの名前を変更した場合でも、QueryDSLは自動的に生成されたクエリを対応する名前に更新します。これにより、リファクタリングが容易になります。
検索機能の要件
今回実装しようとすする検索機能の要件です。
- ページングが可能で、1ページのサイズは基本20とする
- 技術スタックを複数指定できる
- 応募ポジションを複数指定できる
- 進め方を1つ指定できる
- タイトル名を含んで検索可能とする
QueryDSL を設定する
build.gradleの設定
build.gradle
に QueryDSL を追加してください。JPA と一緒に使いますので JPA も追加してください。
Configクラスの作成
QueryDSLのための構成クラスを作成します。
機能実装
技術スタックを指定できる
最初は技術スタックを指定して検索できるようにしてみます。
まずはテストを書く
テストを動かし Red を見ます。
Red を見ましたので Green を見れるように機能実装します。
Controllerを作成
controller を作成します。
request dto である RecruitmentSearch
を作成します。
Serviceを作成
service を生成します。
次は Repository 層を作っていきたいと思いますがQueryDSL を使用しますのでここからが重要です!
まずはクラスダイアグラムを見ていきましょう。
クラスダイアグラム
QClass
ファイルを作成します
RecruitmetsRepositoryCustom
interfaceを作成して QueryDSL を用いて作成したいメソッドを RecruitmetsRepositoryCustom
内に宣言します。
RecruitmentsRepositoryImpl
を作成して RecruitmetsRepositoryCustom
を implements します。
RecruitmetsRepositoryCustom
を RecruitmentsRepository
に extends させます。
QClass ファイルを作成
@Entity
がついたクラスが必要です。
Gradle タブまたは terminal で compileJava
を実行すると QueryDSL が @Entity
を見てQClass ファイルを作成してくれます。
作成されたファイルは build/generated/sources/annotationProcessor/java/main
中の@Entity
があるパッケージに生成されます。
後で作成されたこの QClass ファイルに対してクエリを作成します。
RecruitmetsRepositoryCustom を作成
RecruitmetsRepositoryCustom
を interface で作成します。
後ろに (使用している JpaRepository の名前) + Custom
をつけるのが慣例です。
- ex :
RecruitmentsRepositryCustom
RecruitmentsRepositoryImpl を作成
名前に要注意です。
クラス名は必ず JpaRepository
をextendsしているinteraceの名前 + Impl
である必要があります。
- ex :
RecruitmentsRepositoryImpl
ここでクエリを作成します。
RecruitmentsRepositoryに拡張させる
これで終わりです!
結論
QueryDSL を使いましょう。