エンジニアHubPowered by エン転職

若手Webエンジニアのための情報メディア

【若手Javaエンジニア必読!】とりあえず知っておかなきゃ損するフレームワーク・ツール23選

システム開発において、登場頻度が非常に高いJava。数多くのフレームワークやツールが存在しますが、一体どれを選べば、効率的な開発が行えるのでしょうか。おすすめのものを一挙にご紹介します!

Javaフレームワーク23選

システム開発をする際、欠かせない存在なのが各種フレームワークやツールです。これらを導入することで、工数の削減やアプリの品質向上、セキュリティの堅牢化など数多くの利点があります。中でもJavaのフレームワーク・ツールは、Javaを開発に使用している企業の多さゆえ、利用される頻度も高いものです。

しかし、それらは数えきれないほどの種類があるため、知識の少ない若手のうちは「どれを選べばいいんだ……」と途方に暮れてしまうケースも少なくありません。

そんな悩みを解決するため、今回はよく使われるものから珍しい機能のもの、最近注目されているものまで「絶対に知っておくべきフレームワーク・ツール」を、現職Javaエンジニアに現場での経験に基づいてピックアップしてもらいました。若きエンジニアに向けたJavaスタートアップガイドとしてお読みください。

【近年注目されている3つのフレームワーク・ツール】

1.Spring Boot

f:id:blog-media:20170713142330j:plain

projects.spring.io

Spring Bootは、Springプロジェクトが提供するさまざまなライブラリやフレームワークを、シンプルで使いやすいフレームワークとして統合したものです。

「XMLを書く必要がなく、Javaのコードにアノテーションを書くだけでよい」「Mavenコマンドで実行すれば、自動的にTomcatなどのサーブレットコンテナが組みこまれてアプリケーションが起動する」など、数多くの利点を持っています。

公式サイト https://projects.spring.io/spring-boot/
GitHubリポジトリ https://github.com/spring-projects/spring-boot

2.Play Framework

f:id:blog-media:20170713142340j:plain

playframework.com

Play Frameworkは、JavaとScalaによってつくられたMVCモデルフレームワークです。有名なフレームワークであるRuby on RailsやDjangoなどの設計思想から影響を受けています。

Play Frameworkは「ソフトウェア開発の生産性を向上させること」を大きな目標としており、以下のような特徴を持っています。

  • 「設定より規約」のソフトウェア設計パラダイムを取り入れ、不要な設定ファイルを減らしている
  • ソースファイルを変更した際に、サーバを再起動せずJVMへリロード可能
  • 開発時、エラーをブラウザ上に表示できる
  • 組み込みテストランナーにより、TDD(テスト駆動開発)が実現できる

公式サイト https://www.playframework.com/
GitHubリポジトリ https://github.com/playframework/playframework

3.Lagom

f:id:blog-media:20170713142344j:plain

lightbend.com

IT領域を中心としたビジネス環境の変化スピードは、年々速くなっています。その環境下では、これまでのように「全ての要件を固めてから、長い期間をかけてシステム開発する」という方法では、変化に対応していくことができません。

その課題を解決するため、近年注目されているソフトウェア・アーキテクチャが「マイクロサービス」です。マイクロサービスは、個別に開発された小さなサービス(単一の機能を持つWeb APIなど)を組み合わせることで、大きな1つのサービスを提供することを目指します。これにより、アプリケーション開発の柔軟性や効率性が向上するのです。

Lagomは、マイクロサービスの構築を前提に設計されたフレームワーク。Lagomとは、スウェーデン語で「ちょうどいい量」という意味です。マイクロサービスにおいてサービスをただ単に小さく分割するのではなく、要件に応じた適切なサイズに分割するという意図が込められています。

公式サイト https://www.lightbend.com/platform/development/lagom-framework
GitHubリポジトリ https://github.com/lagom/lagom

【ORマッパーの定番】

4.Hibernate

f:id:blog-media:20170713142143j:plain

hibernate.org

Hibernateは、データベース操作にかかわる煩雑な作業を軽減してくれるフレームワークです。これはO/Rマッパー(ORM)と呼ばれるもので、オブジェクト指向とリレーショナルデータベースの設計思想の差を埋めることを目的として開発されています。

Hibernateはフレームワーク内部の処理によってSQLを自動生成してくれるため、発行されているSQLの内容を開発者がそれほど意識しなくていいという利点があります。一方で、SQLが隠蔽されているために、非効率なクエリが発行されていることに開発者が気づきにくいのが欠点です。

