【こんな記事を探していた!】サンプル付き!JavaでのWebシステムの作り方【Spring boot編】

この記事は約18分で読めます。

スポンサーリンク

「プログラミングの勉強を始めたけど、難しくて挫折しそう・・・」
そんなプログラミング入門者・初心者の方へ向けて、わかりやすく最低限の機能を実装したWebシステム(アプリケーション)の作り方を紹介します。
対応する言語は「Java」です。
Javaエンジニアを目指していない方は、残念ながら参考にならない記事ですのでご了承下さい。

逆にJavaエンジニアを目指している方にはめちゃくちゃ参考になる記事ですので、ぜひ最後までご覧下さい!
先に言わせて頂きますが、単純にコピペ出来るソースコードを載せるだけの記事ではありません。
ちゃんと理解し、自分が実装したいシステム造りに応用出来るようになる事が目的です。
最後まで読んで頂ければ、きっと出来るようになると思います。さあ、始めましょう!

この記事の取り扱い説明

この記事では、最低限の機能が実装されているWebシステムを一通り作れるようになる事を目的として話を進めていきます。
「最低限の機能」とは何かという事は、以下の記事に細かく記載しております。全く無関係な内容の記事ではありませんので、お手数ですが一度先にこちらを読んで頂いてからまた戻ってきて頂けるとわかりやすいと思いますので、是非そうして頂けると助かります。

[記事]プログラミングを挫折せずに習得するために必要な3つの事

また、初心者と言えどもある程度の事は理解している前提で記載していきます。
私は全然技術が高いと自分では思いませんが、プログラマーを生業としているプロです。未経験から始めていますので、未経験者の気持ちは理解しておりますしどこでつまずくのかも推測出来ます。なるべくわかりやすい表現を使用し、わからない人にもわかるように説明させて頂きますが、それでも「よくわからない」という方は、少し基礎的な勉強が不足しています。
ネットや書籍で簡単に学べる知識すら不足している可能性があります。少しでも「ちょっと付いていけない・・・」と感じた方は途中で読む事を中断し、もっと基礎的な勉強をやり直してからまた読みに来て下さい。そうしたらこの記事は、あなたにとって非常に参考になる記事になっているはずです。

Spring boot

こちらとは別に、以前【JSP & Servlet編】の記事を作成しました。もし自分が勉強したい内容がSpringではなくJSP & Servletであれば、以下を参考にして下さい。

[記事]サンプル付き!JavaでのWebシステムの作り方【JSP & Servlet編】

今回はJavaの代表的なフレームワークであり、多くの現場で使用されている「Spring」を使用して解説していきます。こちらは個人的にはJSP & Servlet より簡単で、特に将来的に現場で使用する可能性も高い為、JSP & Servletで勉強する事を指定されていない限り、こちらを優先的に勉強する事をおすすめします。

参考書籍を見ると、余計な解説が多く、本当に知りたい情報がよくわからない事があります。これから勉強を始める、という方にとって余計な情報は不要ですよね。色々頭に突っ込もうとしても結局覚えられないし、必要のない知識である可能性が高い為、要点だけ絞って知る方が良いです。と言いつつも、参考書は購入して学んだ方が最終的には効率的です。

この記事では情報量少なめ、かつ初心者でも理解できるように、要点を絞って解説していきます。この記事に書いてある事を理解してから参考書を読むと、今後の勉強が大きくはかどるでしょう。

まず、DBに以下のテーブルを作っておいて下さい。私はPostgresの環境を例に挙げているため、出来ればDBはPostgresを使用して頂いた方が余計な混乱を招かずに済みます。しかし、OracleだろうとMySQLだろうとやる事は大して変わらないので、そこも勉強だと思って自分の環境に合わせて変更して頂いても良いと思います。

idにserialを指定していますが、 MySQLの場合はAUTO_INCREMENTを指定して下さい。 また、Postgresの場合は以下のシーケンスも作成して下さい。

事前準備

IDEはEclipse、またはSTSを使用している前提で解説します。もしまだインストールしていない方がいたら、インストールを完了させてからまた戻ってきて下さい。

まずはプロジェクトを作成します。パッケージ・エクスプローラーで右クリック→新規→Spring スターター・プロジェクトを選択し、プロジェクト名を「MyBootSample」と入力し、「次へ」をクリックして下さい。

次の画面で依存関係を設定します。これは後から追加、変更が出来ますがとりあえず以下にチェックを入れておいて下さい。

  • 開発ツール→Lombok
  • SQL→Spring Data JPA
  • SQL→Spring Data JDBC
  • テンプレート・エンジン→Thymeleaf
  • Web→Spring Web

入力が完了したら、「完了」をクリックして下さい。プロジェクトが作成されるまで、少し時間がかかる事があります。

スポンサーリンク

