プログラミング

Java

【Spring Boot】比較検証 : Spring BootとDjango、初心者に向いているのはどちらか

こんにちは、かつコーチです。これでSpring Boot編は40本目、最終回です。「バックエンドを本格的に学ぶなら、Spring BootとDjangoどちらがいいですか」これは、Java基礎編・Spring Boot編を読み進めてくれた読...
Java

【Spring Boot】Spring BootでシンプルなREST APIを作ってみる【実践】タスク管理APIを一気通貫で実装

こんにちは、かつコーチです。これまでのSpring Boot編では、DI・JPA・Security・テストと、個別のテーマを1本ずつ掘り下げてきました。今回はその集大成として、タスク管理REST APIを最初から最後まで一気通貫で実装します...
Java

【Spring Boot】Spring Bootプロジェクトのベストプラクティス

こんにちは、かつコーチです。ここまでレイヤードアーキテクチャや例外ハンドリングの一元化など、個別のトピックを扱ってきましたが、今回はそれらを踏まえた上で「新しいSpring Bootプロジェクトをどう構成すべきか」を一段俯瞰して整理します。...
Java

【Spring Boot】@ControllerAdviceで例外ハンドリングを一元化する

こんにちは、かつコーチです。すべての@RestControllerにtry-catchを書き並べ、同じようなエラーレスポンス生成コードがコピペで増殖していく。レイヤードアーキテクチャの記事でControllerを薄く保つ設計を扱いましたが、...
Java

【Spring Boot】Spring Bootにおけるレイヤードアーキテクチャの考え方

こんにちは、かつコーチです。Controllerに直接SQLを書いてしまう、Serviceが肥大化して1000行を超える、DTOとEntityが混在して依存が絡み合う。こうした問題の多くは、レイヤードアーキテクチャ(責務ごとに層を分け、上位...
Java

【Spring Boot】Spring BootでSLF4Jのログ出力を整える方法を中級者向けに解説

こんにちは、かつコーチです。Spring Bootは標準でSLF4J(Simple Logging Facade for Java、複数のログ実装を統一的なAPIで扱えるファサード)とLogbackの組み合わせを内蔵しています。そのためbu...
Java

【Spring Boot】Lombokで冗長なコードを減らす使い方を初心者向けに解説

こんにちは、かつコーチです。EntityやDTOを作るたびに、getter・setter・コンストラクタを手打ちしていて「これ絶対もっと楽にできるはず」と感じたことはありませんか。Lombokとは、アノテーションを付けるだけでgetter・...
Java

【Spring Boot】Spring Bootの循環参照エラーの原因と解決法を中級者向けに解説

こんにちは、かつコーチです。サービスクラスを増やしていくと、ある日突然アプリが起動しなくなり、BeanCurrentlyInCreationExceptionという見慣れないエラーに出会うことがあります。これは循環参照(AがBに依存し、Bが...
Java

【Spring Boot】よくあるSpring Bootのエラーまとめ(BeanCreationException等)を初心者向けに解説

こんにちは、かつコーチです。Spring Bootを始めたばかりの頃は、mvn spring-boot:runや./gradlew bootRunを叩いた瞬間に真っ赤なスタックトレースが流れてきて、心が折れそうになった経験がある人も多いと思...
Java

【Spring Boot】Dockerでコンテナ化する基本

こんにちは、かつコーチです。「自分のPCでは動くのに、サーバーだとJavaのバージョンが違って動かない」という経験はないでしょうか。筆者も過去、ローカルはJava 21なのに本番サーバーはJava 17のままで、起動時に原因不明のエラーに何...
Java

【Spring Boot】環境ごとにapplication.propertiesを切り替える

こんにちは、かつコーチです。前回の記事でjarファイルをサーバーにデプロイする方法を紹介しましたが、開発環境と本番環境でDBの接続先やログレベルが同じというアプリはまずありません。かといって、デプロイのたびにapplication.prop...
Java

【Spring Boot】jarファイルにビルドしてデプロイする方法

こんにちは、かつコーチです。ローカル環境で./gradlew bootRunを使って動作確認できるようになると、次に気になるのが「このアプリをどうやって本番のサーバーで動かすのか」という疑問です。筆者も最初は、Spring Bootのアプリ...
Java

【Spring Boot】Mockitoを使ったサービス層のテスト

こんにちは、かつコーチです。@SpringBootTestや@DataJpaTestは便利ですが、サービス層のビジネスロジックだけを検証したいときにDIコンテナやDBを毎回起動するのは、テストの速度と焦点の両面で無駄が出やすいです。筆者が担...
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が自動生成した無機質なログイン画...