公式サイト http://hibernate.org/orm/
GitHubリポジトリ https://github.com/hibernate/hibernate-orm

5.MyBatis

f:id:blog-media:20170713142148j:plain

mybatis.org

MyBatisは、Hibernateと同様のO/Rマッパーフレームワークです。Hibernateと異なり、こちらは設定ファイルにSQL文を記述する必要があります。開発者がSQLコーディングする必要があるため、開発が煩雑になることが欠点です。一方で、SQLを自由に記述できることから、発行されるクエリのチューニングはHibernate よりもMyBatisの方がやりやすいという利点があります。

公式サイト(英語版) http://www.mybatis.org/mybatis-3/
公式サイト(日本語版) http://www.mybatis.org/mybatis-3/ja/
GitHubリポジトリ https://github.com/mybatis/mybatis-3

【自動化とロギングのツール】

6.Ant

f:id:blog-media:20170713142156j:plain

ant.apache.org

Antは、Javaベースのビルド管理ツールです。ビルド管理ツールとは、プロジェクトにおける複数のライブラリやファイルなどの依存関係を設定ファイルに記述し、目的に応じて自動的に構築し、どのような動作環境下においても同じようにアプリケーションが動くようにしてくれるツールを指します。

Antは、Javaが動作する環境ならどこでも利用可能です。また、ビルド時に実行するさまざまなコマンド(Antではタスクといいます)も、プラットフォームに依存しない形で記述できます。

複雑なビルド手順を簡略化できることや、開発者がビルド手順を自由に定義できることなどの利点があります。

公式サイト http://ant.apache.org/
GitHubリポジトリ https://github.com/apache/ant

7.Maven

f:id:blog-media:20170713142159j:plain

maven.apache.org

Mavenは、POM(Project Object Model)と呼ばれるビルドファイル(pom.xml)に設定を記述することで、テスト実行や依存ライブラリ管理などを自動化するJava用のプロジェクト管理ツールです。オープンソースプロジェクトを意識した設計思想に基づいています。

Mavenは「ライブラリ自動インストーラ」としての側面が強いです。コマンドを実行することで、必要なライブラリやプラグインなどをリモートリポジトリからダウンロードし、それらをローカル側に保存してくれます。

こうした作業を開発者の手で行わずMavenに一任することで、環境構築の工数削減やアプリケーション動作環境の統一化などが実現できます。

公式サイト https://maven.apache.org/
GitHubリポジトリ https://github.com/apache/maven

8.Gradle

f:id:blog-media:20170713142204j:plain

gradle.org

Gradleは、汎用性の高いビルド自動化ツールです。プロジェクトビルドのみならず、テストやライブラリの公開、デプロイなど数多くの作業を自動化してくれます。Groovyによって記述する設定ファイルを使用しており、XMLファイルよりも高い可読性と記述の自由度があります。

Gradleはビルド手順を自由に定義できるAntと簡単にビルドができるMavenの長所を併せ持っていて、Javaを用いた開発プロジェクトのビルド管理において高い効果を発揮するのが利点です。

また、Antタスク・ライブラリやMavanリポジトリも利用可能です。さらに、多種多様な機能のプラグインが用意されているため、高い拡張性も特徴です。もちろん、既存のAntやMavanプロジェクトからの移行も容易です。

公式サイト https://gradle.org/
GitHubリポジトリ https://github.com/gradle/gradle

9.Log4J

f:id:blog-media:20170713142210j:plain

logging.apache.org

アプリケーションの利用状況や扱ったデータの内容などがわかるように、動作履歴を特定のファイルに残したものを「ログ」と呼びます。Log4Jは、Javaアプリケーションにおいてログを出力するためのツールです。次に紹介するLogbackの先代ですが、開発での投入実績が豊富であることから、ドキュメントが大量に揃っているというアドバンテージがあり、開発現場では、いまだ現役といっていいでしょう。

「FATAL(致命的なエラー)」「ERROR(エラー)」「WARN(警告)」「INFO(情報)」「DEBUG(デバッグ)」「TRACE(トレース)」という6つのログレベルを標準提供しており、アプリケーション開発者・管理者が必要な情報に応じてこれらのレベルを切り替えることができます。

公式サイト https://logging.apache.org/log4j/2.x/
GitHubリポジトリ https://github.com/apache/log4j

10.Logback

