spring boot + doma + angularjsで作るerp 〜javaqneバージョン〜 #jqfk

53
Spring Boot + Doma + AngularJS で作るERP ~ JavaQneバージョン ~ JavaQne 2015 Fukuoka 2015/01/24

Upload: -

Post on 16-Jul-2015

1.536 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

Spring Boot +

Doma +

AngularJS で作るERP

~ JavaQneバージョン ~JavaQne 2015 Fukuoka

2015/01/24

Page 2: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

自己紹介• 名前: 松崎 学

• Twitter: matsumana

• blog: http://matsumana.info

• 所属: 株式会社キャム http://cam-net.co.jp/

• 職業: ソフトウェアエンジニア (プログラマ、ITインフラエンジニア)

• ITインフラ勉強会@福岡、MySQL Casual Fukuoka 主催

Page 3: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

JJUG CCC 2014 Fall で発表してきました!

その時のスライドは これです

http://goo.gl/CGWzRG

Page 4: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

今日お話する事

• サービスの特徴と、それを支える技術の概要 ・サービスの歴史 インフラ編 ・サービスの歴史 フレームワーク編 ・現在のアプリの開発環境

• Spring Boot, Doma, AngularJSを選んだ理由と実際に使ってみた感想

Page 5: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

まず始めに

Page 6: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

ERPとは何か?企業全体を経営資源の有効活用の観点から 統合的に管理し、経営の効率化を図るための 手法・概念のこと。 ERPが一般的に扱うものは企業における 製造・物流・販売・調達・人事・財務会計である。 ERPパッケージはこれらの基幹業務に関する 業務活動の情報管理を支援する。

Wikipediaより http://ja.wikipedia.org/wiki/企業資源計画

Page 7: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

基幹システムとは何か?

企業の情報システムのうち、業務内容と直接に関わる販売や 在庫管理、財務などを扱うもの。 あるいは、単に、業務やサービスの中核となる重要なシステム。

IT用語辞典 e-Wordsより http://e-words.jp/w/E59FBAE5B9B9E7B3BBE382B7E382B9E38386E383A0.html

Page 8: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

例えばERPでカバーする サブシステムには

次のようなものがあります

Page 9: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

• 受発注

• 購買債務

• 販売債権

• 製造

• 在庫

• 原価

• 財務会計

• 管理会計

Page 10: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

• 人事

• 給与

• 勤怠

• などなど

Page 11: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

• サービス(SaaS)として提供マルチテナントなアプリ顧客のオンプレミス環境ではなく、弊社が構築・運用しているインフラ環境(AWS) でアプリを稼働させている

• インフラ費用は全て弊社負担インフラ費用増 = 利益減少ないリソースでリクエストを捌く事が非常に重要

• OSやブラウザのバージョンアップ対応は無償

サービスの特徴

Page 12: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

サービスの歴史 インフラ編

• 2007~ 国内データセンター

• 2013~ AWS

Page 13: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

インフラの 全体概要図

Page 14: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

http://goo.gl/cTexvM

Page 15: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

• サーバやミドルウェアは必ず障害が発生する前提で考えたインフラ構成とアーキテクチャ

• 一部に障害が発生してもサービスが止まらないように各レイヤーは冗長構成にする

• サービスが止まるような障害の場合でも出来るだけ早く復旧出来るようにする

インフラ構成のポイント

Page 16: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

使用しているソフトウェア• Webサーバ: Apache 2.2

• APサーバ: Seasar2 → Tomcat 6 Java EE 6 → GlassFish 3.1.2.2 Spring Boot → Tomcat 8

• DBサーバ: PostgreSQL 9.3

• 監視: Zabbix 2.0・EC2インスタンスのリソース監視、可視化、 アラート通知・Java GatewayでJVMを監視、可視化、アラート通知

Page 17: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

Zabbix Java Gateway を使ってJMX経由で ヒープを可視化したら

こんな感じ

Page 18: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

Jenkinsをどんな感じで 使っているかについては 別の資料があるので 抜粋してご紹介します

