Javaだけでシステムを作るわけではない

これまでの記事では、 Javaそのものについて 一つずつ整理してきました。

例えば、 変数や条件分岐、 クラス、 List、 Map、 enum、 Streamなどです。

これらは、 実際のシステム開発では バラバラに使うわけではありません。

複数の仕組みを組み合わせて、 一つの機能を作ります。

画面
 ↓
Java
 ↓
業務処理
 ↓
SQL
 ↓
データベース

まずは、 この大きな流れを イメージできれば十分です。

POINT

業務システムでは、 Javaの文法そのものよりも、 「Javaを使って各仕組みをどうつなぐか」 が重要になってきます。

例えば、画面から検索するとどうなる?

業務システムでよくある処理を 一つ考えてみます。

画面で社員番号を入力して、 「検索」ボタンを押す。

ユーザーから見ると、 ただ検索ボタンを押しているだけです。

しかし、 システムの中では いくつもの処理が動いています。

画面
 ↓
リクエスト
 ↓
Controller
 ↓
Service
 ↓
Repository / DAO
 ↓
SQL
 ↓
データベース

データベースから取得した結果は、 今度は逆方向に戻っていきます。

データベース
 ↓
Repository / DAO
 ↓
Service
 ↓
Controller
 ↓
画面

これが、 Webアプリケーションでよく見る 基本的な流れです。

Controllerは何をしている?

Springなどを使ったJavaの Webアプリケーションでは、 Controllerという役割が登場します。

@GetMapping("/employees")
public Employee findEmployee(
        @RequestParam String id) {

    return employeeService.find(id);

}

細かい設定はさておき、 ここでは 「リクエストを受け取る場所」 と考えてみます。

例えば、 ブラウザから

/employees?id=1001

のようなリクエストが来たら、 Controllerが受け取ります。

そして、 自分ですべての処理をするのではなく、 次の処理へ渡します。

役割のイメージ

Controller = リクエストを受け取り、 必要な処理へつなぐ場所

業務処理はServiceにまとめる

Controllerから呼ばれた先では、 実際の業務処理を行います。

こうした処理を Serviceにまとめる構成が よく使われます。

public Employee find(String id) {

    Employee employee =
        employeeRepository.findById(id);

    if (employee == null) {
        return null;
    }

    return employee;

}

実際の業務システムでは、 ここにさまざまな 業務ルールが入ります。

例えば、

・入力値を確認する
・権限を確認する
・複数のデータを取得する
・条件によって処理を分ける
・計算する
・登録処理を行う

これまで学んできた if、 for、 List、 Map、 enum、 Streamなどは、 こうした場所で使われます。

Javaの文法は、 業務処理を作るための部品になる。

Javaからデータベースを操作する

業務システムでは、 データを保存するために データベースを使います。

例えば、 社員情報が保存されているとします。

employee

id      name
----------------
1001    Tanaka
1002    Sato
1003    Suzuki

Javaからデータを取得するときには、 SQLを使います。

SELECT
    id,
    name
FROM
    employee
WHERE
    id = '1001';

そして、 SQLの実行結果をJava側で受け取ります。

Database
    ↓
SQL
    ↓
Java
    ↓
Object

つまり、 JavaとSQLは 別々の知識ではありますが、 業務システムでは 一緒に使うことが多くなります。

データベースの値をJavaのオブジェクトにする

データベースから取得したデータを、 Javaで扱いやすい形にすることもあります。

id      name
----------------
1001    Tanaka

これをJavaのオブジェクトとして 扱うイメージです。

Employee employee;

employee.getId();
employee.getName();

ここで、 以前学んだ 「クラスとオブジェクト」 の知識がつながります。

データベースのデータを Javaのオブジェクトとして扱うことで、 Javaの中でさまざまな処理を 行えるようになります。

POINT

クラスやオブジェクトは、 教材の中だけに登場するものではありません。 業務システムでは、 DBのデータやリクエストなどを Javaのオブジェクトとして扱う場面が 多くあります。

画面がない場合はAPIとして呼ばれることもある

Javaのシステムは、 必ずしもブラウザの画面から 呼ばれるとは限りません。

別のシステムから APIとして呼ばれることもあります。

別システム
    ↓
HTTP Request
    ↓
Java API
    ↓
業務処理
    ↓
Database
    ↓
Response

例えば、 JSON形式でデータを受け取ります。

{
    "employeeId": "1001",
    "name": "Tanaka"
}

Java側では、 このJSONをオブジェクトとして受け取り、 必要な処理を行います。

処理結果を再びJSONとして返すこともあります。