f:id:blog-media:20170713142219j:plain

logback.qos.ch

Log4Jの後継として開発されたツールがLogbackです。Log4Jよりもさらに動作が軽量なログシステムを開発すべく、同ツールの創始者であるCekiGülcü氏によって設計されました。このツールは多くの場合、ログファサードライブラリであるSLF4Jと組み合わせて使用します。

長年にわたるLog4Jの開発ノウハウをベースとしてつくられているため、Logbackは既存のロギングシステムよりも高速に動作し、より小さなメモリ使用量で済むことが特徴です。

公式サイト https://logback.qos.ch/
GitHubリポジトリ https://github.com/qos-ch/logback

【テストと静的解析のツール】

11.JUnit

f:id:blog-media:20170713142229j:plain

junit.org

プログラムを構成する最も小さな単位(ユニット)が正しく動作しているか検証するテストを、単体テストと呼びます。JUnitは、Javaで開発されたプログラムの単体テストを自動化するためのフレームワークです。Java開発において「単体テストを実施する」と言った場合、そのほとんどはJUnitによるテストのことを指します。

一度テストコードを作成すれば何度でも高速にテスト可能であること、各テストの結果を「カバレッジ」と呼ばれる指標で可視化してくれることなど、JUnitには多くの利点があります。

近年、ビルドやテスト、インスペクションなどを継続的・自動的に実行する「継続的インテグレーション」という開発手法が主流となってきていることもあり、JUnitのようなテスト自動化ツールの重要性は増してきています。

公式サイト http://junit.org/junit4/
GitHubリポジトリ https://github.com/junit-team/junit4

12.Mockito

f:id:blog-media:20170713142236j:plain

site.mockito.org

Mockitoは、Javaの特定クラスの実装に依存しないMockオブジェクトを生成することで、そのクラスの処理による干渉を受けずに単体テストを実行できるテストフレームワーク。JUnitで単体テストを実施する際の、Mockオブジェクト作成に使用されるケースが多いです。

たとえば、「クラスAの持つメソッドB」をテストする場合、その処理がメソッドB内で呼んでいる「クラスCの持つメソッドD」の挙動に依存しているとします。その際に、クラスCのMockオブジェクトをつくることでメソッドDから任意の値を返せるようにし、テストパターンの網羅性を向上させる、といった用途で使用されます。

Java用Mockライブラリの中では特に人気が高いため、国内・国外ともに参考情報が豊富です。

公式サイト http://site.mockito.org/
GitHubリポジトリ https://github.com/mockito/mockito

13.PowerMock

f:id:blog-media:20170713142243j:plain

powermock.github

通常、Javaの文法制限の中では、privateメソッドやコンストラクタなどをMock化してテストすることは困難です。しかしPowerMockを使えば、そうした挙動をするMockオブジェクトを簡単に生成できます。

多くの場合、このフレームワークは前述のMockitoや他のMockフレームワークと組み合わせて使用されます。

公式サイト http://powermock.github.io/
GitHubリポジトリ https://github.com/powermock/powermock

14.FindBugs

f:id:blog-media:20170713142249j:plain

findbugs.sourceforge.net

FindBugsは、Javaのソースコードを静的解析し、バグになりそうなコードを発見してくれるツールです。これを導入することで、ソースコードレビューの手間を軽減したり、人間では見つけにくいコードの問題を可視化したりできます。

このフレームワークはソースコードではなく、スタンドアロンのGUIアプリケーションとして配布されています。また、統合開発環境やCIツールなどのプラグインとしても利用可能です。

公式サイト http://findbugs.sourceforge.net/
GitHubリポジトリ https://github.com/findbugsproject/findbugs

15.Checkstyle

f:id:blog-media:20170713142255j:plain

checkstyle.sourceforge.net

Checkstyle は、Java のソースコードを静的解析し、コーディング規約に即しているかどうかを判定するツールです。クラス・メソッドに対するJavadocコメントや変数名のルール、インデントの下げ方など、さまざまなコーディングスタイルのチェックを実施できます。

このフレームワークは、JVM上もしくはAntのタスク上で実行可能なJARファイルに格納されています。また、統合開発環境やCIツールなどのプラグインとしても利用可能です。

公式サイト http://checkstyle.sourceforge.net/
GitHubリポジトリ https://github.com/checkstyle/checkstyle

16.Gatling

f:id:blog-media:20170713142300j:plain

gatling.io