プロジェクトがパッケージ・エクスプローラーに表示されたら、プロジェクトを右クリック→Maven→プロジェクトの更新を実行しましょう。

そうしましたら、DBの設定を行います。pom.xml「<dependencies>」から 「</dependencies>」の間に、以下を追加して下さい。

MyBootSample/src/main/resourcesの中に「config」というフォルダを作成し、新規→ファイルで「application.yml」という名前のファイルを作成して下さい。そして中身を、以下のように記載しましょう。

もしPostgres以外のDBを使用する方は、ここの設定のulrとdriverClassNameも変更して下さい。恐らく調べれば出てくると思います。ちなみにデフォルトで MyBootSample/src/main/resources の中にある 「application.properties」は 、邪魔なんで消しちゃってもOKです。以下はOracleの例です。

Spring bootでは、以下のような役割でシステムを作成していきます。

  • controller → そのままMVCのコントローラ
  • repository → DBアクセス。モデル
  • service → ビジネスロジック、repositoryの呼び出し
  • thymeleaf → ビュー

とりあえず一度、プロジェクトを実行してみましょう。プロジェクトを右クリック→デバッグ→Spring boot アプリケーションをクリックし、コンソールの動きが止まった事を確認してから「 http://localhost:8080/ 」にアクセスしてみましょう。以下のような画面が表示されればOKです。

実行する際は、 プロジェクトを右クリック→実行→Spring boot アプリケーション でも実行出来ますが、こちらで実行するメリットはありません。デバッグで実行すれば、エラーが出た時にデバッグ起動し直す必要がないという単純な理由です。デバッグで常に実行するようにしましょう。

スポンサーリンク

MVCを実装する

ではまず、MVCで言う所の「M:モデル」の所から作成していきます。 src/main/javaの中に「com.example.demo」という階層のフォルダがあると思います。 そこを右クリック→新規→クラスをクリックし、名前に「Member」と入力し「完了」をクリックして下さい。 そして、以下のように記述して下さい。

「@Entity」はテーブルのデータを保持するエンティティである事を明示するためのもの。「@Data」はLombokの、GetterとSetterを記載せずとも機能させてくれるもの。「@Table」はDBのテーブル名を指定するもの。「@Id」はそのテーブルのプライマリキーを示すもので、「@GeneratedValue」はidをインクリメントするもの。「@Column」は、DBのカラム名を示すものです。「@Id」は記述しないとアプリケーションエラーとなり、実行できません。実際にDB上のテーブルにプライマリキーが存在していなくても良いので、最低ひとつは定義して下さい。

「@Table」「@Column」 の後ろのnameには、DBの定義を正確に記載して下さい。クラス名や変数名は、異なっていてもOKです。Javaっぽくキャメルケースで記述しましょう。

次にRepositoryを作成します。同じパッケージ内で今度は右クリック→新規→インターフェースをクリックし、名前に「MemberRepository」を入力し「完了」。以下のように記述して下さい。

JpaRepository<Member, Integer>という部分は、先ほど作成したMemberエンティティを作成するインターフェースである事を明示する事と、id=「Integer型」が一意キーである事を示すものです。もし先ほどのエンティティクラスで定義したidString型だった場合は、 JpaRepository<Member, String>と定義します。

本来であれば、このままインターフェースの中身にメソッドを定義せずとも、DBの全件取得は出来ます。標準で実装されているメソッドがあり、中身は既に定義されているのです。しかし私が初心者だった時はそうだったのですが、「え?SQL書かないの?」と、いったいどこで何が起こっているのか、わかりづらいです。従ってわかりやすくするために、かつ今回は普通に全件取得するよりひと手間加えたいので、以下のように記載して下さい。

標準装備されているfindAllメソッドをOverrideし、「delete_flgが”0″」の値のみ取得するようにしています。これは削除フラグが”0″、つまり削除されている扱いを受けているデータ以外を全て出力する、というものです。

Spring bootのデータアクセスは、とても便利です。何をしているかわかりやすくSQL文をべた書きにしていますが、SQL文も省略した書き方が出来ます。メソッド名の定義の仕方次第で、どんなSQLを発行するかを制御する事も出来ます。しかし今回はその辺は飛ばすので、各自で勉強して頂けると助かります。

次に、serviceを作成します。同じパッケージにクラスを新規作成して下さい。名前は「MemberService」と名付け、以下のように記述して下さい。

「@Autowired」は、インスタンスを作らずともクラスを読み込んでくれる技です。「@Service」がserviceである事を示すものです。「@Transactional」はトランザクション範囲を示すものです。例外が発生したりしたら、自動的にDBをロールバックしてくれます。

スポンサーリンク

