- HOME >
- ポンコツPdM
ポンコツPdM

SIerでの開発・プロジェクト運営の経験をもとに、Java・Springの実装、設計・テスト、チーム開発で役立つ手順をまとめています。
学習と現場をつなぐ
問い合わせ一覧が数百件になり、「全部取得してから画面で20件ずつ切る」実装が苦しくなった。Spring Data JPAなら、Repositoryへ Pageable を渡して取得範囲を限定できます。 ただし私は、PageRequest.of(page, size) を置くだけでは完成としません。ページ番号の0始まり、件数の上限、同日時データの順序まで決めます。これを曖昧にすると、最初のページが一つずれたり、ページを移動したとき同じ行が見えたりします。以下は JDK 17、Spring Boot 3.5. ...
登録完了画面でブラウザを更新すると「フォームを再送信しますか」と聞かれ、同じ申請が二件できた。ここでボタンを押せなくするJavaScriptを足しても、通信再試行や別タブからの送信は止まりません。 対策は、どの再送を止めたいかで選びます。正常なPOSTの後に結果ページへ移動させるPRG(Post/Redirect/Get)は、更新時の再送を減らす第一歩です。しかし二つのPOSTが同時に届く場合は、サーバー側の仕組みも必要です。以下は Java 21、Spring Boot 3.5系の架空の申請フォームです ...
「新しい版を配置する」「画面を確認する」「問題があれば戻す」。この三行だけでは、夜間に別の担当者が同じ作業を安全に実行できません。何を見て成功と判断し、どこで中止し、戻した後に何を確かめるかが抜けているからです。 この場面では、操作の列挙より、続行・中止・切り戻しを判断できる情報を優先します。 コマンドの羅列より先に、判断する人と観測する結果を決めます。 ここでは架空の問い合わせ管理アプリで、件名の文字数チェックを修正する小規模なWeb改修を例にします。対象はKubernetes上の inquiry-we ...
一つのテストを選んで実行すると成功するのに、クラスやプロジェクトのテストをまとめて動かすと失敗する。このとき最初に疑うのは、JUnitの気まぐれではなく、先に実行されたテストが後続へ何かを残していることです。 私なら、テストの順番を固定する前に、失敗したテストが読んだ共有状態を調べます。題材は架空の受付番号発行機能。staticのオブジェクトを共有して起こる失敗を再現し、各テストが自分で初期状態を作る形へ直します。その後、DBとファイルで同じ問題をどう見つけるかまで扱います。 実行サンプル staticを ...
「昨日まで通った期限判定テストが、今日になったら落ちた」。期限を固定して期待結果だけ書き、判定の中でLocalDate.now()を呼んでいると起こる失敗です。テストのたびに予定日を書き換える運用では、期限当日と翌日の境界を保証できません。 ここで取る方針は、現在日時を業務ロジックの入力として扱い、Clockを渡すことです。題材は「締切日当日まで申請でき、翌日からできない」という架空の申請機能。画面表示やDB保存ではなく、期限判定を毎日同じ条件で確かめます。 実行サンプル 締切日の当日・翌日と、同じ瞬間を ...
APIで空の件名を送ると400になる。ところが画面側では、どの欄を直せばよいか分からない。ステータスコードだけ合っていても、入力画面を作る側には足りません。 私なら、エラー応答を利用者が修正できる項目名とメッセージだけに絞った契約にします。スタックトレース、例外クラス名、送信された秘密値を返す必要はありません。ここでは JDK 17、Spring Boot 3.5系、Spring MVC の @Valid @RequestBody を例にします。 応答形式を先に決める APIのエラー応答に必要な要素。AP ...
「小さな修正だから、ついでに入れて」。これが一日に何件も届くと、何が合意済みで、何が今回のリリースに入るのか分からなくなります。 この場面では、変更を止めるより、まず『追加・不具合・未決』を分けることを優先します。 分けずに作業へ載せると、バグを後回しにしたり、新しい要望を無償の修正として扱ったりします。変更自体は歓迎しても、影響と決定者は記録します。 以下は架空の問い合わせ管理アプリです。件名は1〜100文字、受付済みの問い合わせの件名は投稿者が変更できない、という仕様をいったん合意した前提にします。 ...
注文APIで、注文者名が空なら400になるのに、明細の品番が空でも保存される。コントローラー引数に @Valid があるのを確認しても、原因が見えないことがあります。 私なら最初に見るのは、親から子へ検証を進める指定があるかです。親の検証は、子の中身を自動で全部たどるわけではありません。注文と複数明細を例に、検証する階層を見える形にします。以下は JDK 17、Spring Boot 3.5系と spring-boot-starter-validation の例です。 症状を一つのJSONで再現する { ...
JUnitのParameterizedTestは、先に決めた入力と期待結果を、一行ずつ同じテストへ渡すために使います。この記事では「件名は空白だけを認めず、Unicodeコードポイント数で1〜100」という仕様を、6行の境界値テストへ移します。100文字を誤って拒否したとき、どのケースが落ちたかまで確かめます。 対象コード・テスト・pom.xmlの全文はこちらJava 17・JUnit 5.12.2で動かす独立Mavenプロジェクトです。件名判定、問い合わせの対応開始判定、仕様から選んだケース、CsvSo ...
申請フォームに開始日と終了日を追加した。両方に @NotNull を付けたのに、「終了日が開始日より前」の申請が保存されてしまう。これはアノテーションが壊れたのではありません。@NotNull が確認するのは一つの値で、二つの日付の関係は別の仕様だからです。 ここでは「開始日・終了日は両端を含み、同じ日でも申請可能」と決めます。二つの値を持つDTOにクラス単位の制約を付け、エラーは終了日へ返します。題材は架空の申請アプリです。コード例は JDK 17、Spring Boot 3.5系、spring-boo ...