学生時代に1ミリも知らなかったJavaの開発風景

公開日: : プログラミング

※この記事は、苫小牧高専 Advent Calendar 2016 – Adventar 9日目の記事です。

この記事では、私が学生時代にとても嫌いだったJavaが、実際の現場でどのように使われているのか、Javaの世界で最も勢いのあるSpringFrameworkと共に、広く浅くご紹介します。

また、本記事では説明の簡略化を目的として、なるべく砕いた言葉で説明するように心がけているので、微妙な表現が数多くありますがご了承ください。技術ネタなので、明らかな間違いは指摘していただけると助かります。

※私は情報19期生です。バーチャルなボウリング班を率いてました。

.

学生時代のJavaとの思い出

Javaとは5年間に渡る高専生活の一部として、色々な思い出を築いてきました。

とにかく面倒くさい(public static void main(String[] args) …)と思ったり、「C言語に似てるから書けるよね?」という謎の風習、放置プレイ、ノリで欠かされるJava Appletの恐怖や、苦しめられる javac -> error の無限ループなどなど。とてもいい思い出です。

挙句の果てにEclipseとかいう使えそうなツール来たと思ったら、PCスペック悪すぎてフリーズ地獄だったのは今から思い出すと笑えてきます。「Eclipseはやばい」みたいな風習が漂っていたのを思い出します。まとめると、以下のようなところが微妙だと感じていました

①ソースコードが長い(乱立するimport文、標準出力だけでも System.out.println() )

②結果見るまでが大変(これはEclipseを使わずに javac → 実行ファイル起動 でやってたときの感想)

③Eclipseが重い(これは多分PCスペックのせい)

ちなみに当時と今でカリキュラムが同じかわかりませんが、私達のときのプログラミングの授業はVB(1年)→C言語(1〜3年くらい)→Java(ポツポツと必要に応じて)という感じでした。最近はどうなんでしょうね。もしかしたら今は「Javaサイコー」ってなるようなカリキュラムなのかもしれないですが、そのあたりは誰か教えてください。

あるいは私だけが嫌いだったのかもしれないですが。周りで「Javaサイコー」って思ってた人が居たら教えてください。

そこそこ使われているJava

その後、卒業と同時に大手SIerの子会社に入社することになり、業務ではJavaを扱うことが判明しました。残念な気持ちが強かったですが、一方で世界的にはJavaが使われているということを知ります(例えばTIOBEの集計結果とか)。おそらくこれから就職する人も、多数がJavaと関わることになるでしょう。

これは、①Javaを採用した昔のプロダクトが一定数あり、メンテナンスする人が多い。②新規プロダクトにJavaを採用している人がいる。の2つの要因があると思いますが、②については懐疑的でした。最近はRuby on Railsのように、簡単に使いやすいフレームワークが多いので、ゆくゆくはそっちに流れるのではないかな〜と思っていたからです。

もちろん将来的にJavaの時代が終わることも考えられますが、現状を見ると急激に人気が落ちているわけではありません。その要因の1つが今日ご紹介する「SpringFramework」にあると私は考えています。

国内の最近の採用例で言うと、LINEアメブロSmartNewsなどがあります。これはぜひ知ってほしい点です。新しめのプロダクトでもJavaは利用されているのです。

SpringFrameworkとは

Javaの世界で最も勢いのあるフレームワーク群です。10年くらい前はフレームワークが乱立している時代があったそうですが、今はSpring1強といっても過言ではありません。

SpringFrameworkとは総称で、実際には作りたいものにあわせて利用するプロダクトを選択します。Webアプリケーションであれば「Spring MVC」や「Spring Boot」があります。

特に最近は、Spring Bootの人気が急上昇しています。お手軽にWebアプリケーションを作成できるという長所があります。

ちなみに:周辺ツールもあわせたJavaの開発風景

ついでに簡単ですがJavaの開発風景をご紹介します。

記憶が正しければ、授業ではJava6かJava7の標準ライブラリだけで何かを作っていたと思います。

実際の開発では、世の中にjarファイルという形式で便利なライブラリが数多く出回っているので、それを個別に追加して利用することがほとんどです(例えば使いづらいと評判のjava.util.Calendarに変えてJoda-Timeというライブラリがあります。ちゃんと月や週が1から始まります)。

