【忘却のJava#7】JSUG勉強会#4の参加レポート

勉強会に参加して、良い刺激を受けたので書き残したいと思います。
個人用の備忘で文章が拙劣なのは、あしからずでございます。

これまでインフラまわりの勉強会には参加してきましたが、アプリよりは初めてだったので少し緊張しました。笑
登壇者の方々は発表は苦手と言いつつ、一生懸命伝えようとしてくれた所が好印象でした。

開催概要

テーマ

JSUG勉強会 2019その4 初心者による初心者のSpring入門

日時

2019/04/25(金) 19:00~21:00

場所

六本木ヒルズ森タワー20F Pivotal Japan

セッション

4つのセッションが用意されていました。

  • JSUGの正しい参加方法 (柴田 洋平さん - JSUGスタッフ)
  • Spring Coreの解説 (田村 英雄さん - Guildhub)
  • Spring 歴約1年初心者の Test 奮闘記 (内藤千静さん - タグバンガーズ)
  • Spring Boot × Vue.jsでSPAを作る (宮坂 豪さん - アクロクエストテクノロジー)


以下はその所感とメモです。

JSUGの正しい参加方法

概要

JSUGの成り立ちや参加スタイルについて教えてくださいました。
登壇者を絶賛募集中とのことです。

所感

おそらくSpring界隈でテックメインでやっていくことはないので登壇という形でお役立てはできないかもしれませんが、これからも参加していきたいと思いました。

Spring Coreの解説

概要

DIコンテナがどのように機能しているのか、自身が理解するまでの流れをFactoryやBean定義ファイルをもとに説明してくださいました。

所感

技術者として簡単な技術を上手く使えるということも大事ですが、原則原理や成り立ちを知っているということもまた大事だと個人的には思うので、そのような説明が聞けたのは良かったです。
でも実は私はSpringBootのHelloWorldレベルしかやってなくてスプリングのスの字も分かってないので、肝心のDIコンテナやらFactoryやらBeanやらの中身はポカーンでした。
なので、ここに備忘として書いておいて、次回までには抑えておければと思ってます。

メモ

  • 以前はSpring(DIコンテナ)がどうやってServiceとRepositoryをインスタンス化しているか分からなかった。。
    • Controller -> Service -> Repository -> DBのような関係性でServiceがnewされる度にRepositoryが勝手に作られる蜜結合の状態を避けたい
    • ⇒インタフェースとFactoryを利用すればよい

  • Factoryクラスを毎回作るのは大変⇒設定ファイルからインスタンス化対象を読み取り、インスタンス化したい
    • クラスの置き換えには実装の変更が必要⇒設定ファイルから依存関係を読み取り、インスタンス化したクラスに注入したい
    • これらはReflectionを使えば実現できる!

  • setter injectionとかauto wiredとか
    • これらを理解する前にBean定義ファイルを勉強せよ

  • 現在はSpring Bootのアノテーション(@Service / @Autowired / @Repository)で簡単
    • XML Beam定義ファイルも不要

  • Bean定義ファイルを使っての開発はSpringの基礎なので、しっかり勉強しておくことがオススメ!
    • 金融案件なんかではまだ使っているところもある

Spring 歴約1年初心者の Test 奮闘記

概要

Springを使った開発におけるTestの自動化方法について説明してくださいました。

所感

Springもよく知らない、Testもよく知らない状態から実際に仕事で使えるところまで成長されたところが素晴らしいと思いました。
SpringやTestをあまり知らない人向けに説明してくれていたので分かりやすかったです。

メモ

  • 今までスクショ、エクセルのTestばかりやってた・・
    • JavaのTestディレクトリの存在も知らず
    • ⇒Unit TestをJUnitで書けば、何度でも楽にテストができる!

  • 依存している未完成のクラス多くてmockないとTestきついとき
    • Mockitoを使ってMockitoJUnitRunner.classを差し込めばいける

  • @Mock / @InjectMockを使ってTest対象のクラスをUnit Testする

  • SpringRunnerとは?
    • Bean同士の連携テストを行いたい、テスト上でDIコンテナを活用したいときに使用する機能
    • @RunWith(SpringRunner.class)をおまじないとして書く

  • @WebMvcTestで仮想Web層をたててレスポンスステータスのチェックTestとかできる

  • MockMvcResultMatchers.jsonPathでjsonのエラーメッセージのチェックも可能

  • データベースへのIntegration Test
    • DB接続は@DataJpaTestでTest
    • DBのTestにはデータがいるのでH2という内臓DBでデータをつくる

  • SpringRunnerを使用することでテストの幅が広がる (Web MVCいける)
    • SpringでのUnitTestは書きやすい(一年初心者の私でも書けた!)

