「WebLogicってなんなの？」をWebLogic初心者向けに説明する

# この記事の目的
WebLogicとは何か？について、WebLogic初心者（プログラマー、システムエンジニア、営業さん）向けに解説します。
次の言葉を自分なりに説明できる状態を目指します：

- WebLogic
- Java EE
- アプリケーションサーバー

私（システムエンジニア）が入社一年目、これらの言葉が全くわからなかった経験があるので、同じような境遇の方の助けになればと思います。

また、少しばかり営業さん向けとして、製品の具体名を挙げるようにしています。
競合製品の把握などで参考にしてください。



# 先輩「WebLogicの代わりにGlassFishでJava EE開発の練習しといて」私「…？」
新人研修を終えて現場配属になった私に、WebLogicとの出会いは突然訪れました。
OJT担当の先輩から告げられたのは次のような言葉でした：

> ここの案件ではアプリケーションサーバーとしてWebLogicを使っているんだけど、今回はJava EE 7の調査も兼ね、GlassFish 4を使って練習用のアプリケーションを作っておいてください。

日本語でおk。
かろうじて、「WebLogicはアプリケーションサーバー（として使える何か）」であることがわかりますが、それ以外は何が何だか。

*GlassFishって何？それがJava EEの調査になるって？WebLogicはなんで出てきた？待って、そもそもアプリケーションサーバーをよく知らない。*

先輩にとってこれらは当たり前のことだったようで、開発環境とドキュメントは揃えたからあとは頑張ってみて、といった様子でした。
とはいえ、わざと教えないわけではないので、自分なりに調べたうえで質問をぶつければ丁寧に答えてくれました。
Webで調べたり、自己投資として専門書[^専門書][^バージョン古い]を買ったり、先輩に説明時間を取ってもらったりして、次第にイメージを掴んでいきました。