ただ、手動でjarファイルをダウンロードして追加して…というのは大変なので、「Maven」や「Gradle」と言ったツールを利用し、使いたいjarファイルをファイルに書いて勝手にダウンロード+追加してもらう方法がメジャーです。(RubyでいうGemfile的な感じのもの?誰か適切な例を教えてください)

今回もSpring Bootとそれに関連するjarファイルをMavenで管理しビルドしています。若干説明が雑ですが、イメージで掴んでください。

実際に作ってみた

前置きが長くなりましたが、簡単にSpring Bootを利用したWebアプリケーションを作ってみます(と思いましたが燃え尽きました。Hello Worldだけで許してください)。

Spring Bootで開発する際はSpring Initializrという便利なサイトがあるので、ここでプロジェクトを新規作成します。

とりあえずHello Worldを作りたいので、Dependenciesに「Web」だけ追加して作成します。zipファイルがダウンロードされ、解凍するとMavenのプロジェクトが出来ているのでEclipseでimportします。

スクリーンショット 2016-12-06 15.30.12

出来上がったプロジェクトを見てみると、おなじみのmainメソッドが書いているソースコードがあります。何も考えずに実行してみましょう。

スクリーンショット 2016-12-06 15.38.04

アスキーアートとともにWebアプリケーションが起動します。Spring BootはデフォルトでWebサーバを内包しているので、mainを実行(またはjarファイルを作成して実行)するだけでWebアプリケーションが起動します。デフォルトのポートは8080です。

http://localhost:8080/に接続すると、以下のようなエラーが出ます。これは、サーバは立ち上がっているものの、 / に対するマッピングをまだ定義していないのでエラーになっています。

スクリーンショット 2016-12-06 15.41.51

とりあえずHello Worldだけ表示したいので、JSONを返却するControllerクラスを作成します。Springでは@Controllerというアノテーション(@ついてるやつをそう呼ぶ)をつけると、Controllerクラスとして認識されます。

@RequestMappingアノテーションでマッピングもあわせて定義しておきます。@ResposeBodyはJSONで返却するという意味です。

(ちなみにこの調子で画像を大量に使って説明します。どこに作成する〜とかの説明省きたいだけの手抜きです。)

スクリーンショット 2016-12-06 16.20.39

再び実行し、http://localhost:8080にアクセスしてみましょう。Hello Worldが表示されます。

スクリーンショット 2016-12-06 16.24.20

ただ、これだけだと単なる文字列を返却・表示しているだけなので、Webアプリケーションというにはかなり微妙です。

テンプレートエンジンのThymeleafを利用して、ちゃんとしたHTMLを返却するように書き換えましょう。まずはMavenの管理ファイルであるpom.xmlにThymeleafを使うための設定を追加します。(これでThymeleaf関連のjarファイルがダウンロードされるようになります)

また、Thymeleafでは src/main/resouce/templates/ 配下に置かれたファイルが認識されるので、index.htmlを作成して配置します。あわせてControllerクラスの返却値を”index”に変更し、作成したファイルがビューとして返却されるようにします。

スクリーンショット 2016-12-07 16.10.04

本来はテンプレートエンジンと言うくらいなので動的なページを生成できますが、今回は手抜きで単なるHTMLファイルを配置しています。

再度実行してみましょう。同じくHello World! が表示されていますが、HTMLが返却されるようになっています。

スクリーンショット 2016-12-07 16.11.39

Hello World!が表示できました。ここまで3分くらいで出来たと思います。

このようにSpring Bootを使うと、JavaでもHello Worldくらいならあっという間に作成できます。ロジックが全く無いので、Webアプリケーションというにはとてつもなく微妙ですが、とりあえず何か表示させる程度ならすぐ出来るということです。決して力付きたからそれっぽいことを言っているわけではありません。

(ちなみに従来のフレームワークだと、ビルドして、Webサーバを用意して、デプロイして、挙動を確認して、と色々煩雑でした。Spring Bootはそういった点も見直されていると思います。)

その他すごそうなところ

先ほどの要領で、やりたいことを実装していけばそれっぽいWebアプリケーションが作成できますが、正直他のフレームワーク使っても全然いいとは思います。

しいてSpringFrameworkの強みを上げるなら、標準で様々な機能が提供されているので、ほとんどの機能はリファレンス通りに実装するだけで作成できると思います。欠点は「英語のドキュメントしかない」ということです。(最近はSpringのせいで英語勉強してます。)