定義したinitというメソッドで、先ほど作成したrepositoryを呼び出し、メンバー情報を取得して画面側へのデータとして設定しています。今回は受け取りと受け渡しくらいしか記述しませんが、恐らく一般的にはここでビジネスロジックを行います。業務固有の条件分岐、必要なデータの取得など、Javaの処理をゴリゴリ書いていく場所がここです。これでひとまず、モデルは作成完了です。

「C:コントローラ」を作成していきます。そこを右クリック→新規→クラスをクリックして以下のように、名前に「AppController」と入力し、「完了」をクリックして下さい。そして、以下のように記述して下さい。

「@Controller」が、コントローラである事を示すものです。こちらには、indexというメソッドを定義しました。先ほど作成したMemberService(サービスクラス)の処理をそのまま返却するだけのメソッドです。これでひとまずは、コントローラが完成です。

次に「V:ビュー」を作成していきましょう。/MyBootSample/src/main/resources/templatesというフォルダの中に、右クリック→新規→その他→Web→HTMLファイルを選択し、「MemberList.html」と名付けて作成して下さい。そして、以下のように記述して下さい。

稚拙なjavascriptが載っていますが、今は気にしないで下さい。こちらがthymeleafというもので、「th:」を付ける事が特徴となっています。あまり、画面側にJavaのロジック的なものを埋め込む事が出来ません。MVCにおいて、thymeleafのそういった所は逆にメリットとなるのです。と、その辺は参考書にお任せします。

Postgres特有だと思うのですが、実行した際に「java.sql.SQLFeatureNotSupportedException: org.postgresql.jdbc4.Jdbc4Connection.createClob() メソッドはまだ実装されていません。」という、変なログが出力される事がありますので、/MyBootSample/src/main/resourcesの中に「hibernate.properties」というファイルを作成し、中身を以下のように記述して下さい。これで変なログは出なくなります。

そこまで完了したら、動作確認用に、初期データをDBに入れておきましょう。

削除フラグはデフォルトで設定されるはずですが、もしエラーが出た場合は手動で設定して下さい。では、実際に動かしてみます。プロジェクトを選択→実行→デバッグ→Spring boot アプリケーションを選択し、「 http://localhost:8080/ 」にアクセスして下さい。以下のような画面が表示されればOKです。

これでMVCは一通り完成です。

スポンサーリンク

CRUDを実装する

では次に、CRUDを実装していきます。CRUDの内、「Read:読み出し」は、既に先ほど完了しています。次は「Create:作成」「Update:更新」を実装していきましょう。

「MemberRepository」に、以下の定義を追加して下さい。

idが一致する、かつ削除フラグが”0″のレコードを検索するSQLです。次は「MemberService」に、以下の2つのメソッドを追加して下さい。

メンバー編集画面ですが、idが存在しない(0である)場合は値を空で表示します。idが存在する(0以外である)場合は、値が入っている状態で表示します。

登録メソッドは、新規登録も更新処理も、「Memberエンティティ」を作成し、repositoryのsave()メソッドを呼び出すだけです。先ほどDBに作成したシーケンスで、idは5からスタートしインクリメントされます。後は先ほど定義した、メンバー一覧画面の初期表示処理を呼び出すだけです。

非常に簡単です。では次に、「AppController」に以下の二つのメソッドを定義しましょう。

画面側から呼び出されるメソッドです。「@PathVariable」でURLに埋め込まれた値を取得します。「@ModelAttribute(“formMember”) @Validated」とありますが、「formMember」は画面側で扱うMemberデータの名前です。Memberクラスにバリデーションを定義出来たりするのですが、今回は省略します。とりあえずフォームでデータを送られる際、「BindingResult」は定義しないといけないそうなんでとりあえず定義しています。なくてもいけるのかも?ただ引数の順番としては、取得するデータ(この場合はMember)のすぐ後ろに記載しないと、よくわからないエラーが発生します。

次に、メンバー編集画面を作成します。新規→その他→HTMLファイルで、「EditMember.html」というファイルを作成し、以下のように記述して下さい。

そこまで完了したら再びデバッグ起動し、「 http://localhost:8080/ 」にアクセスし、新規登録ボタンをクリックして下さい。以下のような画面が表示されればOKです。

スポンサーリンク

適当に文字を入力し、登録ボタンをクリックしましょう。そうすると前の画面に戻り、メンバーのデータが一行増えています。以下は、五郎さんが追加されました。これで「Create:作成」の基本は完了です。

次は、「Update:更新」を行いましょう。メンバーのデータの横にある、詳細リンクをクリックすると、以下のように初期値が入っています。

この値を、適当に書き変えてから登録ボタンをクリックしましょう。以下の画像の場合では、五郎を六郎に進化させました。

このようにsaveメソッドに渡すデータに、既に存在しているidを渡すと、そのidの対象データが「更新」されます。idが無ければ、自動インクリメントしたidを設定し「新規作成」されます。これで、「Update:更新」の基本も完成です。

次は、「Delete:削除」を解説します。

