Spring (Boot / Batch / Security)

実務(CODEプロジェクト)で Kotlin と組み合わせて使った Java系バックエンドフレームワーク。_moc-web-infra

DI / Bean

  • @Component + @ConditionalOnProperty で条件付き登録、@Order で順序、@PreDestroy で停止前処理。
  • 注意: object(シングルトン)にも @Component は付くが @Value のインジェクトやDIはされないので class にする。Filter クラスに @Component を付けてはいけない。
  • リクエストプロパティを snake_case で受けたい場合、@ModelAttribute + @ConstructorProperties("hoge_id")(Kotlin では primary constructor の前に constructor を置く)。

Spring Batch

  • Job は複数の Step からなり、各 Step は Chunk(ItemReaderItemProcessorItemWriter)か Tasklet(自由実装)を選ぶ。対象件数が少なければ Tasklet で十分。
  • @Scheduled(cron=...) で定期実行。cron や閾値は application.yaml に設定。
  • メタテーブル(batch_job_instance 等6つ)が自動作成される。spring.batch.jdbc.initialize-schema で制御。放置すると肥大化するため定期クリーンアップ(v5.0.0 の JobRepository.delete()、または外部キー(トリガー)を無効化して生SQLで FK順に削除)。
  • JobParameter は Step スコープ(@Value("#{jobParameters[...]}"))で late binding。同一パラメータでの実行は再起動扱いになるため RunIdIncrementer で id を変える。
  • テスト: @SpringBatchTest は内部で JobLauncherTestUtils を作り Job を @Autowired するが、Jobが複数あると失敗する。@SpringBootTest だけ付けて jobLauncher.run(job, params) で実行する回避策。

Spring Security

  • configure(HttpSecurity) で認証フィルタ追加・URL別の認可、configure(WebSecurity) で静的リソースを Security Filter Chain から除外。
  • @EnableGlobalMethodSecurity(prePostEnabled=true) でメソッド単位の認可。
  • JWT/PreAuth フロー: PreAuthenticatedFilter が認証情報を取り出し、AuthenticationManager(ProviderManager)が PreAuthenticatedAuthenticationProvider に委譲、Authentication をスレッドローカル/セッションに保存。
  • ステートレスにするなら SessionCreationPolicy.STATELESS

Logging / Validation

  • slf4j(IF)+ logback(実装)。logback-spring.xml で appender 定義。JSON化は logstash-logback-encoder(appendEntries で独自フィールド)。SQLログは logging.level.org.hibernate.SQL=DEBUG
  • カスタムバリデータは @Constraint(validatedBy=...) + ConstraintValidator、相関チェックは @AssertTrue

関連