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(ItemReader→ItemProcessor→ItemWriter)か 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。