Gatlingは、負荷試験を実施するためのツールです。負荷試験とは、あるシステムが一定以上の処理性能を持っているか検証するため、システムに対して擬似的に大量アクセスを発生させ、反応を測定する試験のことを指します。

Gatlingは、テストシナリオの実行結果レポートが非常にわかりやすいことが特徴です。レスポンスタイムの最小値・最大値・平均値だけでなく標準偏差やP値まで表示し、グラフによる可視化もしてくれます。

公式サイト http://gatling.io/
GitHubリポジトリ https://github.com/gatling/gatling

【 よく見かける定番のフレームワーク】

17.Spring Framework

f:id:blog-media:20170713142117j:plain

projects.spring.io

Spring Frameworkは、オープンソースの Javaアプリケーションフレームワークです。DI(Dependency Injection:依存性の注入)とAOP(Aspect Oriented Programming:アスペクト指向プログラミング)に基づいた設計がされています。

DIとは「コンポーネント同士が持つ依存関係(あるクラス内で、特性のクラスを生成しているなど)をプログラムのソースコードから排除し、外部の設定ファイルなどでその依存関係を後から注入できるようにすること」を指します。

これにより、「生成すべきクラスが仕様変更で変わっても、既存のソースコードは影響を受けない」「単体テストのとき、通常のクラスの代わりにテスト用のクラスを生成できる」などの利点があります。

また、AOPとは「オブジェクト指向では役割をうまく分離できないような、クラス間を横断する共通機能を『アスペクト』とみなし、アスペクトのみを担当するモジュールを作成してその処理を一任すること」です。これによりモジュールの設計がシンプルになり、アスペクト機能の再利用性も高くなります。

公式サイト https://projects.spring.io/spring-framework/
GitHubリポジトリ https://github.com/spring-projects/spring-framework

18.Java EE

f:id:blog-media:20170713142124j:plain

oracle.com

Java EEとは、Java Enterprise Editionの略。これは、主に企業の大規模システム開発の際に必要な機能をパッケージ化したフレームワークです。「Java SE(Standard Edition)+ 企業の大規模システム開発用の拡張機能」という構成になっています。

Java EEは、業務アプリケーションに必要なコンポーネントは以下の3種類であるという設計思想に基づいてつくられています。

  • データの表示を制御する「プレゼンテーション層」
  • 業務処理を行う「ビジネス層」
  • データソースへのアクセスを行う「永続化層」

この思想をベースとした開発環境を実現するため、Java ServletやJSP(JavaServer Pages)、ビジネス層を開発するためのEJB(Enterprise JavaBeans)など、数多くの機能を提供しています。

かつて同フレームワークでは、企業システムの実現に必要な機能を充足することに力を入れており、開発簡易化のための機能が不足しているという欠点がありました。しかし、Java EE 5以降からはそれを実現するための機能強化がされており、より汎用性の高いフレームワークとなっています。

公式サイト http://docs.oracle.com/javaee/7/index.html
GitHubリポジトリ ──

19.Apache Struts2

f:id:blog-media:20170713142132j:plain

struts.apache.org

Apache Strutsシリーズは、MVC(Model-View-Controller)モデルと呼ばれるアーキテクチャに基づいて、Java Servlet APIやJSP(JavaServer Pages)などを用いたWebアプリケーションを構築できるフレームワークです。

Apache Struts2はApache Struts1の後継で、旧フレームワークの抱えていた欠点を解消し、生産性や仕様変更への対応力を向上させました。

規約に基づいたプログラミングをすることで、不要な設定を省くことを目指す「設定より規約」というソフトウェア設計パラダイムを導入しています。それにより、記載しなければならない設定ファイルの数がApache Struts1よりも大きく削減されていることが特徴です。

また、設定ファイルを用いたDIコンテナの機能により、使用するライブラリやクラスの結合度が低下しているためコンポーネント化が促進されています。

OGNL(Object Graph Navigation Language)という式言語をJSPに記載することにより、Javaオブジェクトのプロパティアクセスやメソッド利用が可能です。しかしこの機能は、幾度もセキュリティホールが指摘されています。この問題を避けるには、必ず最新版のApache Struts2を使用し、過去に発生したセキュリティー問題がどのようなものだったかを、きちんと学習しておくのが重要です。

公式サイト http://struts.apache.org/
GitHubリポジトリ https://github.com/apache/struts

20.Seasar2

f:id:blog-media:20170713142136j:plain