あとは色々と便利な機能もあります。例えば「Spring Boot Actuator」を利用すると、Webアプリケーションの状態や設定が確認できるエンドポイントが追加されるので、いちいちログや設定見なくてもよくなります。/env でシステムプロパティが見れたり、/traceで直近のアクセスログが見れたりします。

スクリーンショット 2016-12-07 15.48.51

スクリーンショット 2016-12-07 16.26.16

やり方を忘れましたが、サーバのヘルスチェックや、障害発生時に頑張ってSorryページを表示したりもできた気がします。その他、ロギング、認証・認可、データベースアクセス管理、セッション管理など、あまり自力実装したくないところはSpringに任せましょう。

終わりに

いかがでしたでしょうか。本当はもう少しちゃんとしたアプリケーション作ろうと思っていたのですが、色々書きすぎて広く浅い内容になってしまいました。すみません。「Javaはこんな感じなんだ、へ〜?」と雰囲気だけでも感じていただければ幸いです。

以下、個人的な所感ですが、学生時代は使いづらいと感じていたJavaも、実際には他言語のよいところをしっかりと取り入れて着実にパワーアップしていると知ることができました。

SpringFrameworkがバージョンアップしているのはさておき、言語仕様としてもJava8でラムダ式使えるようになったり、次期バージョンのJava9ではREPL(jshell)の導入があるため、いちいちビルドしなくてもコードを実行できるようになります。良い改良が多いように感じます。

コードが長くなりがちなことや、XMLなどの定義ファイルが多いことも欠点として上げられる事が多いですが、実際には周辺ツールが強力なのでそんな苦に感じることもないです。

学生時代はそんなことも知らず、import文を手書きで書いてたり、ビルド手動でやったり、C言語を真似てクラスにひたすらメソッド定義したり、変なことばっかりしてたらそりゃ嫌いになるよなあ…と反省しました。

皆さんも良いJavaライフをお送りください。

次の記事

明日は @fk2763owl さんの「なにかしらをいい感じに」です。よろしくお願いします。

関連記事

no image

bashにおける角括弧”[]“の扱いで困ったこと

あるShellScriptでパスワードを乱数生成するときに   $ cat /

記事を読む

スクリーンショット 2014-08-05 0.53.46

初心者のiOSアプリ(収支表)作成記。その1

iOSアプリ作成経験0の私が、収支表アプリを作ってみます。 ブログ書きながら勉強してるのでほと

記事を読む

no image

シェルスクリプトでtsvファイルとcsvファイルを処理する方法

シェルスクリプトでtsvファイルを要素ごとに配列に格納し、処理する方法です。 普通はcsvファ

記事を読む

no image

chromeで「このウェブページにアクセスできません」が出たときの対処法

自宅以外の環境でchrome使おうとして、検索した瞬間に「このウェブページにアクセスできません」と出

記事を読む

no image

Java8のtimeパッケージのLocalTimeとLocalDateを触ってみた

ほんのりと仕事に出てきそうな匂いがあったので、 予習もかねてjava8のtimeパッケージを触

記事を読む

no image

CSSで表の罫線出そうとしたら点線と実線が混ざってどん詰まりした話

デザイナーさんからもらったCSSをHTMLの表に適用したら、 IEで見た時だけなぜか枠線の一番

記事を読む

no image

javaでzip作る時の圧縮レベルの話

いわゆる無圧縮zipファイルをjavaで作ることがあったので、覚え書きです。 ついでに圧縮レベ

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

no image
学生時代に1ミリも知らなかったJavaの開発風景

※この記事は、苫小牧高専 Advent Calendar 2016 -

no image
gitbucketで再起動に失敗してDBエラーが起きた話

とあるAdvent calendarを書くことになったのですが、そもそ

no image
機械学習について簡単におさらいした

機械学習について、実際あんまりよくわかってなくね?ってなったので

no image
svnを使っている作業場でgitを普及させるためにやったこと

今回は、ある作業場でgitを普及させたい!という思いから、私が個人的に

no image
jenkinsのジョブでIllegalArgumentExceptionが起きた

Jenkinsのジョブで、 java.lang.IllegalArgu

→もっと見る

PAGE TOP ↑