初心者が初心者のために「Javaアプリケーションの作り方」を解説する
Javaエンジニアになって2ヶ月、アプリケーションの開発を一通り経験した筆者がこれから開発に携わるであろう初心者様方に向けて、「Javaアプリケーションの作り方」を解説します。
取り組む前の経験は?
アプリケーション開発は完全未経験でした。
Javaについては、ProgateよりJavaコース修了、北ソフト工房他より課題達成レベル。プログラムは常にコマンドラインとのやり取りのみで、画面であるGUIを作ったことはありませんでした。
なぜ使用言語にJavaを選んだのか?
トップクラスに普及している言語だからです。
あらゆる業界で需要があり、拡張機能に溢れ、枯れている(あらかたバグが修正されている)。加えてJavaは他のオブジェクト言語の元にもなっている。言語以外の勉強や新たな言語習得といった点でアドバンテージがあるJavaは、初めて学ぶ言語として最適だと思っています。
開発の流れ
要件定義 ⇒ 設計 ⇒ プログラミング ⇒ テスト ⇒ リリース
Javaに限らずWebアプリケーションは上記の工程を経て開発されます。本稿ではプログラミングとテストについて言及しています。そのほかの工程については次に概要を記しておきます。
要件定義
Webアプリケーションとは、人間が行う手作業をコンピュータに代行させるためのツール。その作業をコンピュータが理解できるように翻訳することがプログラミングです。
どんなことをアプリで実現したいか、これを考えるところから開発は始まります。
設計
アプリケーションの設計はもちろん、開発の期間や人員、使用するツールについてもその詳細を設計書に記していきます。アプリの出来はこの設計段階で決まるといってもよく、開発期間のほとんどをここで費やすことが多いです。
プログラミングはここで作成した仕様書に基づいて実施されます。
リリース
テストの合格を経てアプリケーションはデプロイされます。公開後もバグは発見されるため、定期的なメンテナンスが必要になります。
フレームワークについて
Webアプリは膨大な量のプログラムで構成されます。これらを1から用意するのは大変すぎるため、作業をテンプレート化するツールが存在します。そのツールこそがフレームワークです。
フレームワークは機能のプリセットを用意してくれます。これらと最低限のプログラムを組み合わせることでアプリケーションを作ることができます。種類が複数あるため開発に合わせて選択されますが、Javaの場合は汎用性の高い「Spring Framework」が主流となっています。筆者はSpring Frameworkをベースに機能を拡張した「Spring Boot」を使用しました。
Spring Frameworkは「DI」という機能を持ちます。これは依存性注入と訳され、使いたいクラスを切り貼りすることができます。このDIと、便利な機能を内包したライブラリ群をまとめたものがSpring Bootです。
Spring Bootの特長として設定ファイルを自動生成するというものがあります。本来、プログラム同士を連携させるにはその依存関係を記述したファイルを用意する必要があります。それを不要にしたSpring Bootは、高速な開発を可能にするフレームワークとして多くのエンジニアに愛用されています。
STSに触れる
Javaは要コンパイルな言語です。経験者なら理解できると思いますが、コードを書いてコンパイルしてコマンドラインで呼び出して、、、と実行までのステップが長いですよね。これをひとつのレイヤーにまとめたものを統合開発環境(IDE)と呼びます。ひとつの画面内で複数のプログラムやHTMLファイルを作成し、それらを連携させ、実行からデバッグまで行える。IDEを使いこなせるかどうかは作業効率向上につながっていきます。
JavaのIDEとしては「Eclipse」が有名です。ここにSpring Bootを実装したIDEが「Spring Tool Suite」です。慣れるまでには相当な時間がかかると思います。というのも使える機能が多すぎて理解が追い付かないため。
筆者が嵌まった点として、フレームワークの秘匿性があります。フレームワークのタスクは内部で実行されるため、その全容は使用者にはわかりません。なにを設定する必要があるのか?この点が不明瞭で理解に苦労しました。
学習には実用書を活用することをおすすめします。本にはアプリケーションの初心者用レシピが載っており、言われるがままに作っていると理解ができるようになります。筆者が利用した一冊を下にご紹介します。
Spring Boot 2 プログラミング入門
Amazonで掌田津耶乃のSpring Boot 2 プログラミング入門。アマゾンならポイント還元本が多数。掌田津耶乃作品ほか、お急ぎ便対象商品は当日お届けも可能。またSpring Boot 2 プログラミング入門もアマゾン配送商品なら通常配送無料。
アプリケーションを作ってみた
プログラミング
作成した設計図にしたがってプログラムを書いていきます。前述したように1から書くことは稀です。Spring Bootが有する機能を必要に応じて組み込んでいくことで、設計図を形にしていきます。
DIで貼り付けたクラスのインスタンスを作ることで保有するフィールドやメソッドを利用できるようになります。この機能を駆使してコントローラ上でメソッドを呼び出したり、複雑なメソッドを構築していきます。
以下の順番で制作を進めると全体の把握がしやすくなります。
画面を作る
HTMLで表示する画面を作ります。
ここで使用するのが「テンプレートエンジン」という機能。HTMLとプログラムの接続を簡単にしてくれます。入力フォームのデータを受け取ったり、加工したデータを出力したりすることができます。これもいくつか種類がありますがJavaでは「Thymeleaf」がメジャーです。
コントローラを作る
データベースやプログラム、画面の橋渡しを行うクラスです。
画面やプログラムの呼び出し、データの受け渡しをリクエストする役割を持ちます。ここがおかしいとアプリは機能しなくなります。
コントローラはリクエスト式に動作します。指定したアドレスにアクセスするたびに、紐づけされたコントローラは自身のタスクを実行していきます。
データベースを作る
アプリで扱うデータを作ります。
その入れものはデータベース言語で書かれ、さまざまな種類がありますがここでは「MySQL」の使用を前提に話を進めます。データベースはフレームワークの外部にあるため、接続するためのクラスが存在します。
それぞれEntityクラスとRepositoryクラス。Entityクラスにはデータの型が書かれています。人物データに例えると、名前や性別、年齢といった情報の項目を保有していることを示しています。これはデータベースの構成と一致しており、アプリ-DB間でデータの受け渡しを可能にする翻訳のような働きをしています。
そしてRepositoryクラスは指定したデータベースとのアクセスを担う。なお、その指定は「Application.properties」にアドレスを記述しておく必要があります。
ロジックを作る
データを加工するメソッドです。ほかにもRepositoryを介したデータの「CRUD」もロジックに相当します。
CRUDとはCreate(作成)、Read(読み込み)、Update(更新)、Delete(削除)の頭文字をとったもの。プログラムとデータベースのやり取りはすべてCRUDのどれかに分類できます。
一方で業務をプログラムに起こしたものを「ビジネスロジック」といいます。ビジネスロジックとCRUDによるデータの編集と遷移がWebアプリの基本となっています。
テスト
プログラムにはバグが付きものです。バグを残したままリリースするわけにはいきません。隠れたバグの除去はアプリケーションの品質を向上することに不可欠です。アプリを設計するのと同様に、テストの設計もまた重要なフェーズです。
テストとは特定の制限下で想定通りに動作するかをチェックすることです。一例として、入力チェックにおいて文字制限を超えるとエラーが返されるか?など。考えうるすべてのパターンを洗い出し、テストを実施していく。
テストには段階があり、以下に紹介していきます。
メソッド単位
機能を構成するメソッドを1つ1つテストしていきます。
テスト手法はさまざまですが、JUnitとよばれるフレームワークを使用してテストコードを書くことが多いです。
問題の発見は規模が小さいほど容易になります。アプリケーションの最小単位である単体メソッドからテストしていくことで、より高度なメソッドの欠陥を潰していくことができます。それと同時にメソッドの信頼性の積み重ねによってアプリの品質が高まっていきます。
機能単位
複数のメソッドで構成される機能をテストします。もし問題が発生したとき単体メソッドの信頼性が高ければ、メソッドを呼び出している結合部分に欠陥を疑うことができます。
システム全体
アプリケーションを実行テストします。顧客が同席することもあります。ここまできてようやくアプリケーションをリリースできます。
感想
一通り開発を経験して思うことは、実際にプログラミングする時間は意外にも少ないということです。筆者は新米なので勉強しながらのプログラミングはとても時間のかかる作業ではありました。しかしそれ以上の時間を設計に費やしています。ここでいう設計とはアプリケーションだけでなく、テストの設計も含んでいます。簡単なアプリでさえ登場する役者は多く、どこになにを配置するか、どんな繋がりを作る必要があるのか、これらのネットワークを考えると頭がすぐパンクしてしまいました。抽象的な大枠イメージを作ってから、細部に注目していくことが常套であると感じます。