架空の例:経費精算システム「ケイヒくん」
最終章では、ここまで学んだことを1つのシステムに重ねてみます。題材は、社員がスマホやPCから経費を申請し、上長が承認し、経理が会計システムへ連携する、よくある経費精算システムです。Spring Bootで作られていると仮定します。
Javaはどこにいるのか:三層構造
多くの業務Webシステムは、次の3つの層に分かれています。
第5章・第6章の知識で、中身を想像する
経費申請が1件届いたとき、Javaの中では何が起きているでしょうか。これまで学んだ要素で組み立ててみます。
@Service // 「業務処理を担当する部品」の印(Spring)
public class ExpenseService {
public ApprovalRoute submit(ExpenseRequest req) { // 申請を受け取り、承認ルートを返す
if (req.getReceipt() == null) { // 分岐:領収書がなければ受け付けない
throw new ValidationException("領収書を添付してください");
}
BigDecimal total = BigDecimal.ZERO;
for (ExpenseItem item : req.getItems()) { // 繰り返し:明細を1行ずつ合計
total = total.add(item.getAmount());
}
ApprovalRoute route = routeFor(total); // メソッド呼び出し:金額で承認ルートを決める
repository.save(req, total, route); // データベースに保存(Springの部品経由)
return route;
}
}
@Service/public class ExpenseService経費処理を担当するクラス(第3・6章)。@ServiceはSpringに「業務処理の部品ですよ」と知らせる印(第7章)submit(ExpenseRequest req)メソッド(第5章)。申請(ExpenseRequestクラスのインスタンス)を引数で受け取り、承認ルートを戻り値で返すif (...) throw new ValidationException分岐と例外(第5章)。条件を満たさないとき、例外を投げて処理を止める。画面には「領収書を添付してください」と出るfor (ExpenseItem item : ...)/BigDecimal繰り返し(第5章)で明細を合計。金額なのでBigDecimal(第4章)repository.save(...)データベースへの保存。SQLを直接書かず、Springの部品に任せている(第7章)
全部、学んだ要素でできています。本物のシステムはこの何百倍の量がありますが、1つ1つのクラスやメソッドを見れば、この程度の構造の積み重ねです。「読めないもの」ではなく「量が多いもの」だと分かれば、エンジニアの説明も頭に入りやすくなります。
作られてから動き続けるまで
システムは「作って終わり」ではありません。開発から運用までの流れと、各段階で出てくる言葉を並べます。
環境の使い分け
同じプログラムを、目的の異なる複数の場所で動かすのが普通です。「本番に反映する前にステージングで確認します」という会話はこの話です。
| 環境 | 用途 | 経理・管理部門との関わり |
|---|---|---|
| 開発環境 | エンジニアが作りながら試す場所 | 通常は関わらない |
| テスト/ステージング環境 | 本番と同じ構成で、リリース前に確認する場所 | 受入テスト(UAT)で実際に操作して確認する。ここで業務目線の確認を怠ると本番で発覚する |
| 本番環境 | 実際に業務で使う場所 | 障害時の影響範囲、データの正しさに直結 |
運用の現場で起きていること
動き始めたJavaのシステムは、運用担当者やエンジニアによって見守られています。障害報告や運用報告で見かける言葉を、第2章・第5章の知識でつなげます。
- ログ:プログラムが「今これをした」「ここで例外が起きた」と書き残す記録。障害調査はまずログから。「ログに〜Exceptionが出ている」は第5章の例外の記録
- スタックトレース:例外が起きたとき、「どのクラスのどのメソッドの何行目で起きたか」を呼び出し順に並べた記録。エンジニアはこれを見て原因箇所を特定する
- ヒープ/メモリ不足(OutOfMemoryError):JVMに割り当てたメモリ(ヒープ)を使い切った状態(第2章)。大量データの一括処理で起きやすい
- GC停止(ストップ・ザ・ワールド):ガベージコレクションのために処理が一瞬止まる現象(第2章)。普段は気にならないが、極端に長いと「画面が固まる」として報告される
- バッチの異常終了:夜間の繰り返し処理(第5章)が、想定外のデータや接続切れで途中停止。「どこまで処理したか」「再実行して二重計上にならないか」が論点になる
- 脆弱性対応:使っている部品やJDKに弱点が見つかり、更新が必要になる(第7章)。Log4jの件が代表例
経理担当者が運用で確認できること
・バッチの再実行ルール:途中で止まったとき、最初からやり直すのか途中からか。二重計上を防ぐ仕組み(冪等性、べきとうせい)はあるか
・金額計算の方式:BigDecimal を使っているか、端数処理のルールはどこで定義されているか(第4章)
・変更の経路:重要なデータ(金額、承認状態)を書き換えられる処理は限定されているか(第6章のカプセル化)
・バージョンとサポート期限:JDK・Spring・主要ライブラリのバージョンと、サポート終了時期(第7章)
これらはコードが読めなくても聞ける質問です。そして、聞かれたエンジニアは「分かっている人だ」と受け止めます。
Javaを選ぶべきとき、選ばなくてよいとき
最後に、第1章の問いに戻ります。新しいシステムを作る・刷新する場面で、Javaはどう位置づけられるでしょうか。
Javaが有力な場面
他の選択肢が合う場面
この教材を終えて
おつかれさまでした。8つの章を通じて、次のことを学びました。
- Javaは1995年生まれの言語で、「どこでも動く」「人が多い」「後方互換性」「部品が豊富」という理由から企業システムの定番になった
- ソースコードはコンパイルされてバイトコードになり、JVMが動かす。「Javaを入れる」はJDKを入れること
- コードは「クラス>メソッド>文」の入れ子で、入口は
main - 変数には型がある。金額は
BigDecimal - 処理の流れは順次・分岐・繰り返し。例外は想定外への備え
- オブジェクト指向は、データと処理をまとめる整理術。カプセル化は統制の考え方と同じ
- Spring、Maven、JUnit、LTS、OpenJDK。言葉を役割で分類する
- Javaは三層の真ん中にいて、作られ、テストされ、配置され、運用され続ける
コードが書けるようにはなっていません。でも、エンジニアの説明が「知らない言葉の羅列」から「構造のある話」に変わって聞こえるはずです。それがこの教材のゴールでした。言葉を忘れたら、用語集に戻ってきてください。
この章のまとめ
- 業務Webシステムは「画面・業務ロジック・データベース」の三層。Javaは真ん中の業務ロジック層を担当する
- 実際のコードは、第3〜7章で学んだ要素(クラス・メソッド・分岐・繰り返し・例外・BigDecimal・Springの印)の積み重ね
- 開発から運用まで「設計→実装→テスト→ビルド→デプロイ→運用」。CI/CDはこの自動化。環境は開発・ステージング・本番を使い分ける
- 運用で出る言葉(ログ、スタックトレース、ヒープ、GC、バッチ異常終了、脆弱性)は第2・5・7章の知識でつながる
- Javaを選ぶかどうかは、使う年数・保守する人・間違えたときの影響で決まる投資判断
確認クイズ
この章の内容を3問で確かめましょう。選ぶとすぐに解説が表示されます。
Q1. 業務Webシステムの三層構造のうち、Java(Spring Boot)が主に担当するのはどこですか?
Q2. 「本番に反映する前にステージング環境で受入テストをお願いします」と言われました。これはどういう依頼ですか?
Q3. 障害報告に「スタックトレース」が添付されていました。これは何を示すものですか?