Java Object
    ↓
JSON
    ↓
API Response

ここでも、 クラス、 オブジェクト、 メソッドなど、 これまで学んだJavaの知識が そのまま登場します。

Javaは画面処理だけではない

業務システムでは、 画面を使わずに 定期的に処理を実行することもあります。

例えば、

毎日 0:00

売上データを取得
      ↓
データを加工
      ↓
集計
      ↓
ファイル出力
      ↓
処理終了

こうした処理を バッチ処理として Javaで作ることもあります。

バッチでも、 やっていることは 基本的には同じです。

データを取得
 ↓
Javaで処理
 ↓
データを加工
 ↓
保存・出力

ListやMap、 Stream、 日付処理、 String処理なども、 ここで活躍します。

ここまでのJava知識が全部つながる

例えば、 「社員情報を検索する」 という一つの機能を考えてみます。

【画面】

社員番号を入力
      ↓
「検索」


【Controller】

リクエストを受け取る
      ↓


【Service】

業務ルールを確認
      ↓


【Repository / DAO】

SQLを実行
      ↓


【Database】

社員情報を取得
      ↓


【Java Object】

Employeeとして受け取る
      ↓


【Controller】

結果を返す
      ↓


【画面】

社員情報を表示

この一つの処理の中に、 これまで勉強してきた Javaの知識がたくさん登場します。

Class データや処理を表現する
List / Map 複数のデータを扱う
enum 決められた種類を表現する
Stream データを加工する
Exception エラーを扱う

そこでSpringなどのフレームワークが登場する

実際のJava開発では、 JavaだけでWebシステムを 一から作るわけではありません。

Spring Frameworkなどの フレームワークを利用することで、 Webアプリケーションを 効率よく構築できます。

Spring
 ↓
Controller
 ↓
Service
 ↓
Repository
 ↓
Database

Springには、 DI、 MVC、 Web API、 データベースアクセスなど、 Javaによるシステム開発を 支えるさまざまな仕組みがあります。

ただし、 ここで重要なのは、 Springを覚えることと Javaを理解することは 同じではないということです。

Javaを理解しているからこそ、 Springのコードが 「何をしているのか」を理解できる。

まずJavaの基本を理解し、 その上でフレームワークを学ぶと、 より仕組みが見えやすくなります。

「Javaが分かる」とは何なのか

Javaを勉強していると、 文法をどれだけ覚えればいいのか 分からなくなることがあります。

しかし、 実際の開発では 文法を一つずつ 独立して使うわけではありません。

例えば、

if
 ↓
業務条件を判断する

List
 ↓
複数のデータを扱う

Map
 ↓
keyとvalueでデータを管理する

Class
 ↓
データと処理をまとめる

Stream
 ↓
データを加工する

Exception
 ↓
異常を扱う

そして、 これらを組み合わせて 一つの業務処理を作ります。

さらに、 Spring、 SQL、 DB、 APIなどと組み合わせることで、 実際の業務システムになります。

Java開発の全体像

ここまでを、 一つの図として整理してみます。

ユーザー
   ↓
画面
   ↓
HTTP Request
   ↓
Controller
   ↓
Service
   ↓
Repository / DAO
   ↓
SQL
   ↓
Database
   ↓
Repository / DAO
   ↓
Java Object
   ↓
Service
   ↓
Controller
   ↓
HTTP Response
   ↓
画面


        +

        API

        +

       Batch

Javaは、 このシステム全体の中で 業務処理を実装するための 中心的な役割を担います。

覚えておきたいこと

Javaそのものを覚えることがゴールではありません。 Javaを使って、 データを受け取り、 処理し、 保存し、 他のシステムと連携する。 そこまで見えてくると、 「Javaでシステムを作る」 という感覚がつかみやすくなります。

Javaは「単体」で使うものではない

Javaを書く。
それだけでは、 まだシステムにはなりません。

画面からデータを受け取る。
Javaで処理する。
SQLでデータを取得する。
DBに保存する。
APIで別のシステムとつなぐ。
必要なら、 バッチで自動的に処理する。

これまで勉強してきた Javaの文法や仕組みは、 こうした実際のシステムを 作るための部品です。

クラス、 List、 Map、 enum、 Stream、 Exceptionなど。

一つ一つを見ると 小さな機能に見えます。

しかし、 それらを組み合わせることで、 実際の業務システムの 一つの機能になります。

Javaを覚える。 ↓ Javaで処理を書く。 ↓ システムの一部を作る。

ここまでつながれば、 Javaの基礎から 実際の開発へ進む準備は かなり整ってきます。