Spring Boot × Vue.jsでSPAを作る

概要

まさにタイトルの通りですが、ご自身が作成されたSpring Boot + Vue.jsのアプリ構成や構築するまでの流れを解説していただきました。

所感

登壇者の方も言っていましたが、平成最後に聴いたプレゼンとなりました。
そう思うと感慨深いです。
仕事的にタイムリーな内容だったので楽しく聴かせていただきました。
いまどきはVueでSPAつくって処理はフロントエンドに寄せるんだよ、なんて話をどこかで聞いていはいましたが、まさにそのような構成になっていてだいぶイメージが湧きました。

メモ

  • SPAとは?
    • Single Page Application = 単一ページのみで構成されたWebサイト
    • 従来のクラサバのリクエストレスポンスとは違い、クライアントサイドのJSが動的に画面差分の更新を行う
    • (JSはAjax or WebSocketでAPIリクエストを送り、変更があったら更新)

  • 構成は?
    • クライアント <-> Vue.js <-> Spring Boot <-> Mybatis <-> MySQL

  • やったことの流れ
    • (1)Spring Bootプロジェクトの雛形作成
    • (2)Spring Bootに書くAPIの機能を実装
    • (3)Spring Security認証周りを整備
    • (4)Vue.jsで画面周りを実装
    • (5)Vue.jsのビルド媒体をSpring Boot内に配置
    • (6)Spring Bootだけでアプリ起動可能に

  • (1)Spring Bootプロジェクトの雛形作成
    • Spring Initializrで雛形を作成 
    • Webページからさくっと雛形を作れる

  • (2)Spring Bootに各APIの機能を実装
    • Spring BootはREST APIサーバという立ち位置
    • Controllerクラスに@RestControllerを付けた
    • 画面遷移、画面表示はサーバサイドに持たせない
    • サーバサイドでHTMLをつくらない、Thymeleafは使わない
    • APIサーバという立ち位置なので、クライアントとは疎結合な関係

  • (3)Spring Security認証周りを整備
    • Spring SecurityでAPI呼び出し時に認証トークンがないものは、受け付けない
    • ログイン用APIだけは、認証トークンなしでもアクセス可能にした (/loginだけ)

  • (4)Vue.jsで画面周りを実装
    • 画面表示/更新(vue)
    • 画面遷移(router) ⇒controller的なやつ
    • 画面操作に応じたRestAPIの呼び出し(actions) ⇒Ajaxリクエスト・レスポンス
    • 画面表示を司るデータの管理・更新 (state・mutations)
    • state⇒ユーザ情報とか画面上のデータ一覧情報とか
    • mutations⇒stateに一元的にアクセスし、アクセスログを管理  
  • (5)Vue.jsのビルド媒体をSpring Boot内に配置
    • SPAの資産の配信方法の選択肢はどんなものがあったか?
      • ①nginxやApacheで配信
      • ②Spring Bootで配信
    • 今回は②を採用 (利用者数が少ないのでSpring Bootだけでシンプルに)
    • クライアントのビルド成果物(html,css,js)の出力先をSpring Bootプロジェクトのsrc/main/resources/staticに設定
    • Gradleでビルド(npm run build)を実行するように設定
    • 静的ファイルも内包したjarファイルが完成

  • (6)Spring Bootだけでアプリ起動可能に
    • あとは java -jar xxx.jarで起動するだけ
    • Spring Securityとして静的ファイルへのアクセス許可が必要

  • はまりどころ
    • 問題: セッションが切れてもログアウトされない(SPAだと認証トークンの有効期限が切れても、画面遷移できてしまう)
    • 対策: 遷移前にトークンが有効かどうかチェックするためにサーバにリクエストを送るようにした

  • ユーザ情報はクライアントサイドでどう管理する?
    • stateで一元的に管理する

  • APIそものの管理はどうしてる?
    • 今回はSpring BootのControllerクラスに書いているだけ
    • クラスに書いているだけだとフロントとバックエンドで会話できないのでAPI仕様書は書いた

  • セッション管理はVue.jsの設定等でも実現できるのでは?
    • サーバ再起動時などサーバとクライアント側で整合性が取れなくなる場合もあると考え、同期がとれる方式にした

資料

まだ公開されていないようなので追って更新します。


以上。