覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

JSUG勉強会 2017年その2 ~ 脱Spring Boot初心者 に行ってきました

JSUG勉強会に参加してきました

以下自分用のメモ


概要

  • 開催場所 : Pivotal Japan
  • 開催日時 : 2017-02-27(月)19:00 - 21:00


Spring for Spring Boot -Spring Bootユーザーが知るべきSpringの基礎知識-

多田 真敏氏 (株式会社カサレアル、Pivotal認定講師)

Spring Bootから始めた人に知ってほしいSpringの基礎知識を解説

  • Spring Bootは何をしているの?
    • Spring vs Spring Boot
      • Spring Bootになった際に、Configがなくなっただけで後は基本的に同じ
    • Spring Bootの価値
      • デフォルトの設定を提供してくれる。本来のアプリ開発をすぐ始められる
    • Soringにおける設定 ≒ Bean定義
  • Spring の基本!Bean定義を理解しよう
    • Bean ・・・ SpringのDIコンテナで管理しているインスタンス
    • Bean定義=このクラスのインスタンスをBeanとして扱ってとDIコンテナに教えること
    • 各種定義方法
      • (1) アノテーション+コンポーネントスキャン
        • `Configuration + @ComponentScan
        • basePacages属性を指定しなかった場合、この@ComponentScan付与されているクラスが属しているパッケージがスキャン対象となる
      • (2) メソッドによるBean定義
        • Java Config内に@Beanを付与したメソッドを作成。⇒戻り値がBeanになる
    • Spring4.3以降では@Autowiredは省略可能(コンストラクタが1個だけであれば)
    • Java Configの合体
      • @ImportでJava Configを合体できる
      • アプリが大規模になった場合に活躍する。重要。
  • Spring MVC の仕組みを理解しよう
    • Dispatecherですべてのリクエストを受け付けて、Controllerに処理振り分け
    • ViewResolver
      • ビューの論理名からビューの物理名を解決する
      • 各View技術用のViewResolver実装クラスが存在する
        • Thymeleafの場合はThymeleafViewResolver
      • Java8TimeDialectをセットすることでDate and Time APIを解釈できるようになる
    • Spring MVCが動作するにViewResolver以外にも多くのBeanが必要
      • ⇒ @EnableWebMvc
        • 正体は@Import
    • 静的ファイルの扱い
      • WebMvcConfigurerを利用してルーティング設定を追加
        • 通常はWebMvcConfigurerAdaoterクラスを利用する
    • @Configurationの正体は@Component
    • 正体は@Componentなアノテーション
      • @Controller
      • @RestController
      • @Service
      • @Repository
      • etc
    • WebApplicationInitializerでDispatcherServletの設定を記述できる
  • Auto Configurationのソースを読んでSpring Bootを理解しよう
    • 設定の自動化の正体
      • 大量のJava Configクラスがあらかじめ用意されている
      • あるクラスがクラスパス上に存在するかどうかなどの条件で、各Java Condigクラスや各@Beanメソッドを有効化/無効化している
    • メッセージ
      • プロパティファイル名はデフォルトは「messages.properties」
    • 静的ファイル
      • クラスパス直下のstaticフォルダ等が指定されている
    • Bean定義カスタマイズ例
      • (1) application.properties
        • @COnfigurationProperiesなクラス⇒Bean定義で使われる
      • (2) 自分でBean定義する
      • (3) Customizerを利用する
        • XxxCustomizerをBean定義すれば、Auto ConfigurationクラスがDIコンテナから拾ってくれる
  • まとめ
    • 脱Spring Boot初心者となるには、Springの基礎知識が大事
      • Spring Bootを使わずにアプリを作り、Auto Configurationのソースを読みながらアプリをSpring Boot化していこう


実例で学ぶ、明日から使えるSpring Boot Tips

槙 俊明 (Pivotal)

  • Spring Boot is
    • Opinionated Framework on Spring Ecosystem
    • できるだけSpring Boot Wayに乗るべき(むりやり既存のやり方を持ち込むとひずみが生じる)
  • Error画面
    • 以下を用意するだけで良い
      • src/main/resources/static/error/403.html, 404.html, 40x.html, 500.html, 50x.html
    • 動的指定したい場合は以下
      • src/main/resources/templates/error/403., 404., 40x., 500., 50x.
    • application-default.properties
      • server.error.include-stacktrace=always を指定すると ${trace} にStackTraceが入る
    • @ControllerAdviceを指定して、@ExceptionHandlerを使うと全Controllerに適用される
  • profileの指定方法
    • アプリの引数
    • システムプロパティ
    • 環境変数
  • Spring Data RESTによるREST API
    • Repository -> REST API
    • 永続化層に対する操作に対するREST API(HTTP操作)を自動的に提供してくれる
    • Controllerすら書かなくてよくなる
    • コード量が大幅に減る
    • FooRepository#finadName -> /foos/search/findByName?name={name}
    • @RestResource(exported = false) <- 外部に公開したくないエンドポイントの場合
    • その他
      • PagingAndSortingRepository
    • RepositoryEventHandler
      • Repository操作に対するイベントハンドラ。業務ロジックなどを書くことができる
    • トランザクション境界
      • 普通のアプリではServiceでは、@Transactional
      • Spring Data RESTでは、AOPで強引にトランザクション境界を引き延ばせる。が、もしかしたらバッドノウハウかも。
  • CSRF対策
    • Spring Securityを導入するだけでCSRF対策される
    • Ajax / SPA の場合は?
      • CookieCsrdTokenRepositoryを使用する(デフォルトはHttpSessionCsrfTokenRepository)
      • AngularJS
      • Axios
        • PromiseベースのHTTPクライアント
        • X-XSRF-TOKENという名前のCookieが入っていたらHTTPリクエス
  • @EnableOAuth2Sso
    • token = Authoraization Code
    • PrincialExtractor
      • ユーザ情報の作り方などをカスタマイズできる
    • GitHub以外でもOK
      • Authoraization Server ・・・ @EnableAuthoraizationServer
      • アカウントを一元管理できる
  • @ConditionalOnProperty
    • 一つのinterfaceに対して複数の実装を使い分ける方法の一つ
    • 設定の内容に応じて実装が切り替えられる
  • @COnfigurationProperties
    • TypeSafeなプロパティ
    • ConfigurationProcessorを使ってメタ情報も吐くようにしたほうが良い
  • Spring Boot Acturator
    • 1.5からSpring Actuatorでデフォルトでセキュリティ認可が行われる(ROLE_ACTUATOR)



関連エントリ