Open27

Spring勉強メモ

hayaohayao

Spring は Spring applicatin contextとして参照されるコンテナを提供する

Springのコア

Spring applicatin context: application conponent を生成・管理する。

それらのapplication conponent もしくははbeanがSpring application context内で配線される。

このコアコンテナの上にSpringと関連ライブラリのフルポートフォリオが提供するもの

  • Web framework
  • data永続化
  • セキュリティ
  • 他システムとの統合
  • ランタイムモニタリング
  • リアクティブプログラミングモデル
hayaohayao

歴史的にはSprigin application contextはxmlファイルで管理されていた。

最近: アノテーションベースが一般的になっている。

@Configuration Spring application contextにbeanを供給
@Beanそれが返すオブジェクトはbeanとしてapplication contextに加えられるべき
@Component,@Controller,@Serviceetc...はつけられてたクラスそれ自体をSpring application contextにcomponentとして登録するが@Beanはその関数が変え返すオブジェクトをBeanとして登録する。

https://www.greptips.com/posts/1318/

アノテーションベースのメリット

  • Type Safety
  • リファクタリング容易性

Spring の技術

auto wiring

自動であるコンポーネントが依存する他のbeanを注入する。

component scan

クラスパスからコンポーネントを探し、application contextにbeanとしてそれらを生成する。

hayaohayao

Spring Boot

component scan + autowiringを越えた自動設定機能をもつ。

auto configuration

クラスパスや環境変数などのエントリに基づいて、どのコンポーネントを設定して配線する必要があるかを合理的に推測する。

hayaohayao

pomってなんや。。?

Mavenの設定ファイルということしか分からん。。。

<parent>エレメント

spring-boot-starter-parent Springプロジェクトでよく使われる依存関係を管理する。

hayaohayao

@SpringBootAplication

これはSpring Bootのアプリケーションですよー

@SpringBootConfiguration

@Configurationの特別な形式
このクラスを設定クラスとして指定する

@EnableAutoConfiguration

Spring Boot自動設定を有効にする。

https://qiita.com/kazuki43zoo/items/8645d9765edd11c6f1dd

@ComponentScan

コンポーネントスキャンを有効にする。
@Component,@Controller,@Serviceetc...をつけているクラスをSpring application contextにcomponentとして登録する。

run()メソッド

Spring application contextを生成する。

test

なんもやってないように見えるが、Spring application caontextのロードが成功してたかチェックしちえる。

@SpringBootTest

JUnitにSpring Bootの機能付きでテストするよと伝えている。
@ExtendWith(SpringExtension.class)

hayaohayao

Spring MVC

Controller

リクエストをハンドルしてレスポンスを返すもの。 Routerのことだよね?

@Componentとつけることでcomponent scanでこの関数をapplication contextに入れてくれている

テスト

@MebMvcTest
Spring MVC applicationのコンテクストで走らせる
ControllerがSpring MVCに登録される

Tomcat Webサーバーはアプリケーションの一部である。

DevToolsの機能

  • コード変更時のアプリケーション自動再起動
  • リソース変更時のブラウザの自動更新
  • テンプレートキャッシュの自動無効化
    などなど・・

コード変更時のアプリケーション自動再起動

よく変更されるやつとあんまり変更されないやつ別々のクラスローダーにロードされる

依存するライブラリはあんまり変更されない方。したがって依存関係を変更するとアプリケーションのハードリスタートが必要になる

hayaohayao

Lombok

Lombokの@Dataアノテーションを使うと色々なメソッドとコンストラクタをコンパイル時に生成してくれる。

Slf4j

Simpole Logging Facade for Java

Lombokの@Slf4jアノテーションは
明示的に

private static final org.slf4j.Logger log =
    org.slf4j.LoggerFactory.getLogger(ClassName.class);

とクラス内で宣言したのと同じ効果をもつ。

hayaohayao

Servlet

特定のタイプのネットワークリクエストに応答するクラス。サーブレットはサーブレットコンテナの中で走る。

Servlet Container

ネットワークサイドを扱う e.g. HTTP Requestのパース、コネクションハンドリング
有名なサーブレットコンテナ → Tomcat

hayaohayao

formのaction属性を省略すると宛先が文書と同じURLになる

Converter