s2container.seasar.org

Seasar2は、Java開発の生産性を高めるためにつくられた国産フレームワークです。その使い勝手の良さから、数多くのプロジェクトで採用された優秀なフレームワークですが、残念ながらサポートは2016年9月26日で終了しています。

他のフレームワークと比較すると記述する設定ファイルの数が少ないこと、ソースコードの修正をアプリケーションサーバの再起動なしに反映させられることなどが特徴です。また、前述のSpring Framework同様、DIやAOPに基づいた設計がされています。

開発が終了していることから、新規アプリケーション開発に用いることは避けたほうがいいものの、現行のプロジェクトで見かけることも少なくないことから、ご紹介しています。

公式サイト http://s2container.seasar.org/2.4/ja/
GitHubリポジトリ https://github.com/seasarorg/seasar2

【おまけ:レベルアップのために知っておきたいツール編】

21.他のJVM言語(GroovyやScalaなど)のツール

f:id:blog-media:20170713142314j:plain

groovy-lang.org

急にJava以外の言語が登場して驚いた方もいるかもしれません。実は、GroovyやScalaなどのJVM言語はJavaと相性がよく、違う言語間であってもお互いのメソッドを呼ぶことができます。だからこそ、その言語の強みを活かした便利なライブラリやツールをJavaと併せて使うことが可能です。技術選定の際に選択肢が増えるので覚えておくといいでしょう。

たとえばGroovyで書く「Spock」というテストフレームワークは、「テスト失敗時の情報が詳細に出力される」「テスト対象のデータを用意しやすい」「モック機能がもともと備わっている」などの特徴があり、見やすくわかりやすいテストコード作成ができると人気です。

<Groovy>
公式サイト http://groovy-lang.org/
GitHubリポジトリ https://github.com/apache/groovy

<Scala>
公式サイト http://www.scala-lang.org/
GitHubリポジトリ https://github.com/scala/scala

<Spock>
公式サイト http://spockframework.org/
GitHubリポジトリ https://github.com/spockframework/spock

22.JSONパーサー(Jackson、Gsonなど)

f:id:blog-media:20170713142322j:plain

fasterxml.com

Webアプリケーション開発では、JSONというデータフォーマットを用いることが多々あります。なぜなら、複数アプリケーション間のリクエスト・レスポンスやサーバ・クライアント間のやりとりにおいて、JSON形式の文字列を用いることで言語や環境の差異を意識することなくデータの受け渡しが可能になるためです。もちろん、Javaも例外ではありません。

そこで必要になるのが、JSONの文字列とJavaのオブジェクトの双方を変換できる仕組み、すなわちJSONパーサーと呼ばれるライブラリです。Java EEやSpring Frameworkでも採用されており定番と言える「Jackson」や、Googleが開発しておりシンプルな書き方を売りにした「Gson」などがよく使われています。

<Jackson>
公式サイト http://wiki.fasterxml.com/JacksonHome
GitHubリポジトリ https://github.com/FasterXML/jackson

<Gson>
公式サイト ──
GitHubリポジトリ https://github.com/google/gson

23.テストカバレッジツール(JaCoCo、Coberturaなど)

f:id:blog-media:20170713142326j:plain

eclemma.org

テストカバレッジとは、ある網羅条件がテストによってどれだけ実行されたかを割合で示したものです。基本的にはテストカバレッジが高いほど「テストされている箇所が多い」ため、カバレッジを測定・分析することはソフトウェアの品質向上につながります。

単体テストの場合は、JUnitによってカバレッジを測定することができますが、結合テストなど手作業で実施するテストの場合はそうはいきません。その際に役立つのが、JaCoCoやCoberturaなどのテストカバレッジツールです。これらのツールを導入することで、手作業によるテストの際にもテストカバレッジの測定・分析が可能になります。

<JaCoCo>
公式サイト http://www.eclemma.org/jacoco/index.html
GitHubリポジトリ https://github.com/jacoco/jacoco

<Cobertura>
公式サイト http://cobertura.github.io/cobertura/
GitHubリポジトリ https://github.com/cobertura/cobertura

フレームワーク・ツールをフル活用し、効率の良い開発を

今回ご紹介したJavaフレームワーク・ツールは高機能&多機能なものが多いため、あなたの業務にきっと役立ってくれます。ぜひ実際に導入し、ワンランク上の開発を実現してみませんか?

編集:中薗昴(サムライト)