SlideShare a Scribd company logo
1 of 25
Download to read offline
基本編
アジェンダ
 はじめに
 階層構造
 Repositoryの実装
 Serviceの実装
 Controllerの実装
 まとめ
はじめに
 Spring Bootを使って、
実際に簡単なWebページを作成する。
階層構造
 下記の階層構造でシステムを構築する
Controller
ブラウザ
Service
Repository
Database
TemplateModel
Entity
Entity
Entity
Entity
Model1.入力値を受け取る
2.ビジネスロジックを書く
3.データの取得・更新をする 4.データを返す
5.データを返す
6.HTMLに変換
実際に下の階層から
実装してみる
Repositoryの実装
 Serviceから処理要求を受け取り、
Databaseに対してデータの取得・更新を行う
Service
Repository
Database
Entity Entity
3.データの取得・更新をする 4.データを返す
Repositoryの実装
 商品のデータ(productテーブル)を制御するRepositoryと
データの入れ物のEntityを作成
package sample.springbootweb.repository;
/** productテーブルのRepository */
public interface ProductRepository {
}
package sample.springbootweb.model;
/** productテーブルのEntity */
public class Product {
}
「repository」パッケージに
productテーブルの
Repositoryを作成
「model」パッケージに
productテーブルの
Entityを作成
Repositoryの実装
 ただのクラスをEntityに仕立てる
/** productテーブルのEntity */
@Entity
@Table(name="product")
public class Product {
/** 商品コード */
@Id
public Integer productCode;
/** 商品名 */
public String productName;
/** 価格 */
public Integer price;
}
クラス宣言に@Entityを付けて、
Entityであることを明記
「product」テーブルの
Entityであることを明記
それぞれのカラムに対応した
フィールドを宣言
フィールド宣言に「@Id」を付けて、
このフィールドがPKであることを明記
※便宜上、フィールドをpublic宣言している。
本来、フィールドはprivateであるべき。
Repositoryの実装
 Productテーブルとサンプルデータ
-- DDL
create table product (
product_code int(5),
product_name varchar(50),
price int(10),
primary key ( product_code )
);
--DML
insert into product values( 1, 'ガム', 100 );
insert into product values( 2, 'アメ', 120 );
insert into product values( 3, 'チョコ', 150 );
Repositoryの実装
 ただのクラスをRepositoryに仕立てる
/** productテーブルのRepository */
public interface ProductRepository
extends JpaRepository <Product, Integer> {
}
JpaRepositoryを拡張した
インターフェースであることを明記 「product」テーブルの
Repositoryであることを明記
PKはInteger(数値フィールド)
であることを明記
JpaRepositoryには基本的なデータベース操作は宣言されていて、
カスタマイズの必要がなければ特に中身のないインターフェース宣言で良い(そんなケースは稀な気が・・・)
Serviceの実装
 Controllerから処理要求を受け取り、
Repositoryに対してデータの取得・更新を行う
Controller
Service
Repository
Entity
Entity
Entity
Entity
2.ビジネスロジックを書く 5.データを返す
Serviceの実装
 商品関連のビジネスロジックを実行するServiceを作成
package sample.springbootweb.service.product;
/** 商品関連のビジネスロジックを実行するService */
public class ProductService {
}
「service」パッケージに
商品関連のパッケージ
「product」を作成
Serviceの実装
 ただのクラスをServiceに仕立てる
/** 商品関連のビジネスロジックを実行するService */
@Service
public class ProductService {
}
クラス宣言に@Serviceを付けて、
Serviceであることを明記
Serviceの実装
 Repositoryを呼び出す
/** 商品関連のビジネスロジックを実行するService */
@Service
public class ProductService {
@Autowired
ProductRepository productRepository;
/** 商品一覧を返す */
public List<Product> getProductList() {
List<Product> list = productRepository.findAll();
return list;
}
}
使用するRepositoryを宣言
Repositoryのメソッドを
呼び出してデータを取得
取得したデータを返却
Controllerの実装
 ブラウザからの入力値を受け取り、
