Java

【Spring Boot】@DataJpaTestでリポジトリのテストを書く

こんにちは、かつコーチです。@Queryでカスタムクエリを書いたとき、「このJPQLは本当に意図通りのデータを取ってきているか」を確認したくなったことはありませんか。筆者はクエリメソッドの命名を間違えて、意図と違う条件でデータを取得してしま...
Java

【Spring Boot】@WebMvcTestでコントローラのテストを書く

こんにちは、かつコーチです。前回の記事で、@SpringBootTestはDIコンテナ全体を起動するため、テストの数が増えると実行が遅くなるという話をしました。コントローラのリクエスト処理だけを確認したいときは、必要な部分だけを起動する@W...
Java

【Spring Boot】Spring Boot Testの基本

こんにちは、かつコーチです。DIやJPAを使ってCRUDまで作れるようになると、次にぶつかる壁が「テストの書き方が分からない」という悩みです。筆者もJava基礎編で単体テストの書き方は学んだものの、Spring Bootのアプリケーションを...
Java

【Spring Boot】CSRF対策とSpring Securityのデフォルト設定

こんにちは、かつコーチです。フォームログインを実装したあと、POSTリクエストを送るテストコードを書いたら403 Forbiddenが返ってきて困った、という経験はありませんか。筆者も最初にこれに遭遇したとき、認証設定を疑って何時間も見当違...
Java

【Spring Boot】JWT認証を実装する

こんにちは、かつコーチです。ここまでフォームログインとBCryptによるパスワード管理を扱ってきましたが、SPAやモバイルアプリ向けのAPIではセッションを持たないJWT認証を採用するケースが主流です。この記事は上級者向けとして、フォームロ...
Java

【Spring Boot】パスワードエンコーダ(BCrypt)の使い方

こんにちは、かつコーチです。前回の記事でUserDetailsServiceを実装しましたが、パスワードを平文のままデータベースに保存していませんか。万が一データベースが漏えいした場合、平文パスワードはそのまま全ユーザーのアカウント情報の漏...
Java

【Spring Boot】フォームログイン機能を実装する

こんにちは、かつコーチです。前回の記事でSpring Securityの基本を解説しましたが、.formLogin(Customizer.withDefaults())だけでは、Spring Securityが自動生成した無機質なログイン画...
Java

【Spring Boot】Spring Securityの基本を理解する

こんにちは、かつコーチです。spring-boot-starter-securityを依存関係に追加した瞬間、それまで自由にアクセスできていた画面が突然ログイン画面に切り替わって驚いた経験はありませんか。これはSpring Security...
Java

【Spring Boot】DTOとEntityを使い分ける設計の考え方

こんにちは、かつコーチです。「EntityをそのままControllerでレスポンスとして返しているけど、これで大丈夫かな」と不安になったことはありませんか。動くには動くのですが、この書き方は運用が進むにつれて確実に問題を起こします。この記...
Java

【Spring Boot】Bean Validationでフォームの入力チェックを実装する

こんにちは、かつコーチです。フォームの入力チェックを、Controllerの中でif文を並べて書いていませんか。その方法だと、チェック項目が増えるたびにControllerが肥大化し、同じ検証ロジックを別の画面でも書き直すはめになります。S...
Java

【Spring Boot】N+1問題とJOIN FETCHでの解決

こんにちは、かつコーチです。@OneToMany・@ManyToOneでリレーションを組んだあと、多くの人がハマる落とし穴がN+1問題です。「機能としては正しく動いているのに、なぜか本番でレスポンスが遅い」という相談の多くが、このN+1問題...
Java

【Spring Boot】@Queryでカスタムクエリを書く

こんにちは、かつコーチです。前回、クエリメソッドは条件が複雑になるとメソッド名が長くなりすぎると触れました。そんなときに使うのが@Queryアノテーションです。今回は@Queryを使ったJPQL・ネイティブSQLの書き方を解説します。@Qu...
Java

【Spring Boot】クエリメソッドの命名規則

こんにちは、かつコーチです。findAll()やfindById()は便利ですが、「価格が3000円以上の書籍だけ取得したい」のような条件検索はどうすればよいのでしょうか。Spring Data JPAには、クエリメソッドというメソッド名だ...
Java

【Spring Boot】@OneToMany・@ManyToOneでリレーションを組む

こんにちは、かつコーチです。これまで扱ってきたBookEntityは単独のテーブルでしたが、実際のアプリケーションでは「著者(Author)が複数の書籍(Book)を持つ」のようなテーブル間のリレーションが必ず出てきます。今回は@OneTo...
Java

【Spring Boot】CRUD操作の実装

こんにちは、かつコーチです。EntityとRepositoryの基本を押さえたところで、今回は実際にCRUD(作成・読み取り・更新・削除)をControllerからDBまで一通り繋げて実装してみます。理屈は分かっても、実際に手を動かしてみな...
Java

【Spring Boot】Repositoryインターフェースの基本

こんにちは、かつコーチです。前回はEntityの定義方法を解説しましたが、Entityを作っただけではデータの読み書きはできません。実際にデータベースを操作するにはRepositoryというインターフェースを使います。「インターフェースなの...
Java

【Spring Boot】Spring Data JPAの基本とEntityの定義

こんにちは、かつコーチです。Spring Bootでデータベースを扱うとき、多くの現場で使われているのがSpring Data JPAです。「JDBCと何が違うの?」「Entityって結局なに?」というところで止まってしまう人が多いので、今...
Java

【Spring Boot】コンストラクタインジェクションと@Autowiredの使い分け

こんにちは、かつコーチです。DIの基本的な考え方、Controller・Service・Repositoryの役割、そしてThymeleafでの画面作成まで見てきました。ここまでの記事ではDIの実装方法として@Autowiredをさらっと使...
Java

【Spring Boot】Thymeleafでビューを作成する基本

こんにちは、かつコーチです。前回、@GetMapping・@PostMappingでリクエストを受け取る方法を見てきました。今回は、Controllerが選んだ画面を実際に組み立てるThymeleafの基本を解説します。JSPに代わってSp...
Java

【Spring Boot】@GetMapping・@PostMappingでリクエストを処理する

こんにちは、かつコーチです。前回、@Controllerと@RestControllerの違いを整理しました。今回は、Controllerが実際にどうやって「どのURLへのどんなリクエストか」を判別しているのかを見ていきます。@GetMap...