[^専門書]: [Beginning Java EE 6 GlassFish 3で始めるエンタープライズJava（日本オラクル株式会社 株式会社プロシステムエルオーシー Antonio Goncalves） ｜ 翔泳社の本](http://www.shoeisha.co.jp/book/detail/9784798124605)

[^バージョン古い]: Java EE 7と言われながらJava EE 6の本を買ったのは、6と7の違いもよくわかっていなかったのと、実際には「Java EE 7で…」ではなく「GlassFishで…」としか言われなかったからです。表紙に魚 (glassfish) の絵があったので買ったというレベル。



# アプリケーションサーバーとは
少しずつ理解を深めましょう。
まずは「WebLogicはアプリケーションサーバーである」を理解するため、アプリケーションサーバーについて説明します。

アプリケーションサーバーはサーバーの一種なので、まずはサーバーについて整理します。


## サーバーとは「実行し続けるプログラム」のこと
**サーバー**は、クライアントからの要求（_リクエスト_）に応答（_レスポンス_）を返すプログラムです。
起動後は、エラーが起きたり停止コマンドを入力したりするまで停止せず、ひたすらリクエストを待ち続けます。

これは、リクエストがいつ来るかわからないタイプの処理をするためです。
たとえばWebページを見るとき、私たちはWebサーバーに対してリクエストを送り、ページの内容をレスポンスとして受け取ります。
サーバーでないプログラムは、必要な処理を終えるとすぐに停止するので、このような処理はできません。

Server ＝「給仕 (serve) する人」という言葉のイメージどおりです。


## 特別なコンピューターのことをサーバーと呼ぶのでは？
「サーバー」という言葉は、ラックに入った特別なコンピューター（サーバーマシン）を指すこともあります。
そのため、「サーバー」と聞くと特別なコンピューターと特別なプログラムの組み合わせをイメージしがちですが、プログラムとしてのサーバーは手元のノートパソコンでも実行できます。

ただ、普通のパソコンでは、エンタープライズ向けの「24時間365日常時電源オン」や「同時に1000人分のリクエストを処理」などといった要件をとても満たせません（試したことはないけどすぐに壊れそう）。
そのため、サーバーというプログラムを安定して動かすこと特化したコンピューターが必要で、それを「サーバー」と呼ぶことがあるのです。

誰かが「サーバー」と言ったときには、どの意味を指すのか注意が必要です。
この記事では、サーバーはプログラムのことです。


## サーバーの一種－アプリケーションサーバー
サーバーには種類があります。
代表的なものは次のとおりです：

- Webサーバー
- アプリケーションサーバー
- データベースサーバー

### Webサーバーとは
**Webサーバー**は、Webページを配信するサーバーです。
有名なものに

- Apache HTTP Server (Apache Software Foundation)
- IIS (Microsoft)
- NGINX (NGINX Inc.)

があります。

### アプリケーションサーバーとは
**アプリケーションサーバー**は、ユーザーが独自に作ったプログラム（アプリケーション）を読み込むことで、それを実行してくれるサーバーです。
たとえば映画チケットの予約をシステム化しようとしたら、予約処理のプログラム（アプリケーション）は自分で作る必要があります。

アプリケーションサーバーというと、Webサーバーの機能も持つ「Webアプリケーションサーバー」を指すことがほとんどのようです。
多くのサービスをWebブラウザーから利用できるのは、Webアプリケーションサーバーのおかげです。

アプリケーションサーバーは、動作するプログラムの言語によって様々な製品があります。
Javaで動くものについては、WebLogicの説明のところで紹介します。

### データベースサーバーとは
**データベースサーバー**は、データベース管理システム (Database Management System, DBMS) を提供するサーバーです。
SQLという文法でリクエストを受け、データの中身をレスポンスとして返すプログラムです。

- MySQL (Oracle)
- Oracle Database (Oracle)
- SQLServer (Microsoft)

などが有名です。

前面の入り口としてアプリケーションサーバーがビジネスルールを処理し、その後ろでデータベースサーバーがデータを管理するというシステム構成が一般的です。



# Java Platform, Enterprise Edition (Java EE) とは
ここまでで、『アプリケーションサーバー』をイメージできるようになったでしょうか。
イメージできれば、WebLogicはアプリケーションサーバーの製品の一つですから、WebLogicをほぼイメージできたことになります。
リクエストを送ると、読み込ませておいた自作のプログラムが動いて、何らかのレスポンスを返してくれるプログラム製品、それがWebLogicです。

「WebLogicはJava EE準拠のアプリケーションサーバー」なので、残りは **Java Platform, Enterprise Edition (Java EE)** についてです。


## Java EEは仕様、WebLogicは実装
Java EEとWebLogicの関係は、_仕様_と_実装_の関係です。
私はこれを理解するまで時間がかかりましたが、仕様と実装とは一体何なのでしょうか？

### 仕様 (specification) とは
Java EEという製品を売る企業はありません。
それが**仕様 (specification, spec)** であって、策定・公開するものだからです。

仕様とは、何かについて「かくあるべき」を示したものです。
たとえばスマホアプリには、「保存ボタンを押すと変更内容を保存する」とか「更新ボタンを押すと一覧を新しくする」とかの仕様が決められています。

Java EEは、Javaというプログラミング言語に、企業向けの機能を盛り込んだ仕様です。
トランザクション管理や依存性注入といった（わからなくても大丈夫です）、信頼性や保守性を高めるためにみんなが欲しがる機能を持っています。

### 実装 (implementation) とは
WebLogicはJava EEの**実装 (implementation, impl)** のひとつです。

実装とは、実際に動作するプログラムのことです。
先ほどの例のスマホアプリで言うと、「保存ボタンを押すと変更内容を保存する」という仕様を満たす、`save()`メソッドを呼んでデータベースに`INSERT`するようなプログラムです。

Java EEはみんなが欲しがる機能を持つと述べましたが、Java EE自体は、動くプログラムではないルール集のようなものです。
誰かがJava EEに従ってプログラムを作らなければ、結局その恩恵は受けられません。
なので、OracleさんはJava EE準拠の製品としてWebLogicを開発し、ライセンス契約でビジネスをしています。


## WebLogic以外にもJava EE準拠の製品はある
実装は仕様を満たしていればいいので、仕様に明示していない内部の仕組みは実装によって変わります。
実際、Java EEのドキュメントを読んでいても、「この場合は実装方法によって結果が変わる」という文言を目にします。

Java EE準拠の製品で有名なものは、たとえば以下です：

- GlassFish (Oracle)
- WebLogic (Oracle)
- WebSphere (IBM)
- JBoss (Red Hat)

### GlassFishは特別－参照実装
仕様を策定する団体は、同時に特別な実装も開発して公開します。
それを **参照実装 (reference implementation, RI)** と呼びます。
仕様に矛盾がなく実現可能か、具体的にはどうやって作ればいいのかを示す、お手本の実装です。

仕様と違って実装（プログラム）なので、動かしてみることができます。
新しい仕様が公開されたとき、使い勝手を調べることにも使えます。

各ベンダーが参照実装以外の製品を作るのは、これまでのコードを動かし続けたいという顧客のニーズに答えたり、他製品との相性やサポート内容で差別化を図ったりするためです。
たとえばWebLogicは、高価なライセンス費がかかりますが、Oracleの強力なサポートが得られます。
GlassFishに商用サポートはないので、大規模なエンタープライズシステムで使うことはないでしょう。



# まとめ：先輩の言葉の意味
ここまで、アプリケーションサーバー、WebLogic、そしてJava EEについて説明しました。
最後のまとめと、細かい点の補足のため、冒頭の先輩の言葉を翻訳してみます：

> ここの案件ではアプリケーションサーバーとしてWebLogicを使っているんだけど、今回はJava EE 7の調査も兼ね、GlassFish 4を使って練習用のアプリケーションを作っておいてください。

> （ここの案件は大規模なエンタープライズプロジェクトなので、アプリケーションを実行するサーバープログラムとして商用サポート付きのWebLogicという製品を本番で使っているんだけど、WebLogicはまだ最新のJava EE 7仕様に対応していないから、Java EE 7の参照実装であるGlassFish 4というサーバープログラムを使って、仕様の使い勝手の調査とアプリケーション開発の練習をしておいてください。君のトレーニングにも、Java EE 7の検証にもなるし、一石二鳥だね。）

なるほど、と思えたでしょうか？



# 参考リンク
- [GlassFishの商用乗り換え先について(補足) – Mushagaeshi.com](http://www.mushagaeshi.com/2013/12/08/from-glassfish-to-other-commercial/)
- [Java 最近のアプリケーションサーバー事情（2015年） - 技術ブログ | 株式会社クラウディア](https://cloudear.jp/blog/?p=985)
- [超絶初心者のためのサーバとクライアントの話 - Qiita](http://qiita.com/shuntaro_tamura/items/ae55b99deb9e2a170754)
- [アプリケーションサーバってなに？Webサーバとの違い | 構築ツール | 知る・学ぶ | Marketing Bank （マーケティングバンク）](https://www.marketingbank.jp/special/cat02/173.php)