Serviceへ処理要求を出し、
結果をテンプレートに渡してHTMLをレンダリングさせる
Controller
ブラウザ
Service
TemplateModel
Entity Entity
Model1.入力値を受け取る
6.HTMLに変換
Controllerの実装
 商品関連のページを制御するControllerを作成
package sample.springbootweb.app.product;
/** 商品関連のページを制御するController */
public class ProductController {
}
「app」パッケージに
商品関連のパッケージ
「product」を作成
Controllerの実装
 ただのクラスをControllerに仕立てる
/** 商品関連のページを制御するController */
@Controller
@RequestMapping("product")
public class ProductController {
}
クラス宣言に@Controllerを
付けて、Controllerであることを明記
URL「product」に対する
Controllerとして関連付ける
http://someserver/someapp/product/
Controllerの実装
 リクエストとメソッドを関連付ける
/** 商品関連のページを制御するController */
@Controller
@RequestMapping("product")
public class ProductController {
/** 商品一覧を表示する */
@RequestMapping(value = "/", method=RequestMethod.GET)
public String list() {
return "product/list“;
}
}
value値でURL「product」の
ルート(/) Controllerとして関連付ける
method値でHTTPメソッド「GET」に
関連付ける
テンプレート「product/list.html」を
表示する
Controllerの実装
 Serviceを呼び出す
/** 商品関連のページを制御するController */
@Controller
@RequestMapping("product")
public class ProductController {
@Autowired
private ProductService productService;
/** 商品一覧を表示する */
@RequestMapping(value = "/", method=RequestMethod.GET)
public String list() {
return "product/list";
}
}
使用するServiceを宣言
Controllerの実装
 Serviceを呼び出す
/** 商品関連のページを制御するController */
@Controller
@RequestMapping("product")
public class ProductController {
@Autowired
private ProductService productService;
/** 商品一覧を表示する */
@RequestMapping(value = "/", method=RequestMethod.GET)
public String list(Model model) {
List<Product> list = productService.getProductList();
model.addAttribute("productList", list);
return "product/list";
}
}
引数にModelを受け取る
(ControllerとTemplateの架け橋)
Serviceを呼び出す
Serviceの実行結果を
Modelに詰める
Controllerの実装
 TemplateのHTMLを記述する
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>商品一覧</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
商品一覧
</body>
</html>
テンプレートエンジン「Thymeleaf」で
使用するネームスペースの宣言
src¥main¥resources¥templates¥product¥list.html
Controllerの実装
 テンプレートを作成する
<body>
商品一覧
<table border="1">
<tr>
<th style="background-color:#CCCCCC">Code</th>
<th style="background-color:#CCCCCC">商品名</th>
<th style="background-color:#CCCCCC">金額</th>
</tr>
<tr>
<td>1</td>
<td>ダミー商品</td>
<td>50</td>
</tr>
</table>
</body>
素のHTMLで見た目の確認をする
HTMLをブラウザで開いて見た目の確認をする (デザイナーさんの仕事)
Controllerの実装
 テンプレートを作成する
HTMLをブラウザで開いてみる
Controllerの実装
 動的部分を作成する
<body>
商品一覧
<table border="1">
<tr>
<th style="background-color:#CCCCCC">Code</th>
<th style="background-color:#CCCCCC">商品名</th>
<th style="background-color:#CCCCCC">金額</th>
</tr>
<tr th:each="product: ${productList}">
<td th:text="${product.productCode}">1</td>
<td th:text="${product.productName}">ダミー商品</td>
<td th:text="${product.price}">50</td>
</tr>
</table>
</body>
Modelに詰めたproductListを取り出し、
for-eachでループさせる
Thymeleafで動的部分を実装する (エンジニアさんの仕事)
必要なEntityの要素を出力する
Controllerの実装
 実行する
Webサーバにアクセスする
http://localhost:8080/product/
まとめ
 各階層に応じた役割を意識し実装する
