Spring Boot 技術質問集と回答
基本的な質問
Spring Boot の主な特徴を説明してください。
Spring Boot は、迅速なアプリケーション開発を可能にするフレームワークで、設定の簡略化、組み込みサーバー(Tomcat など)、自動構成機能を提供します。
Spring Boot アプリケーションを起動する方法を説明してください。
SpringApplication.run メソッドを使用してアプリケーションを起動します。また、mvn spring-boot:run コマンドでも起動可能です。
@SpringBootApplication アノテーションの役割は何ですか?
@SpringBootApplication は @Configuration、@EnableAutoConfiguration、@ComponentScan を組み合わせたアノテーションで、設定と自動構成、コンポーネントスキャンを一括で有効にします。
Spring Boot のプロジェクトを新規作成する方法を教えてください。
Spring Initializr(https://start.spring.io/)
を使用してプロジェクトを作成します。必要な依存関係を選択して ZIP ファイルをダウンロードします。
Spring Boot の Auto Configuration 機能の仕組みについて説明してください。
spring.factories ファイルを使用して、特定の条件が満たされた場合に自動的に構成を有効化します(例:クラスがクラスパスに存在する場合)。
外部設定とプロファイル
application.properties と application.yml の違いを説明してください。
両方とも設定ファイルですが、application.yml は YAML 形式であり、階層的な構造を簡潔に記述できます。
Spring Boot アプリケーションにおける外部設定の優先順位について説明してください。
以下の順序で優先順位が決まります:
コマンドライン引数
Java システムプロパティ
OS 環境変数
application.properties / application.yml
プロファイル(spring.profiles.active)を活用して環境ごとに設定を切り替える方法を説明してください。
プロファイルに応じて設定ファイルを分け(例:application-dev.yml、application-prod.yml)、spring.profiles.active を使用して切り替えます。
環境変数やシステムプロパティを使用して設定を注入する方法を教えてください。
@Value("${property.name}") を使用して値を注入できます。
設定値をコード内で取得するための方法を説明してください(例:@Value アノテーション)。
@Value("${property.name}") または @ConfigurationProperties を使用して設定値を取得します。
データベースと JPA
Spring Boot でデータベースを設定する手順を説明してください。
application.properties にデータベースの URL、ユーザー名、パスワードを設定し、JPA 依存関係を追加します。
Spring Data JPA の基本的な仕組みについて説明してください。
リポジトリインターフェースを作成し、メソッド名に基づくクエリを自動生成する仕組みです。
Spring Boot アプリケーションで複数のデータソースを設定する方法を教えてください。
@Primary アノテーションを使用してメインのデータソースを指定し、DataSource Bean を複数定義します。
JPA を使用したリポジトリのカスタムクエリの作成方法を説明してください。
@Query アノテーションを使用して JPQL またはネイティブクエリを定義します。
エンティティクラスを作成する際の注意点を教えてください。
@Entity、@Id、@GeneratedValue を正しく設定し、フィールドに適切な型を使用します。
REST API
Spring Boot を使用して REST API を作成する手順を説明してください。
@RestController を使用してエンドポイントを定義し、@GetMapping、@PostMapping などのアノテーションを活用します。
@RestController と @Controller の違いは何ですか?
@RestController は JSON 形式のレスポンスを返します。@Controller はビュー(HTML)を返します。
HTTP メソッド(GET, POST, PUT, DELETE)を Spring Boot で処理する方法を説明してください。
@GetMapping、@PostMapping、@PutMapping、@DeleteMapping を使用して各メソッドを処理します。
リクエストとレスポンスのバリデーションを行う方法を教えてください。
@Valid アノテーションを使用し、BindingResult を活用してエラーメッセージを取得します。
Spring Boot で CORS(Cross-Origin Resource Sharing)を設定する方法を説明してください。
@CrossOrigin アノテーションや CorsRegistry を使用して設定します。
セキュリティ
Spring Security を使用して認証と認可を実装する手順を説明してください。
Spring Security 依存関係を追加し、WebSecurityConfigurerAdapter を拡張してセキュリティ設定を定義します。
Spring Boot アプリケーションで基本認証を有効にする方法を教えてください。
HttpSecurity の設定で .httpBasic() を有効化します。
JSON Web Token (JWT) を使用して認証を実装する方法を説明してください。
JWT トークンを生成・検証するクラスを作成し、リクエストヘッダーでトークンを処理します。
セキュリティ設定をカスタマイズするためのクラスとアノテーションについて説明してください。
@EnableWebSecurity を付与したクラスで設定を行います。
CSRF 対策を有効化または無効化する方法を説明してください。
HttpSecurity の設定で .csrf().disable() を使用して無効化できます。
ロギングと監視
Spring Boot アプリケーションでロギングを設定する方法を教えてください。
application.properties でロギングレベルを設定します(例:logging.level.root=DEBUG)。
Spring Boot Actuator の役割と主なエンドポイントについて説明してください。
アプリケーションの状態やメトリクスを監視するために使用され、/actuator/health、/actuator/metrics などのエンドポイントを提供します。
アプリケーションのメトリクスを監視するための方法を教えてください。
Actuator を使用し、Prometheus や Grafana と統合して監視します。
ログレベルを動的に変更する方法を説明してください。
Actuator の Loggers エンドポイントを使用します。
カスタムメトリクスを作成して Actuator に追加する方法を説明してください。
MeterRegistry を使用してカスタムメトリクスを登録します。
テスト
Spring Boot アプリケーションの単体テストを作成する方法を教えてください。
JUnit と Mockito を使用してテストを作成します。
@SpringBootTest アノテーションの役割について説明してください。
Spring コンテキストをロードして統合テストを実行するために使用します。
Mock を使用したコントローラのテスト方法を説明してください。
@WebMvcTest と MockMvc を使用してテストします。
データベース関連のテストを行う際の注意点を教えてください。
インメモリデータベース(H2 など)を使用し、テストデータの分離を確保します。
REST API の統合テストを作成する方法を説明してください。
TestRestTemplate または MockMvc を使用して統合テストを実行します。
その他の機能
Spring Boot アプリケーションでスケジュールされたタスクを設定する方法を教えてください。
@EnableScheduling をクラスに付与し、@Scheduled でタスクを定義します。
非同期処理を有効にする方法を説明してください。
@EnableAsync を使用し、@Async をメソッドに付与します。
Spring Boot でカスタムスターターを作成する手順を教えてください。
新しいプロジェクトを作成し、spring.factories に必要な設定を記述します。
アプリケーションの国際化(i18n)を設定する方法を説明してください。
MessageSource Bean を定義し、メッセージプロパティファイルを作成します。
Spring Boot と外部サービス(例:AWS, Kafka)を統合する方法を説明してください。
必要な依存関係を追加し、専用のクライアントライブラリや設定を使用します。
トラブルシューティング
Spring Boot アプリケーションが起動しない場合、どのようにトラブルシューティングを行いますか?
ログを確認し、依存関係や設定ファイルの誤りをチェックします。
循環依存が発生した場合の対処法を教えてください。
@Lazy を使用して遅延初期化するか、設計を見直します。
メモリリークを特定して修正する方法を説明してください。
ヒープダンプを分析し、問題のあるオブジェクトを特定します。
依存関係の競合を解決する方法を教えてください。
dependencyManagement を使用してバージョンを固定化します。
スロークエリが発生した場合の対処法を説明してください。
spring.jpa.show-sql=true を有効化し、クエリログを分析します。
アーキテクチャと設計
マイクロサービスアーキテクチャにおける Spring Boot の役割を説明してください。
各マイクロサービスの開発を迅速化し、軽量な構成を提供します。
Spring Boot を用いたモノリシックアプリケーションの設計上のベストプラクティスを教えてください。
層状アーキテクチャを採用し、モジュール化を進めます。
Spring Cloud を活用した分散システムの構築方法を説明してください。
Eureka、Zuul、Config Server などを使用してサービス登録、ロードバランシング、設定管理を行います。
アプリケーションのスケーラビリティを確保するための方法を教えてください。
ステートレスな設計を採用し、負荷分散やクラウドサービスを活用します。
Spring Boot アプリケーションをコンテナ化してデプロイする方法を説明してください。
Dockerfile を作成し、イメージをビルドしてコンテナとしてデプロイします。