リクエストパラメータの型変換を行うために実装が必要

FormとObjectのbinding

thymeleafではth:objectth:filedを使う

hayaohayao

Validation from imput

愚直なやりかた

handler内でif文の洪水を書く。

Springのやりかた

Java's Bean Varlidation API

validationをad hocにやるんじゃなくてclassに引き寄せる
アノテーションでどんなバリデーションをするか書いていく。

@ModelAttribute

https://kazkn.com/post/2017/use-model-attribute

hayaohayao

リレーショナルデータベースをJavaで扱うときの最もよくある選択肢

  • JDBC
  • JPA
hayaohayao

コンストラクタが1つのときは@Autowiredは省略できる。

JDBC template

定石(なのかは分からんが。。)

  1. findAl() findById()などを定義したインターフェイスを定義する。
  2. そのインターフェイスを実装したレポジトリを定義する。
  3. auto wiringでそのリポジトリを使うところに注入する
  jdbcTemplate.query(クエリ文字列、結果をオブジェクトに変換する関数の参照 or RowMapperのインスタンス);
  jdbcTemplate.update(クエリ文字列);
hayaohayao

クエリ実行

クラスパスにファイルを置く

DDLがschema.sql DMLがdata.sql?

hayaohayao

Spring Data JDBC

Spring Dataを使うと自動でレポジトリを作ってくれる?

RepositoryCrudRepository

CrudRepostory

saveやfindById、findAllなどのデフォルト実装を提供

永続化のためのアノテーション

@Table

Option。デフォルトではdomainクラスの名前をベースにテーブルの名前がつけられる。
例 TacOrder → Taco_Order
@Table{"Taco_Cloud_Order")見たく書くことで任意の名前をつけられる。

@Id

idを指定

hayaohayao

Application startup

アプリケーションスタートアップ時にロジックを走らせるためのインターフェイス
CommandLineRunnerApplicationRunner

どちらも関数インターフェイスでrunメソッドをもっていて、CommandLineRunnerまたはApplicationRunnerを実装したBeanはapplication contextとビーンが繋げられたあとに各自のrunメソッドが呼ばれる

違いは引数。CommandLineRunnerはString varargs 。ApplicationRunnerは`ApplicationArguments'というコマンドラインをパースして引数としてアクセスできるメソッドを持っている型。

hayaohayao

Spring Data JPA

@CrudRepositoryを実装したときにメソッド名から実装を推論する。
@Queryをつけて明示的に動作をしていできる。

Spring Data JDBCでも@Queryは使えるが、

  • すべてのカスタムクエリは@Queryが必要
  • @Queryに書くのはJPA queriesではなく、SQL query
hayaohayao

@RestContoroller

目的

  • ComponentScanで見つけてもらうため
  • 返り値がビューをレンダリングするためではなく直接レスポンスのボディに書き込まれるということ表すため

@RestControllerを付与する代わりに@Controllerを使うと書くハンドラに@ResponseBodyをつけなくてはならないかResposeEntityオブジェクトを返さなくてはならない。

@CrossOrigin

異なったホストからユーザーインターフェイスが提供される場合、APIの使用が妨げられる。これを解消するためにはCORSを使う必要がある。@CrossOriginはCORSの利用を簡単にする。

hayaohayao
hayaohayao
  @Override
  public Collection<? extends GrantedAuthority> getAuthorities() {
    return Arrays.asList(new SimpleGrantedAuthority("ROLE_USER"));
  }

Collection<? extends GrantedAuthority>はGrantedAuthorityを継承している任意のクラスのコレクションと言う意味?

hayaohayao
hayaohayao

Spring Security

セキュリティ
ログイン、ログアウト、ユーザー登録

SecurityFilterChainをBeanとして登録する、
リクエストのauthorizeする
ログインページの設定

hayaohayao
hayaohayao

Springの基本設計

インターフェイスに対してプログラミングする。

環境に対して実装があって、実装とインターフェイスをSpring DIがつないでいる

hayaohayao
hayaohayao

application.properyは@Componentとanotateされたクラスとつながっている?

hayaohayao

@ConditionalOnProperty プロパティにある記述がされているときに有効になるという意味

hayaohayao

TODO Spring 6とSpring Boot 3.0の前バージョンとの変更点を把握する