-
Notifications
You must be signed in to change notification settings - Fork 0
Springの入門
Thinking Jay edited this page May 26, 2024
·
3 revisions
- ライブラリー
- ビューの環境設定
- ビルドと実行
./gradlew build
cd build/libs
java -jar hello-spring-0.0.1-SNAPSHOT.jar
- 実行確認
ウェブの開発の仕方が一通り、三つで分かれる
- 静的なものを送る
- MVCパターンに通じてサーバーで動的ページを送る
- API
- Reactようなクライアントサイドレンダリングやモバイルアプリなどに使用する
最初に、TomcatからSpringはコントローラーで探す。なければ、スタティックのファイルを探す。
- 昔にはViewでコントローラーやデータベースの役割も含まれていた。
- 例えば、PHPである。
- レイヤーを分離すると保守に有利になる
- Viewは見えることだけ、コントローラー、モデルはビジネスのロジックを担当する
@ResponseBodyタグを貼り付ければビューが呼ばれない。HTMLボディで返すことができる。
- ViewResolverの代わりにHttpMessageConverterが動く
- 基本の文字の処理は
StringHttpMessageConverter
- 基本のオブジェクト処理は
MappingJackson2HttpMessageConverter
- オブジェクトを返したらJSONに変換されて伝わる
- JSONにシリアライズするには通常、JacksonとGson(グーグル制作)が使用される
- クライアントのHTTP Acceptヘッダーとサーバーのコントローラーの戻り値タイプが組み合わさって、コンバーターが選ばれる
- 会員ドメインとリポジトリ作り
- 会員リポジトリテストケースの作成
- @AfterEach:各テストが独立的に実行するために個別テスト終了の際実行するコードを実装できる関数。テストはなるべく独立的に実行する方がいい。
- 会員サービステストケースの作成
- 会員サービスクラスにリポジトリをDIで修正
- @BeforeEachを利用して各テストケースごと、独立性のために改めてサービスとリポジトリを生成する
- Springは@Componetが張り付いてるクラス全部を集めてSpringコンテナに登録する。
- @Controller, @Service, @Repositoryとは内部に@Componetが含まれている
- スプリングが基本的にはシングルトンでコンテナに登録する
- XMLを通して登録することもできる。しかし最近はよく使われていない。
- DIの種類
- フィールドは後に更新できないから良くない
- Setter DI: ランタイムに依存関係の変更可能
- コンストラクターDI: Springが始める際に生成される
- ホーム画面追加
- 会員登録
- 会員紹介
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)
);
- メモリに保存したデータを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);
}
- Springは設定のデータベースのコネクション情報によってDataSourceインスタンスを生成しBeanで登録する
- なので、SpringConfigのコンストラクタに依存性注入(DI)ができる
- OOPのOCP原則に該当:拡張には開いているが、修正・変更には閉じている。
- @SpringBootTest: スプリングコンテイナーを実行する
- @Autowiredを利用して依存性注入する
- @Transactional:テストごと独立的に実装するために、DBに入れてからテストした後(commit)それともrollbackする。
- JdbcTemplateやMybatisのようなライブラリーはJDBC APIの繰り返しコードを消してくれる。
- JPAはJDBCの不便性を改善し、簡単なSQL文もコードで作成できるようにする。
- JPAを通して、SQLとデータ中心設計から離れてオブジェクトに焦点を当てられる。
- EntityMangerはSpringが設定ファイルから読み込んで注入する。
- PKに通じて探せることがない場合、SQLを作成が必要する→Data JPAで改善できる
- サービスクラスに@Transactionalを貼り付ける
- Springは該当メソッドが実行しているところにトランザクションを初めて終了際にコミットする
- JPAを通してすべてのデータ変更はトランザクションのうちに実行すべき
- JPAを基づいて基本的なCRUD機能を提供する。
- JpaRepositoryインターフェースを相続してCRUDを簡単にまとめる
- Spring Data JPAがSpringDataJpaMemberRepositoryをBeanで自動的に登録する
例えば、すべてのメソッドに呼び出される時間を計りたい場合、維持と保守を簡単にするために共通のロジックを分離し、普遍的に提供する。
- @Around:AOPを適用するパッケージを指定する
- joinPoint.proceed():共通のロジックを終了し、次のメソッドに進む
- AOP適用した後、偽のインスタンスを作る
- 偽のものが終わったら真のインスタンスが実行する
- proxyという方法が使われる