ここでひとつ注意して頂きたいのは、システム開発業務において本当にデータを消してしまうという事は極まれという事です。当然、SQLのDELETE文を使用すれば消すことは出来ますが万が一、誤って消してしまった場合や既に消してしまったデータに重要な情報が含まれているという事もありますのでとりあえず画面に表示しないという方法が主流です。これを「論理削除」と言います。※ちなみにガチで消しちゃう事は「物理削除」と呼びます。

データとしては存在するが、画面表示するのは削除されていない扱いを受けているデータのみです。この「データが削除されている扱いか削除されていない扱いか」を判別するための値が「削除フラグ」です。DBにテーブルを作る際、そのためにカラムのひとつとして「delete_flg = 削除フラグ」を定義しました。

「Delete:削除」 処理の実態とは、「削除フラグを『削除済み』に更新する更新処理」という事です。では実際にやってみます。 まずは 「MemberService」に、以下のメソッドを追加して下さい。

ちなみに、repositoryのfindByIdをいうメソッドはOptional型で返されます。Optional型とは「nullかもしれない値」もラップしますが、nullかもしれない可能性はここでは無視しています。実装する時はnullチェックを入れて下さい。 Optionalからget()すると、中の値を取得する事が出来ます。次は、 「AppController」 に以下のメソッドを追加して下さい。

ビューは既に記載してあるので、これで完成です。実際に動かしてみましょう。再び例のURLにアクセスし、今度は削除リンクをクリックしてみて下さい。削除確認ダイアログが表示されますので、そこでOKをクリックすると選択したデータが画面から消えます。以下の画面では、六郎さんが消えてしまいました。

DBを見ると、六郎さんはそこにいました。削除フラグが”1″のため、姿を現さなかったのです。

以上が「Delete:削除」でした。これでCRUDの解説は以上です。

スポンサーリンク

まとめ

いかがでしたでしょうか。
最低限の機能を付けるWebシステムであったとしても、未経験者にとっては非常に複雑で何を行っているかわかりづらかったと思います。システムは1文字でも間違えていたら動かない、0か100の世界です。何度でも読み返して、基礎を身に付けて頂きたく思います。

実は駆け足で修正しながら書いたため、この記事の通りに作ってみてもエラーが出たりする可能性は0ではありません。それは申し訳ないのですし、私も気付いたら記事を修正しますが、だからと言って諦めないで下さい。調べれば必ず答えはありますし、自分の知識を応用し実際にトライ&エラーしながら修正していく事も、これから現場で実践するに当たり必ず必要な技術です。せっかくやり始めたのですから途中でやめず、出来るまでちゃんとやって頂きたいと思います。共に成長していきましょう!

と言いつつも、この記事の手順を応用すれば、自分なりに考えてシステムを作れるようになるはずです。冒頭で述べましたが、ここまで読んでよくわからなかった方は一度この記事から離れ、もっと基礎的な事を勉強し直してから再度戻ってきて頂きたく思います。

「MVCの理解」と「CRUD」だけ出来れば、あとはおまけみたいなものです。概念とやり方さえ覚えてしまえば、あとはネットや書籍の情報を基に自分のシステムを改善していけると思います。

経験者から見れば今回作成したこのシステムは、とてもシンプルで未完成なものです。経験者であればこれくらいのシステムはノールック・ノーカンニングで作れます。
入力チェックやセッション管理というものが絶対に必要にはなりますが、その辺は調べればいくらでもわかりやすい情報が出てきます。心配しないで下さい。
入力チェック(バリデーション)については、以下の記事で紹介しています。

[記事] サンプル付き!Java Webシステムのバリデーション【Spring boot編】

「実際のシステム開発現場ってどんな所だろう?」
と、興味のある方には以下の記事がおすすめです!

[記事] システム開発現場のリアルな情報

この記事の情報を完全に再現し、自分なりの作りたいシステムに応用して考える事が出来た方は、初心者卒業は近いでしょう。実際に業務としてシステム開発現場に出ると、もっと成長のスピードは上がりますし、必要な知識と技術がどんどん身についていきます。
まず、最初の開発現場デビューが肝心です。そこから先は、伸びるだけです。

この記事を困っている人たちにも拡散し、皆でプログラマーになりましょう!

最初からわからなくても、大丈夫です。何度でも見返して、修正し続けて下さい。長い時間携わって、慣れていく事が大事です!

スポンサーリンク

いかがでしたでしょうか?
このブログでは、他にも多くの参考になるような「システム開発に関するリアルな情報」や、「人間関係論の非常に勉強になる記事」を発信しています!
少しでも興味のある方は、是非覗きに来て下さい!
[ブログ]システム開発現場のリアルな情報
[Twitter] @ayano_java
今回は以上です!

スポンサーリンク

コメント

タイトルとURLをコピーしました