Repository → データベース操作
Service → ビジネスロジックの実装
Controller → 画面制御
 テンプレートはエンジニアは触らずデザイナーに任せる
 入力値チェック、セッション管理、トランザクション制御
・・・などなど、まだ触れていないことは色々

More Related Content

What's hot

Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Amazon Cognito使って認証したい?それならSpring Security使いましょう!Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Ryosuke Uchitate
 

What's hot (20)

Spring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のことSpring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のこと
 
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Amazon Cognito使って認証したい?それならSpring Security使いましょう!Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
 
Hive on Tezのベストプラクティス
Hive on TezのベストプラクティスHive on Tezのベストプラクティス
Hive on Tezのベストプラクティス
 
Fess/Elasticsearchを使った業務で使える?全文検索への道
Fess/Elasticsearchを使った業務で使える?全文検索への道Fess/Elasticsearchを使った業務で使える?全文検索への道
Fess/Elasticsearchを使った業務で使える?全文検索への道
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編
 
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetupこれで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
 
GitLab から GitLab に移行したときの思い出
GitLab から GitLab に移行したときの思い出GitLab から GitLab に移行したときの思い出
GitLab から GitLab に移行したときの思い出
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate
 
入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き
 
これから始めるSpringのwebアプリケーション
これから始めるSpringのwebアプリケーションこれから始めるSpringのwebアプリケーション
これから始めるSpringのwebアプリケーション
 
ビッグデータ処理データベースの全体像と使い分け
ビッグデータ処理データベースの全体像と使い分けビッグデータ処理データベースの全体像と使い分け
ビッグデータ処理データベースの全体像と使い分け
 
怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション
 
マイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦いマイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦い
 
Machine learning CI/CD with OSS
Machine learning CI/CD with OSSMachine learning CI/CD with OSS
Machine learning CI/CD with OSS
 
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajpAt least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
 

Similar to Spring bootでweb 基本編

Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナー
Ayumu Kawaguchi
 
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips Prism 4.5 & Kona project 等のご紹介
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips   Prism 4.5 & Kona project 等のご紹介XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips   Prism 4.5 & Kona project 等のご紹介
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips Prism 4.5 & Kona project 等のご紹介
Shotaro Suzuki
 
20091030cakephphandson 01
20091030cakephphandson 0120091030cakephphandson 01
20091030cakephphandson 01
Yusuke Ando
 
Azure サポート エンジニア直伝 ~ PowerShell 実践活用術 ~
Azure サポート エンジニア直伝 ~ PowerShell 実践活用術 ~Azure サポート エンジニア直伝 ~ PowerShell 実践活用術 ~
Azure サポート エンジニア直伝 ~ PowerShell 実践活用術 ~
ShuheiUda
 
ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説
Akira Inoue
 
Windows azuremobileservice入門
Windows azuremobileservice入門Windows azuremobileservice入門
Windows azuremobileservice入門
Makoto Nishimura
 
2011年2月9日第130回FxUG勉強会@東京第一打者空振り三振
2011年2月9日第130回FxUG勉強会@東京第一打者空振り三振2011年2月9日第130回FxUG勉強会@東京第一打者空振り三振
2011年2月9日第130回FxUG勉強会@東京第一打者空振り三振
Sadao Tokuyama
 

Similar to Spring bootでweb 基本編 (20)

20081003
2008100320081003
20081003
 
SpringBootによるDB更新
SpringBootによるDB更新SpringBootによるDB更新
SpringBootによるDB更新
 
20080524
2008052420080524
20080524
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナー
 
Entity Framework 6.1.3 + Windows フォーム サンプル アプリケーション構築 手順書
Entity Framework 6.1.3 + Windows フォームサンプル アプリケーション構築手順書Entity Framework 6.1.3 + Windows フォームサンプル アプリケーション構築手順書
Entity Framework 6.1.3 + Windows フォーム サンプル アプリケーション構築 手順書
 
G0042 h
G0042 hG0042 h
G0042 h
 
