Skip to content

Springの入門

Thinking Jay edited this page May 26, 2024 · 3 revisions

1. プロジェクト関係設定

プロジェクト生成

  • ライブラリー
  • ビューの環境設定
  • ビルドと実行
    1. ./gradlew build
    2. cd build/libs
    3. java -jar hello-spring-0.0.1-SNAPSHOT.jar
    4. 実行確認

2. Springのウェブ開発

概要

ウェブの開発の仕方が一通り、三つで分かれる

  • 静的なものを送る
  • MVCパターンに通じてサーバーで動的ページを送る
  • API
    • Reactようなクライアントサイドレンダリングやモバイルアプリなどに使用する

静的コンテンツ

最初に、TomcatからSpringはコントローラーで探す。なければ、スタティックのファイルを探す。

MVCパターンとテンプレートエンジン

MVCパターンの以前

  • 昔にはViewでコントローラーやデータベースの役割も含まれていた。
  • 例えば、PHPである。

MVCパターンの必要性

  • レイヤーを分離すると保守に有利になる
  • Viewは見えることだけ、コントローラー、モデルはビジネスのロジックを担当する

API

@ResponseBodyタグを貼り付ければビューが呼ばれない。HTMLボディで返すことができる。

  • ViewResolverの代わりにHttpMessageConverterが動く
  • 基本の文字の処理はStringHttpMessageConverter
  • 基本のオブジェクト処理はMappingJackson2HttpMessageConverter
    • オブジェクトを返したらJSONに変換されて伝わる
    • JSONにシリアライズするには通常、JacksonとGson(グーグル制作)が使用される
  • クライアントのHTTP Acceptヘッダーとサーバーのコントローラーの戻り値タイプが組み合わさって、コンバーターが選ばれる

3. 会員管理の例 ーバックエンド開発

ビジネスの要求事項

  • 会員ドメインとリポジトリ作り
  • 会員リポジトリテストケースの作成
    • @AfterEach:各テストが独立的に実行するために個別テスト終了の際実行するコードを実装できる関数。テストはなるべく独立的に実行する方がいい。

会員サービス開発

  • 会員サービステストケースの作成
  • 会員サービスクラスにリポジトリをDIで修正
    • @BeforeEachを利用して各テストケースごと、独立性のために改めてサービスとリポジトリを生成する

4. スプリングと依存関係

コンポーネントスキャンと自動依存関係の設定

  • Springは@Componetが張り付いてるクラス全部を集めてSpringコンテナに登録する。
    • @Controller, @Service, @Repositoryとは内部に@Componetが含まれている
  • スプリングが基本的にはシングルトンでコンテナに登録する

SpringConfigを利用して直接に登録する

  • XMLを通して登録することもできる。しかし最近はよく使われていない。
  • DIの種類
    • フィールドは後に更新できないから良くない
    • Setter DI: ランタイムに依存関係の変更可能
    • コンストラクターDI: Springが始める際に生成される

5. 会員管理例題 ーウェブMVCの開発

  • ホーム画面追加
  • 会員登録
  • 会員紹介

6. SpringDB接続技術

H2データベースの設置

H2は教育用で使われているデータベース。

  • 最初データベースを生成: jdbc:h2:~/test
    • 最初1度後、Linuxのホームフォルダーでtest DBが保持されている
  • 生成から接続方法: jdbc:h2:tcp://localhost/~/testようにする
create table member (
    id   bigint generated by default as identity,
    name varchar(255),
    primary key (id)
);

ピュアなJDBC

  • メモリに保存したデータをDBに保存する。
  • DataSourceクラスを使用するために設定を行う。

データベース接続コード

  • 接続:DataSourceUtilsから返すconnectionについてはトランザクションに対応するため、一つだけ生成する。
private Connection getConnection() {
    return DataSourceUtils.getConnection(dataSource);
}
  • 資源返還:DBとJavaアプリ間にネットワークで接続するので使われていない資源を返還すべき。
private void close(Connection conn, PreparedStatement pstmt, ResultSet rs) {
    try {
        if (rs != null) {
            rs.close();
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    try {
        if (pstmt != null) {
            pstmt.close();
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    try {
        if (conn != null) {
            close(conn);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

private void close(Connection conn) throws SQLException {
    DataSourceUtils.releaseConnection(conn, dataSource);
}

SpringConfigにデータベースオブジェクト切り替え

  • Springは設定のデータベースのコネクション情報によってDataSourceインスタンスを生成しBeanで登録する
    • なので、SpringConfigのコンストラクタに依存性注入(DI)ができる

インターフェースでデータベースを定義してからSpringConfigを修正するだけで、実装クラスを更新できる

  • OOPのOCP原則に該当:拡張には開いているが、修正・変更には閉じている。

Spring総合テスト

  • @SpringBootTest: スプリングコンテイナーを実行する
    • @Autowiredを利用して依存性注入する
  • @Transactional:テストごと独立的に実装するために、DBに入れてからテストした後(commit)それともrollbackする。

JdbcTemplate

  • JdbcTemplateやMybatisのようなライブラリーはJDBC APIの繰り返しコードを消してくれる。

JPA

  • JPAはJDBCの不便性を改善し、簡単なSQL文もコードで作成できるようにする。
  • JPAを通して、SQLとデータ中心設計から離れてオブジェクトに焦点を当てられる。

JPA実装

  • EntityMangerはSpringが設定ファイルから読み込んで注入する。
  • PKに通じて探せることがない場合、SQLを作成が必要する→Data JPAで改善できる
  • サービスクラスに@Transactionalを貼り付ける
    • Springは該当メソッドが実行しているところにトランザクションを初めて終了際にコミットする
    • JPAを通してすべてのデータ変更はトランザクションのうちに実行すべき

Spring Data JPA

  • JPAを基づいて基本的なCRUD機能を提供する。
    • JpaRepositoryインターフェースを相続してCRUDを簡単にまとめる
    • Spring Data JPAがSpringDataJpaMemberRepositoryをBeanで自動的に登録する

7. AOP

AOPが必要な場合

例えば、すべてのメソッドに呼び出される時間を計りたい場合、維持と保守を簡単にするために共通のロジックを分離し、普遍的に提供する。

AOPの適用

  • @Around:AOPを適用するパッケージを指定する
  • joinPoint.proceed():共通のロジックを終了し、次のメソッドに進む

動作仕方

  • AOP適用した後、偽のインスタンスを作る
  • 偽のものが終わったら真のインスタンスが実行する
  • proxyという方法が使われる