http://www.slideshare.net/itokami1123/jenkins-java-spring20140609

Page 19: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

GitHUB Jenkins

ソースのバージョン管理はGitを使用してます。

GitHub上のリポジトリにソースを集約してます。

PUSH( ∵ ( ∵ ( ∵

\プルリク・プルリク/

Page 20: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

GitHUB Jenkins

GitHubからを5分毎にポーリングして

マージしたソースをJenkinsに取得しています。

PULL( ∵ ( ∵ ( ∵

\Git plugin!/

* /5 * * * *

Page 21: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

GitHUB Jenkins

Jenkinsの状態(ビルド開始など)をHipChatで通知します。

HipChatは他にもGitHubの状態などにも使ってます。

通知

( ∵ ( ∵ ( ∵

\ Jenkins HipChat Plugin /

\ コンパイルはじまった! /

Page 22: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

GitHUB Jenkins

ビルドジョブを実行します。緊急でビルドだけしたい時も考え

てテストジョブは分けてます。

( ∵ ( ∵ ( ∵

\ ビルドなう! /

maven

mvn install -DskipTests=true

ビルド ジョブ

JSHintやCheckstyleで品質管理

Page 23: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

GitHUB Jenkins

ビルドジョブ終了をキッカケにテストジョブを実行~。

テストジョブ終了をキッカケにデプロイテストを実行~。

( ∵ ( ∵ ( ∵

ビルド ジョブ

テスト ジョブ

\ 上流から下流ジョブ /

デプロイテスト状況を結果通知

/ちゃんと動いてる!\

Page 24: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

GitHUB Jenkins

ステージング環境やプロダクト環境に配備するJOBは手動で

実行しています。(課題の切りのよいタイミングで行う為)

( ∵ ( ∵ ( ∵

ステージング ジョブ

ステージング環境

\ 結合試験! /

課題管理はJIRA使ってます。

手動で起動

Page 25: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

ログ収集はFluentd

Page 26: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

• AWS (EC2, S3, Route53, SES, RDS, VPC)

• GitHub

• レスポンスタイム可視化: New Relic

• ログ分析: Google BigQuery

• 通知: HipChat

使用しているサービス

Page 27: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

次はアプリのお話

Page 28: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

サービスの歴史 フレームワーク編

• 2007~ Seasar2 (Teeda + S2Dao) ※現在も稼働中

• 2012~ Java EE 6 (JSF + JPA) ※現在も稼働中

• 2014~ Spring Boot + Doma + AngularJS

Page 29: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

アーキテクチャを 選定する上で重要なポイント• ERPはミッションクリティカルかつ、ライフサイクルが長い (世間では10年間とか使われる事もある) 弊社では同じアプリを10年使い続けるのではなく 定期的に作り直す事にしています (いわゆる式年遷宮) 10年前の製品に現在どのくらい魅力があると思いますか?

• 画面の操作性、入力効率、サクサク感を重視

• インフラのコストを抑える (少ないサーバリソースで多くのリクエストを捌く)

Page 30: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

サービスを長い間 開発・運用してると

色んな問題が 出てくるものです

Page 31: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

• IEの互換モードでしか動かないアプリ(2007年のサービスローンチ時点ではIEは7だったし Chromeも存在しなかった)

• 時代遅れ感が出てきたUI(最近はリッチなWebサイトやスマホアプリが 普及して顧客の目も肥えてきている)

Page 32: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

• APサーバやサードパーティコンポーネント(PrimeFaces)のバグに遭遇OSSなので自分で直すという選択肢はあるが、それに割くリソースを確保できなかった

• APサーバのリソース消費が高い

• アプリのもっさり感

Page 33: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

2014年1月から 新アーキテクチャでの アプリ開発を開始

Page 34: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

いくつかのアーキテクチャの候補を考え

試作アプリを作り 検討を重ねて採用したのが

Page 35: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

Spring Boot+

Doma+

AngularJS

Page 36: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

なぜSpring Boot?• 組み込みAPサーバでお手軽

• Tomcat/Jettyで必要十分だった。リソース消費も少ない

• Spring Bootなら各種設定や依存ライブラリの指定も楽

• Springもバージョンアップ時の互換性を重視しているので長く使える事が期待できる (Groovy, Grailsみたいにならなければ・・・)

Page 37: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

なぜDoma?• JPAに馴染めなかったキャッシュ、N+1問題、エンティティ管理状態(JPAで扱いやすいテーブル設計になってない気もした)

• SQLは自分で書く、SQLは外部ファイルに書くというS2Daoのスタイルに慣れているし、Domaはより便利になっている

• 依存ライブラリが無いので導入しやすい

Page 38: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

なぜAngularJS?

• AngularJSについては、この後@itoKami1123さんに話してもらうので割愛

Page 39: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

現在のアプリの 開発環境

• 開発はLinux上でやってます

• vagrant upしてリモートデスクトップでログイン

Page 40: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

• Windowsで開発し、本番がLinuxだと それに起因するバグを出してしまう事がある・文字コード問題・改行コード問題・パス区切り文字問題・レポートのレイアウト崩れ問題(JasperReports)など

Page 41: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

• 必要な開発ツールのごった煮感が半端なくて、セットアップが大変なのでチームのメンバーにVirtualBoxとVagrantを インストールしてもらい、boxファイルとChefのcookbookを配布※ホストOSとゲストOSでクリップボードの共有が おかしいので、ちょっと不便です・・・

Page 42: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

プロビジョニングしている ソフトウェア (1)

• Java8

• Maven

• Node.js

• PostgreSQL 9.3

• Fluentd (td-agent)

Page 43: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

プロビジョニングしている ソフトウェア (2)

• Chromium

• Mozc

• LibreOffice

• oh-my-zsh

• xrdp

Page 44: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

Spring Boot, Domaを 使ってみた感想

Page 45: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

Spring Boot / Spring• Seasar2とJava EE 6を使ってきたので、Springのコンテナ機能(DI, トランザクション, AOPなど)は理解しやすかった

• テストライブラリが充実していて良い感じ

• アプリの起動が早く快適に開発できる

• サーバのリソース消費が少ない

Page 46: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

Doma• SQLでゴリゴリ書きたい派には、とてもオススメ

• 依存ライブラリが無いのも、とてもいい感じ

• 便利機能がいっぱい・Java8対応・コンパイル時チェック ・SQLファイル内の変数チェック ・SQLファイルの存在チェック・ページング (Limit, Offset, 総レコード件数)

他にも沢山あります。詳しくはドキュメントを http://doma.readthedocs.org/ja/latest/

Page 47: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

モジュール構成 (概要)

• マルチモジュール構成

• Javaのビルドルーツ: Maven

• フロントエンドのタスクツール: Grunt maven-grunt-pluginを使ってMavenから起動される jshint, karma(Jasmine), concat, cssmin, uglifyを実行する

Page 48: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

Spring BootやDomaに 関するブログを

いくつか書いてます

Page 49: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

• Spring BootでO/Rマッパーの比較

• Spring Bootのコネクションプーリングの比較

• Spring Bootのアプリケーションサーバの比較

• Spring BootでISUCON4予選のJava実装を作った

• Spring Bootで現在捌いているリクエスト数を取得する

• Spring + Domaで実装したアプリのユニットテスト

http://matsumana.info/blog/categories/spring/

Page 50: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

次のような場合は Java EE(JSF)を 選択した方が 良いのかも

(個人的な意見です)

Page 51: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

• 閉じた環境で特定のユーザのみが使用するシステム

• 保守サポートが必要な場合

• フロントフレームワークに絡んだ改修予算が確保できない場合

Page 52: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

ここまでのまとめ

• 標準技術だから。流行っているから。ではなくきちんと検討・検証して自分達にあうものを選びましょう

Page 53: Spring Boot + Doma + AngularJSで作るERP 〜JavaQneバージョン〜 #jqfk

次は @itoKami1123さんによる

AngularJSの話です

スライドはこちらhttp://www.slideshare.net/itokami1123/20140124-angular-js