PowerShellを使用したWindows Serverの管理
PowerShellを使用したWindows Serverの管理PowerShellを使用したWindows Serverの管理
PowerShellを使用したWindows Serverの管理
 
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips Prism 4.5 & Kona project 等のご紹介
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips   Prism 4.5 & Kona project 等のご紹介XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips   Prism 4.5 & Kona project 等のご紹介
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips Prism 4.5 & Kona project 等のご紹介
 
Entity Framework 5.0 deep dive
Entity Framework 5.0 deep diveEntity Framework 5.0 deep dive
Entity Framework 5.0 deep dive
 
20091030cakephphandson 01
20091030cakephphandson 0120091030cakephphandson 01
20091030cakephphandson 01
 
Azure サポート エンジニア直伝 ~ PowerShell 実践活用術 ~
Azure サポート エンジニア直伝 ~ PowerShell 実践活用術 ~Azure サポート エンジニア直伝 ~ PowerShell 実践活用術 ~
Azure サポート エンジニア直伝 ~ PowerShell 実践活用術 ~
 
Mvc conf session_4_ono
Mvc conf session_4_onoMvc conf session_4_ono
Mvc conf session_4_ono
 
20110607
2011060720110607
20110607
 
Data Factory V2 新機能徹底活用入門
Data Factory V2 新機能徹底活用入門Data Factory V2 新機能徹底活用入門
Data Factory V2 新機能徹底活用入門
 
sbc_rc_200_RealtimeCompute_handson_ver1.0
sbc_rc_200_RealtimeCompute_handson_ver1.0 sbc_rc_200_RealtimeCompute_handson_ver1.0
sbc_rc_200_RealtimeCompute_handson_ver1.0
 
構築手順 Ssis イベントログ取込み 第2版
構築手順 Ssis イベントログ取込み 第2版構築手順 Ssis イベントログ取込み 第2版
構築手順 Ssis イベントログ取込み 第2版
 
ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説
 
Windows azuremobileservice入門
Windows azuremobileservice入門Windows azuremobileservice入門
Windows azuremobileservice入門
 
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
 
2011年2月9日第130回FxUG勉強会@東京第一打者空振り三振
2011年2月9日第130回FxUG勉強会@東京第一打者空振り三振2011年2月9日第130回FxUG勉強会@東京第一打者空振り三振
2011年2月9日第130回FxUG勉強会@東京第一打者空振り三振
 

More from なべ

More from なべ (7)

Javaで学ぶネットワークプログラミングの基礎
Javaで学ぶネットワークプログラミングの基礎Javaで学ぶネットワークプログラミングの基礎
Javaで学ぶネットワークプログラミングの基礎
 
Reladomoを使ったトランザクション履歴管理をプロダクトに適用した際のメリット/デメリット/課題など
Reladomoを使ったトランザクション履歴管理をプロダクトに適用した際のメリット/デメリット/課題などReladomoを使ったトランザクション履歴管理をプロダクトに適用した際のメリット/デメリット/課題など
Reladomoを使ったトランザクション履歴管理をプロダクトに適用した際のメリット/デメリット/課題など
 
普通のJavaエンジニアが、なぜ技術書を出版するに至ったか?
普通のJavaエンジニアが、なぜ技術書を出版するに至ったか?普通のJavaエンジニアが、なぜ技術書を出版するに至ったか?
普通のJavaエンジニアが、なぜ技術書を出版するに至ったか?
 
Spring bootでweb バリデート編
Spring bootでweb バリデート編Spring bootでweb バリデート編
Spring bootでweb バリデート編
 
Spring bootでweb ユニットテスト編
Spring bootでweb ユニットテスト編Spring bootでweb ユニットテスト編
Spring bootでweb ユニットテスト編
 
Lombokのススメ
LombokのススメLombokのススメ
Lombokのススメ
 
はじめてのSpring Boot
はじめてのSpring BootはじめてのSpring Boot
はじめてのSpring Boot
 

Spring bootでweb 基本編