Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Spring Fest 2017 の資料

Thirosue
September 18, 2021
37

Spring Fest 2017 の資料

Thirosue

September 18, 2021
Tweet

Transcript

  1. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 2

    ⾃⼰紹介 • 名前 – 廣末 丈⼠(ひろすえ たけし) • 仕事 – 官公庁のSIプロジェクトの開発リーダ – 新技術検証、プロトタイプ開発 • 好きな技術・サービス – AWS – Docker – Spring Boot(Java) • GitHub https://github.com/Thirosue • Quita https://qiita.com/takeshi_hirosue
  2. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 3

    対象者と前提 • 対象者 – 開発者(Springにこだわらない) 特に開発標準策定に関わるアーキテクトの⽅。今⽇話す内容で共感した箇所 を、⾃⾝のプロジェクトに持ち帰って取り⼊れてください。フィードバック (mail/PR/Issue)⼤歓迎です︕ – プロダクト管理者 今⽇話す内容で気になった箇所について、⾃⾝のプロダクトの現状をチェッ クしてみてください。 • 前提 – 具体的な作り⽅(コード中⼼)にフォーカスします。 – 独⾃フレームワーク路線ではなく、Spring Bootの使い⽅を中⼼に話します。 – 図が少ないため、少し解りづらいかもしれません。。。
  3. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 4

    アジェンダ 1 始めに 2 アプリ構成概要 3 共通処理 3-1 バリデーション 3-2 オブジェクトマッピング 4 データアクセス 4-1 Doma 4-2 エンティティリスナー 4-3 排他制御 4-4 その他便利機能 5 セキュリティ 5-1 権限制御 5-2 ⼆重送信防⽌ 5-3 監査情報制御 6 静的コンテンツ 6-1 ライブラリ管理(WebJars) 6-2 キャッシュ制御 7 チーム開発 7-1 開発環境管理 (Docker/Flyway) 7-2 テスト管理(Spock) 8 運⽤ 8-1 Spring Profiles 8-2 ロギング 8-3 アプリケーションの状態 8-4 JMX監視 8-5 設定ファイル暗号化
  4. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 6

    SpringBootは動くものをシンプルに作成・デプロイできる優れた仕 組みです。 しかし、開発者に実装を⼀任すると、プロダクトコードが望むものに なっている可能性は低いです。 ここでは、弊社の直近のSpringBoot開発プロジェクトのソースコー ドを参考に、開発実装基盤として設計・実装しておくべき点について、 実際のソースコードを交えてご説明します。 1 はじめに
  5. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 7

    本セッションで取り上げる主な課題 1 はじめに 設計 開発 運⽤ 設計・実装における横断的関⼼事 (ロール制御、監査情報、ロギングetc) 開発環境管理 テスト管理 フロントライブラリ管理 開発を効率化するライブラリ選定 システム監視
  6. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 9

    O/RマッパーにDoma、ビルドツールはgradleを利⽤ 2 アプリ構成概要 Spring Boot Jetty MySQL Spring MVC Doma ThymeLerf Spring Security
  7. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 10

    Spring以外の主な登場プロダクト 2 アプリ構成概要 名称 内容 オブジェクトマッピングライブラリ。 WebJars クライアントライブラリ管理ライブラリ。 JQuery、BootStrap等をjarに同梱する。 DevOpsを⽀える軽量なコンテナ管理ソフトウエア。 DBマイグレーションツール。 テストフレームワーク。Groovyで記載できる。 統合監視ソフトウエア。
  8. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 11

    本セッションでサンプルとして⽰すソースコードの⼤半はGitHubよりクロー ンすれば、すぐに動かせる状態となっています。 気になる箇所をIDE等でご確認ください。 事前準備 https://github.com/miyabayt/spring-boot-doma2-sample
  9. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 12

    字が⼩さすぎて⾒えない⽅ SlideShareに資料アップしています。 事前準備 https://www.slideshare.net/takeshi_hirsoue/
  10. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 14

    デフォルトでは、単項⽬チェックのアノテーションは存在しますが、相関チェックを⾏うアノテー ションは提供されていません。 相関チェックについては、以下2点のいずれかで実装する⽅針が考えられます。 1. ⾃作アノテーション実装 2. Spring Vaildatorを利⽤ 弊社では、実装のシンプルさを重視し、2の⽅針を採⽤しました。 3-1 バリデーション 課題 Bean Validatorで提供してない、相関チェックをシンプルに実装したい アプローチ
  11. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 15

    確認⽤のパスワードのチェックを例に説明します。 例)確認⽤のパスワードのチェックの実装 3-1 バリデーション 凡例 Spring標準 拡張実装
  12. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 16

    Spring Vaildatorを拡張した基底クラスの実装例 →デフォルトでは、supportsを実装不要とし、アプリ開発者は利⽤するフォームクラスを指定し、 doValidateのみ実装する。 3-1 バリデーション 凡例 Spring標準 拡張実装
  13. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 17

    コントローラの実装 →作成したバリデータをインジェクションする →作成したバリデータをWebDataBinderに追加する 3-1 バリデーション 凡例 Spring標準 拡張実装
  14. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 18

    Spring MVCではコントローラでModelに情報をセットし、画⾯に情報を表⽰します。 サービスから取得した情報をModelにセットする場合、処理を1⾏1⾏書く必要があります。 例)ModelにaddAttributeで画⾯表⽰項⽬を設定 3-2 オブジェクトマッピング 課題 項⽬が多い詳細画⾯のコード量を削減したい 単純な画⾯への表⽰項⽬追加対応でコントローラを修正したくない アプローチ
  15. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 19

    ModelMapper (org.modelmapper:modelmapper) Bean間で属性のコピーを⾏えるマッピングライブラリ →類似ライブラリは、commons.BeanUtilsやDozer等 →シンプルさと制約等が特にないことからModelMapperを採⽤ 3-2 オブジェクトマッピング 凡例 Spring標準 拡張実装
  16. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 20

    プロジェクト個別要件は、JavaConfigで調整 例)EntityのPKはコピーしないように調整、外部キーをcastする。 3-2 オブジェクトマッピング
  17. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 22

    O/Rマッパーの選択は、好みが別れ選定が難しいですが、弊社基盤ではDoma2を選定しました。 選定理由は、 – XML不要でシンプルにSQLテンプレートファイルを利⽤できるため – 2Way-SQLであり、SQLテンプレートに記載したSQLをSQL実⾏ツールでそのまま実⾏できる ため です。 ※アノテーション1つで便利な機能も利⽤できるところもポイント⾼い 4-1 Doma 課題 XMLはできるだけ利⽤したくない SQLを外部ファイルで管理したい アプローチ
  18. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 23

    SQLテンプレートの利⽤は、以下で対応できます。 1. インターフェースの作成 2. メソッドに対応したSQLファイル作成 例)インターフェースの実装例 CodeエンティティをOptionalでselect 4-1 Doma
  19. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 24

    SQLテンプレートファイルの作成 → src/main/resources/META-INF/(FQCN)/(class name)/(method name).sqlで配置 →コンパイル時にインターフェースの実装クラスが⾃動⽣成される 4-1 Doma
  20. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 25

    エンティティ基底クラスを作成し、更新イベントをエンティティリスナーでハンドリングする。 例)エンティティ基底クラスの作成 →共通処理をハンドリングするためエンティティリスナーを指定 4-2 エンティティリスナー 課題 システム制御項⽬の更新処理を⼀箇所にまとめたい アプローチ 凡例 Spring標準 拡張実装
  21. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 26

    例)エンティティクラス →基底クラスを継承 4-2 エンティティリスナー 凡例 Spring標準 拡張実装
  22. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 27

    例)エンティティリスナークラス →システム制御項⽬の更新処理を共通化する 4-2 エンティティリスナー 凡例 Spring標準 拡張実装
  23. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 28

    Domaでは@Versionアノテーションを利⽤するとデフォルトで楽観的排他制御が可能です。 具体的には、以下のフローで楽観的排他制御を実装します。 1. 画⾯制御で改定番号を含めてSELECTする 2. SessionAttributeを利⽤し、更新セッションで改定番号を保持しておく 3. 更新時に更新セッションで保持していた改定番号をエンティティに設定する 4. 更新件数が0件の場合は、楽観的排他エラーとなる。 1) 画⾯制御で改定番号を含めてSELECT 4-3 排他制御
  24. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 29

    2) SessionAttributeを使⽤し、更新セッションで改定番号を保持しておく →改定番号を保持した、基底Formクラスを⽤意しておき各画⾯フォームは継承する →各画⾯フォームを更新セッションで保持 4-3 排他制御 凡例 Spring標準 拡張実装
  25. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 30

    3,4) 更新セッションで保持しておいた改定番号をエンティティにセットして、更新処理を実⾏ →改定番号を更新条件に含めて更新処理を実⾏、例外時は楽観排他例外がスローされる 4-3 排他制御 3) 4)
  26. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 31

    Domaでは以下の様な便利機能があります。 1. EntityにNullがセットされた項⽬は更新対象にしない 2. 指定されたプロパティは更新対象外とする 例)Null項⽬を更新対象外にできる属性︓excludeNullを指定し、論理削除フラグのみ更新する 例) 指定されたプロパティは更新対象外にできる属性︓excludeを指定し、コード値のみ更新する 4-4 その他便利機能 凡例 Spring標準 拡張実装
  27. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 33

    ⼤抵のアプリケーションでは権限制御が必要です。 弊社基盤ではSpEL( Spring Expression Language )を⽤い権限テーブルを設計することで、 きめ細かい権限制御を実現しています。 例) 権限テーブルのDML →SpELを⽤いて、直感的な権限定義を実現 →RDBのみで管理できるメンテナンス性を重視し、Spring Securityのメソッドレベルの権限制御 は不採⽤とした →コントローラへのアノテーション実装を採⽤すると、アプリケーション拡張に⽐例し、メンテナ ンスコストは増⼤する 5-1 権限制御 課題 権限管理を⼀箇所にまとめたい 更新権限、参照権限を各々管理できるようにしたい アプローチ
  28. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 34

    次にアプリケーションの権限制御について説明します。 権限制御⽤のインターセプターを実装し、コントローラのメソッド単位の権限制御を実施しました。 例)権限制御を⾏うインターセプター 5-1 権限制御 凡例 Spring標準 拡張実装
  29. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 35

    例)SpELを評価するユーティリティ実装 →SpringSecurityで保持している認可情報とコントローラのメソッド名をSpELで評価 →コードテーブルの編集権限「^Code.(new|edit)Code$」保持しているユーザは、CodeControllerの newCode及びeditCodeの実⾏を許可する 5-1 権限制御
  30. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 36

    ECサイト等のアプリケーションを実装する際、必ず⼆重送信防⽌制御の実装が必要になってきます。 ⼆重送信防⽌制御は、クライアントサイドでの対応も必要ですが、サーバサイドでも実装しておく 必要があります。 弊社基盤では、以下実装で⼆重送信の抑制を⾏っています。 1. フォームの再送信の禁⽌(Post-Redirect-Getパターン) 2. トークン制御による⼆重送信の抑制 5-2 ⼆重送信防⽌ 課題 ⼆重送信防⽌制御を基盤として実装しておきたい アプローチ
  31. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 37

    ▪フォームの再送信禁⽌ 更新完了時は、参照画⾯にリダイレクトさせます。 例)更新時にリダイレクトして、ブラウザ再読込でフォーム再送信させない 5-2 ⼆重送信防⽌ 参照画⾯ に戻す
  32. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 38

    ▪フォームへのトークン埋め込み RequestDataValueProcessorを実装し、⼊⼒フォームに⼆重送信防⽌のトークンを埋め込みます。 例)カスタムトークンをhiddenに設定 5-2 ⼆重送信防⽌ 凡例 Spring標準 拡張実装
  33. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 39

    ▪⼆重送信防⽌トークン制御 インターセプターを実装し、以下を制御します。 1. コントローラ動作前に⼆重送信防⽌トークンをセット 2. コントローラ動作後にトークンが⼀致した場合、トークンを再発⾏する → 結果、⼆重送信時(次回リクエスト時)はトークンが⼀致しない 例)⼆重送信防⽌のインタセプター実装 5-2 ⼆重送信防⽌ 2) 1) 凡例 Spring標準 拡張実装
  34. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 40

    ▪⼆重送信チェック実装 実際のエラー制御はエンティティリスナーで実装する。 Insert実⾏前にトークン⽐較を⾏い⼀致しない場合、例外をスローする。 例)エンティティリスナー実装 5-2 ⼆重送信防⽌ 凡例 Spring標準 拡張実装
  35. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 41

    ▪コントラーでのエラーハンドリング ControllerAdviceを実装し、例外をハンドリングする。 例)ExceptionHandlerで例外ハンドリングし、エラー情報を設定した後、編集画⾯に戻す 5-2 ⼆重送信防⽌ 凡例 Spring標準 拡張実装
  36. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 42

    Domaを利⽤しているため、Spring Data JPAの監査情報制御を利⽤できないため、⾃前で実装し ます。 例)監査情報保持クラス →スレッドローカルかつstaticアクセス可能な監査情報保持クラスを⽤意 5-3 監査情報制御 課題 監査情報制御を⼀箇所にまとめたい アプローチ
  37. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 43

    インターセプターを実装し、監査情報を設定すると、様々な箇所で利⽤できます。 例)インターセプタ実装例︓アクセス毎に監査情報を初期化する 例)利⽤例︓システム制御項⽬更新時に利⽤ 5-3 監査情報制御 凡例 Spring標準 拡張実装
  38. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 45

    Spring Boot+Thymeleafを利⽤し、サーバサイドレンダリング中⼼のアプリケーション を作成予定でも、フロントライブラリの管理はやっておきたいです。WebJarsを利⽤す れば、クライアントライブラリの依存関係もgradle/mavenで⼀元管理できます。 例)gradleでjqueryやbootstrapのバージョン管理 例)JavaConfig設定例︓WebJarsをResourceHandlerに登録する 6-1 ライブラリ管理(WebJars) 課題 フロントライブラリも⼀元管理し、不要なプラグインの利⽤に起因する問題を抑制したい アプローチ 前提 弊社のエンジニア構成はサーバサイドエンジニア中⼼のため、社内標準ではSpring Boot+ Thymeleaf構成を採⽤しています 凡例 Spring標準 拡張実装
  39. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 46

    例)Thymeleafテンプレートにはバージョン指定不要 →フロントライブラリはlayout.htmlで⼀元管理する 例)実際に出⼒されたHTML →バージョンが⾃動付与される 6-1 ライブラリ管理(WebJars)
  40. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 47

    静的コンテンツファイルの更新時に必ず発⽣するキャッシュ問題。 SpringBootでは容易にキャッシュ制御ができるため、 万が⼀⾃⾝のプロジェクトに設定されていない場合は、必ず以下設定を⼊れてください。 例) application.yml 上記の設定だけで、静的ファイルの内容からMD5ハッシュが付与された形でリンクが作成される。 ↓ 6-2 キャッシュ制御 課題 本番リリース時にWebブラウザのキャッシュによる不具合を防⽌したい 開発時も、対顧客やテストチーム等との無駄なやり取りを抑制したい アプローチ
  41. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 49

    弊社では、以下技術を採⽤し、ミドルウエア構築の⾃動化を実施しています。 – Docker(ミドルウエア構築の⾃動化) – Flyway(DBマイグレーション) Dockerは、dockerコマンドを利⽤する⽅針でも良いのですが、Gradle Docker pluginを利⽤ し、静的ライブラリの管理同様、gradleで⼀元管理できるようにしました。 例)Dockerプラグインを利⽤したtask定義 →docker build、docker run等のdocker操作コマンドをタスク定義 →開発者はDockerを意識せず個⼈の開発環境を利⽤可能 7-1 開発環境管理(Docker/Flyway) 課題 実⾏環境による差異をなくしたい 新規参画者の環境構築コストを最⼩化したい アプローチ
  42. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 50

    Dockerでのミドルウエア設定同様、DB定義もバージョン管理し、最新の断⾯が再現できる状況が好 ましいです。 弊社基盤では、Flywayを利⽤し、DBマイグレーションによりDB構築を⾃動化しています。 例)application-development.yml →Flywayを有効化 例)マイグレーションファイルの配置 7-1 開発環境管理(Docker/Flyway)
  43. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 51

    テストコードには、仕様・処理の明確化が求められます。 チーム開発で明確な⽅針がない場合、テストコードの仕様理解や変更時のメンテナンスに⼯数が割 かれ、開発スピードが落ちてしまいます。 弊社では、以下観点より、Spockを採⽤しました。 – ブロック記法による記述の統⼀ – DSLを使った簡潔で分かりやすい記述 Before) After) →when(テスト対象となる動作を記述)、then(whenの実⾏結果として、期待される条件を記述)等 のブロック記法で仕様をより明確に →設計者によるテスト仕様レビューの敷居が下がる 7-2 テスト管理(Spock) 課題 テスト仕様の明確化、テスト仕様レビュー⼯数の最⼩化 アプローチ
  44. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 53

    8-1 Spring Profiles データベースの接続設定やログレベルの設定等、開発環境と本番稼動時に切り替えたい設定が多々あ ります。本番リリース時に本番設定⽤のファイルを上書きしてビルドする⽅法を採⽤してい⽅も多い と思います。Spring Bootでは、設定ファイルの切り替えという課題に対し、Profilesという仕組み が⽤意されています。 例)開発環境(application-development.yml)と本番環境(application-production.yml)の設定 ファイルを⽤意 例)application.ymlの設定例 以下の例は開発環境をデフォルトとしている 課題 各環境ごとの設定を管理したい 各環境へのビルド⽅法を均⼀化したい アプローチ
  45. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 54

    8-1 Spring Profiles Springでは、起動時に有効なプロファイルを指定して、アプリケーションを起動することができます。 例)本番環境の起動コマンド JVMのシステムプロパティ -Dspring.profiles.active=production で起動 時のプロファイルを指定 →本番リリースするjarファイルはテスト済のファイルをそのまま持っていくことができる。※再ビルド不 要 ▪設定ファイル(application.yml)のパラメータの上書きについて Spring Bootでは、設定ファイルの個別設定も起動時に上書きしてアプリケーションを起動できます。 上書きする⽅法は、以下の⽅法などがあります。 1. JVMのシステムプロパティ(上記例の指定⽅法) 2. コマンドライン引数(--spring.profile.active=production) 3. OSの環境変数(SPRING_PROFILES_ACTIVE=production) 例)コマンドライン引数を⽤いて、TymeleafのログレベルをDEBUGで起動する 例)OS環境変数を利⽤してアプリケーションポートを指定し、同⼀アプリケーションを複数起動する java -jar -Dspring.profiles.active=production application.jar java -jar –logging.level.org.tymeleaf=DEBUG application.jar export SERVER_PORT=18081 java -jar application.jar #18081portで起動 export SERVER_PORT=28081 java -jar application.jar #28081portで起動
  46. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 55

    8-2 ロギング 課題 SI開発では、機能開発やデザイン調整が優先され、⾮機能要件の整理が後回しになることがあります。 ログ設定が適切でないことで、障害原因が特定できなくなることもあります。 SpringBootではデフォルトでロギングが有効となっており、デフォルトではlogbackが採⽤されます。 しかし、デフォルトではコンソール出⼒だけであるため、本番環境リリース時はログ出⼒設定は必須 となっています。 最低限の設定であれば、application.ymlで各コンポーネントのログレベル指定やログファイル出⼒ の可能です。 例)rootロガーをINFO、jdbcのログレベルをDEBUGにし、./log/app.logにログ出⼒ しかし、本番稼働を⾒据えると、以下の要望が発⽣する事が多いです。 – ディスク使⽤量調整のためのログローテーション – 障害監視のための、アプリケーションエラー情報のみ別ファイルへの出⼒ 上記課題に対し、 弊社では、Logback設定ファイルのlogback-spring.xmlを配置し、カスタマイズ設定する⽅針を採 ⽤しました。 アプローチ
  47. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 56

    8-2 ロギング Springで利⽤するlogbackは、Springと連動して、以下拡張設定が可能です。 – Spring Profiles連動 – Property連動 例)springProfileタグを利⽤し、Spring Profilesと連動する 例)springProPertyタグを利⽤し、application.ymlのプロパティ値をlogbackと連動する 凡例 Spring標準 拡張実装
  48. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 57

    8-3 アプリケーション状態 課題 障害等の想定外の挙動が発⽣した場合、アプリケーションの状態の確認が必要となります。 ログ確認で原因が特定できない場合、追加調査が必要となります。 Spring Bootでは、Spring Boot Actuatorを⽤いると様々な情報がHTTPアクセスで取得できます。 利⽤⽅法は、依存関係に「spring-boot-actuator」を追加するだけです。 例)gradleの設定例 追加されるエンドポイントの主要なものを紹介します。 endpoint 概要 /autoconfig AutoConfigureで有効になっているもの、無効になっているものを表⽰ /beans DIコンテナに管理されているBeanの⼀覧を表⽰ /env 環境変数、システムプロパティ⼀覧を表⽰ /dump スレッドダンプを表⽰する /health ヘルスチェック /metrics メトリクスを表⽰する アプローチ
  49. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 58

    8-3 アプリケーションステータス 続いて、⼀般ユーザからこれらの内部情報をアクセスできなくなるよう設定する必要があります。 例)application.ymlの設定例 例)Endpoint(/metrics)の例 メモリ、ヒープ、スレッド等のメトリクスが取得できる
  50. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 59

    8-4 JMX監視 課題 開発では機能開発やデザイン調整が優先され、⾮機能要件の整理が後回しになることがあります。 アプリケーション監視設定が適切でないと、サービス稼働後の運⽤対応が後⼿に回ってしまいます。 Spring Bootでは、JMX(Java Management Extensions)を有効にする事で、メモリ使⽤量、GC の状況、セッション数等のアプリケーションの稼働状況を知る事ができます。 例)application.ymlの設定例 JMXを有効にしただけでは、アプリケーションの継続的なモニタリングはできないため、監視ツー ルと連携して、アプリケーションのメトリクスを継続してモニタリングできる状況が望ましいです。 弊社では、監視ツールのZabbixと連携し、上記を実現していますが、ここでは、Zabbixの設定⽅ 法は割愛します。 アプローチ
  51. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 60

    8-5 設定ファイル暗号化 課題 通常の受託開発では、ソースコードの納品が必要になります。 納品した設定ファイルにデータベースの接続情報が平⽂で記載されているのはセキュリティ上 好ましくないです。 ここでは設定ファイルの暗号化の⼿順を紹介します。 まず、暗号化ライブラリを追加します。 例)gradleの設定例︓ 依存関係に「jasypt-spring-boot-starter」を追加 続いて、JavaConfigで暗号化を有効にし、暗号化対象の設定ファイルを追加します。 →@EnableEncryptablePropertiesを指定し、暗号化を有効にする →@EncryptablePropertySourceに暗号化対象ファイル(application.yml)を 列挙する アプローチ 凡例 Spring標準 拡張実装
  52. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 61

    8-5 設定ファイル暗号化 Jasypt.jarをダウンロードし、パスワードを暗号化します。 →ダウンロードしたjarを⽤い、javaコマンドでDBパスワードの「passw0rd」を、「master」 (鍵)で暗号化 最後に、設定ファイルに暗号化されたパスワードを指定します。 例)application.yml設定例 →defaultでは、ENC(暗号化されたパスワード)を指定する 鍵パスワード 暗号化されたパスワード
  53. Copyright © 2017 Bigtree Technology&Consulting Ltd. All Rights Reserved. 63

    開発基盤を整備する時間を⼗分に⽤意することで、全体的な開発⼯ 数は間違いなく下がるはずです。 本⽇紹介したサンプルで気に⼊った箇所はプロジェクトに取り⼊れ て、より楽に開発しましょう︕ 最後に https://github.com/miyabayt/spring-boot-doma2-sample 本⽇利⽤したソースコードは以下 フィードバックください。 [email protected]