Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

81
Spring Bootチャットツールを作りながら Webの仕組みを理解しよう! Java女子部 presents 2016.5.21 #jjug_ccc #ccc_m3

Transcript of Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

Page 1: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

Spring Bootでチャットツールを作りながら

Webの仕組みを理解しよう!

Java女子部presents

2016.5.21

#jjug_ccc #ccc_m3

Page 2: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

本日のメンバー

#jjug_ccc #ccc_m3

Page 3: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

■ちかJava歴7年くらい。金融系のSIer

■ゆう最近Javaを始めたばかりの

初心者。

エンジニア歴は2年ちょい。

講師講師#jjug_ccc #ccc_m3

Page 4: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

■えりこWebアプリケーションSEエンジニア8年生。

■あやラーメン二郎が好きなエンジニア2年生。

チューター#jjug_ccc #ccc_m3

Page 5: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

■とぅんJava暦半年ぐらいのエンジニア4年生。品質管理とかやってます。

■よこなJJUG司会兼チューター。エンジニア4年生。

チューター#jjug_ccc #ccc_m3

Page 6: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

ワークショップの概要説明

#jjug_ccc #ccc_m3

Page 7: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

チャットツールの制作を通じてWebの仕組みを理解する!

今回の目標本日の目標#jjug_ccc #ccc_m3

Page 8: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

・基礎的な概念説明(Webの仕組み、Spring Bootについて)

・ハンズオン導入・WebSocketについて

・ハンズオン

・まとめ

全体の流れ#jjug_ccc #ccc_m3

Page 9: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

Webの仕組みについて

#jjug_ccc #ccc_m3

Page 10: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

情報をやりとりする通信網のこと。

この通信網によって

世界中とやりとり

することができる。

そもそもインターネットとは?#jjug_ccc #ccc_m3

Page 11: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

クライアントが情報を要求すると、

サーバから情報が返ってくる。

クライアント サーバリクエスト

レスポンス

通信方法について#jjug_ccc #ccc_m3

Page 12: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

Spring Bootについて

#jjug_ccc #ccc_m3

Page 13: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

Java SpringJava JavaEERuby RailsPython Django

言語を扱いやすくパッケージングしたもの = フレームワーク

Springって何?#jjug_ccc #ccc_m3

Page 14: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

Spring BootJava SpringJava JavaEERuby RailsPython Django

フレームワーク(コンポーネントの集合)をさらに使いやすくしたフレームワーク

じゃあ、Spring Bootって何?#jjug_ccc #ccc_m3

Page 15: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

・アノテーション

・DIコンテナ

・AOP 

アノテーションでクラス・メソッド・変数に目印をつけてフレームワークに解釈させる⇒ 設定ファイルの代わりになる

class Chat

@RestController

Spring Bootの特徴#jjug_ccc #ccc_m3

class Chat

Page 16: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

アノテーション名 記載場所 説明

@SpringBootApplication

Mainクラス パッケージ内のクラスと設定を自動的に読み込む

@RestController クラス WebAPI用のコントローラー

@Configuration クラス 設定クラスソースコードでSpringの設定を実装できる

@RequestMapping クラスメソッド

URLに紐づけて、アクセスできるように設定する

@Autowired メソッドフィールド

実装クラスを自動的にインジェクションする(DIする)

基本のアノテーション(Spring)#jjug_ccc #ccc_m3

Page 17: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

ハンズオン 1章-文字列を返すWebアプリケーションを

作ってみよう!-

Page 18: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

リポジトリhttps://github.com/java-women/ChatToolForBeginners/

プロジェクト chat-exercise  ハンズオン作業用

 chat-tutorial  完成形

環境構築手順 https://git.io/vro1X

事前準備 1章

Page 19: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

ブラウザ

アマゾンのリクエストページ

これから作るもの 1章

①リクエストを送信

③レスポンスを受信

②リクエストを受け取りごにょごにょ処理する

商品の詳細ページ

Page 20: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

ブラウザ

http://localhost:8080/javajo

Hello World!

これから作るもの 1章

①リクエストを送信

③レスポンスを受信

②リクエストを受け取りごにょごにょ処理する

ここを作るよ

Page 21: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

@SpringBootApplicationpublic class App {

public static void main(String[] args) {SpringApplication.run(App.class,

args);}

}

javajo > App.java 1章

Spring Bootの起動クラスを確認する

Page 22: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

HelloControllerクラスにもアノテーションを 付与します。

@RestControllerpublic class HelloController {   }

1章javajo.controller > HelloController.java 1章

Page 23: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

・helloメソッドを作成します。

・helloメソッドにアノテーションを付与します。

String hello() { return "Hello World!"; }

@RequestMapping(value = "/javajo") String hello() { return "Hello World!"; }

javajo.controller > HelloController.java 1章

Page 24: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

アプリケーションを起動して、

http://localhost:8080/javajo/にアクセスしてみよう!

1章javajo.controller > HelloController.java 1章

EclipseIntelliJApp.javaを

右クリック>runmaven>bootrun

起動方法

Page 25: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

下記画面が表示されれば、成功!

1章Hello World動作確認 1章

Page 26: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

ブラウザ

サーバ

@RestControllerpublic class HelloController

{

@RequestMapping(value = "/javajo") String hello() { return "Hello World!"; }}

http://localhost:8080/javajo

Hello World!

解説 1章

Page 27: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

WebSocketについて

#jjug_ccc #ccc_m3

Page 28: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

WebSocket聞いたことある人?

Page 29: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

サーバ・クライアント間で接続が確立されたら、双方向通信(サーバからもクライアントからもデータの送信)が行える技術仕様

WebSocketとは?#jjug_ccc #ccc_m3

Page 30: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

WebSocket(双方向通信)

Client A#jjug_ccc #ccc_m3

Page 31: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

WebSocket(双方向通信)

Client A#jjug_ccc #ccc_m3

こんにちは

Page 32: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

WebSocket(双方向通信)

Client A#jjug_ccc #ccc_m3

こんにちは

ClientB

Page 33: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

WebSocket(双方向通信)

Client A#jjug_ccc #ccc_m3

こんにちは

ClientB こんばんはこんばんは

こんばんは

Page 34: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

WebSocket(双方向通信)

Client A#jjug_ccc #ccc_m3

こんにちは

ClientB こんばんはこんばんは

こんばんは

※1度接続が確立されればデータがリアルタイムで送受信可能!※同じサーバに接続しているユーザはデータを共有する

Page 35: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

ハンズオン2章-チャットを作ってみよう!-

#jjug_ccc #ccc_m3

Page 36: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

チャットツールの作成内容 2章

①WebSocketへの接続要求

⑥WebSocketコネクション切断

④メッセージ送信

⑤メッセージ受信

②WebSocketコネクション確立

③メッセージ受信時の挙動設定

Page 37: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

チャットツールの作成内容 2章

Controller@MessageMapping("/message")@SendTo(value= "/topic/messages")

MessageBroker

/message

/app/message

ChatForm

@EnableWebSocketMessageBroker

/topic/messages

Page 38: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

<dependencies>・・・・・省略・・・・・

<dependency><groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-websocket</artifactId>

</dependency>・・・・・省略・・・・・

</dependencies>

2章pom.xml の内容を確認する 2章

Page 39: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

<dependencies>・・・・・省略・・・・・

<dependency><groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-websocket</artifactId>

</dependency>・・・・・省略・・・・・

</dependencies>

pom.xml の内容を確認する

pom.xml35行目あたり

WebSocketを利用するのに必要!!

2章

Page 40: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

javajo.form > ChatForm.java 2章

public class ChatForm {

・・・・・省略・・・・・

}

Page 41: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

public class ChatForm {

private String name;private String message;

・・・・・省略・・・・・

}

javajo.form > ChatForm.java 2章

クライアントから受け取った値を格納する

フィールドを作成

Page 42: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

public class ChatForm {・・・・・省略・・・・・

/**public String getName() {

return name;}

・・・・・省略・・・・・

public void setMessage(String message) {this.message = message;

}**/

}

javajo.form > ChatForm.java 2章

フィールドにアクセスするgetter/setterを作成します

Page 43: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

public class ChatForm {・・・・・省略・・・・・

/**public String getName() {

return name;}

・・・・・省略・・・・・

public void setMessage(String message) {this.message = message;

}**/

}

javajo.form > ChatForm.java 2章

すでに実装済みなので、コメントアウトを外す

だけでOK

Page 44: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

public class ChatForm {・・・・・省略・・・・・

public String getName() {return name;

}・・・・・省略・・・・・

public void setMessage(String message) {this.message = message;

}

}

javajo.form > ChatForm.java 2章

すでに実装済みなので、コメントアウトを外す

だけでOK

Page 45: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

チャットツールの作成内容 2章

①WebSocketへの接続要求

⑥WebSocketコネクション切断

④メッセージ送信

⑤メッセージ受信

②WebSocketコネクション確立

③メッセージ受信時の挙動設定

Page 46: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

public class StompConfig {

}

javajo.config > StompConfig.java 2章

クライアントからのメッセージを処理するクラスを作成します

Page 47: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

public class StompConfig extends AbstractWebSocketMessageBrokerConfigurer {

}

javajo.config > StompConfig.java 2章

メッセージを処理する抽象クラスを継承

Page 48: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

@Configuration

public class StompConfig extends AbstractWebSocketMessageBrokerConfigurer {

}

javajo.config > StompConfig.java 2章

設定ファイルを表すアノテーションを付与

Page 49: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

@Configuration@EnableWebSocketMessageBrokepublic class StompConfig extends AbstractWebSocketMessageBrokerConfigurer {

}

javajo.config > StompConfig.java 2章

WebSocketを扱うのに必要なアノテーションを

付与

Page 50: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

public class StompConfig extends AbstractWebSocketMessageBrokerConfigurer {

@Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("endpoint"); }

}

javajo.config > StompConfig.java 2章

エンドポイントの登録メソッドを作成

Page 51: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

チャットツールの作成内容 2章

ChatController@MessageMapping("/message")@SendTo(value= "/topic/messages")

MessageBroker

/message

/app/message@EnableWebSocketMessageBroker

/topic/messagesここを作るよ ChatForm

Page 52: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

public class StompConfig extends AbstractWebSocketMessageBrokerConfigurer {

・・・・・省略(registerStompEndpointsの直後)・・・・・ @Overridepublic void configureMessageBroker(MessageBrokerRegistry registry) { registry.setApplicationDestinationPrefixes("/app"); registry.enableSimpleBroker("/topic"); }

}

javajo.config > StompConfig.java 2章

メッセージブローカーの設定メソッドを作成

Page 53: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

チャットツールの作成内容 2章

①WebSocketへの接続要求

⑥WebSocketコネクション切断

④メッセージ送信

⑤メッセージ受信

②WebSocketコネクション確立

③メッセージ受信時の挙動設定ここを作るよ

Page 54: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

チャットツールの作成内容 2章

ChatController@MessageMapping("/message")@SendTo(value= "/topic/messages")

MessageBroker

/message

/app/message

ChatForm

@EnableWebSocketMessageBroker

/topic/messages

ここを作るよ

Page 55: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

public class ChatController {

ChatForm greet(ChatForm chatForm) { return chatForm; }}

javajo.controller > ChatController.java 2章

チャットのコントローラークラスを作成します

Page 56: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

@RestControllerpublic class ChatController {

ChatForm greet(ChatForm chatForm) { return chatForm; }}

javajo.controller > ChatController.java 2章

コントローラーのアノテーションを付与

Page 57: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

@RestControllerpublic class ChatController {

@MessageMapping(value = "/message" )

ChatForm greet(ChatForm chatForm) { return chatForm; }}

javajo.controller > ChatController.java 2章

メッセージを受け付けるMessageMappingを付与

Page 58: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

@RestControllerpublic class ChatController {

@MessageMapping(value = "/message" ) @SendTo(value = "/topic/messages") ChatForm greet(ChatForm chatForm) { return chatForm; }}

javajo.controller > ChatController.java 2章

処理結果を送信する宛先

SendToを付与

Page 59: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

チャットツールの作成内容 2章

①WebSocketへの接続要求

⑥WebSocketコネクション切断

④メッセージ送信

⑤メッセージ受信

②WebSocketコネクション確立

③メッセージ受信時の挙動設定

ここだよ

Page 60: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

チャットツールの作成内容 2章

ここだよ

Page 61: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

クライアント側(Stomp.js) 2章

resources/static/js/Stomp.js

提供されているライブラリを使用詳しくは、http://jmesnil.net/stomp-websocket/doc/

クライアント側のメッセージ制御はJavaScriptライブラリを利用する

Page 62: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

クライアント側(javajo.js) 2章

ChatStomp.prototype.connect = function () { var socket = new WebSocket('ws://' + location.host + '/endpoint'); ・・・・・省略・・・・・

}; 23行目

Page 63: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

public class StompConfig extends AbstractWebSocketMessageBrokerConfigurer {

@Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("endpoint"); }

}

javajo.config > StompConfig.java 2章

エンドポイントの登録メソッドを作成

Page 64: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

チャットツールの作成内容 2章

①WebSocketへの接続要求

⑥WebSocketコネクション切断

④メッセージ送信

⑤メッセージ受信

②WebSocketコネクション確立

③メッセージ受信時の挙動設定

ここだよ

Page 65: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

チャットツールの作成内容 2章

ここだよ

Page 66: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

クライアント側(javajo.js) 2章

ChatStomp.prototype.onConnected = function (frame) { console.log('Connected: ' + frame); this.stompClient.subscribe('/topic/messages',this.onSubscribeGreeting.bind(this)); this.setConnected(true);};

34行目

Page 67: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

public class StompConfig extends AbstractWebSocketMessageBrokerConfigurer {

・・・・・省略(registerStompEndpointsの直後)・・・・・ @Overridepublic void configureMessageBroker(MessageBrokerRegistry registry) { registry.setApplicationDestinationPrefixes("/app"); registry.enableSimpleBroker("/topic"); }

}

javajo.config > StompConfig.java 2章

メッセージブローカーの設定メソッドを作成

Page 68: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

チャットツールの作成内容 2章

①WebSocketへの接続要求

⑥WebSocketコネクション切断

④メッセージ送信

⑤メッセージ受信

②WebSocketコネクション確立

③メッセージ受信時の挙動設定ここだよ

Page 69: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

チャットツールの作成内容 2章

ここだよ

Page 70: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

クライアント側(javajo.js) 2章

ChatStomp.prototype.sendName = function () { ・・・・・省略・・・・・

this.stompClient.send("/app/message", {},   JSON.stringify(json_message)); };

73行目

Page 71: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

public class StompConfig extends AbstractWebSocketMessageBrokerConfigurer {

・・・・・省略(registerStompEndpointsの直後)・・・・・ @Overridepublic void configureMessageBroker(MessageBrokerRegistry registry) { registry.setApplicationDestinationPrefixes("/app"); registry.enableSimpleBroker("/topic"); }

}

javajo.config > StompConfig.java 2章

メッセージブローカーの設定メソッドを作成

Page 72: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

@RestControllerpublic class ChatController {

@MessageMapping(value = "/message" )

ChatForm greet(ChatForm chatForm) { return chatForm; }}

javajo.controller > ChatController.java 2章

メッセージを受け付けるMessageMappingを付与

Page 73: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

チャットツールの作成内容 2章

ChatController@MessageMapping("/message")@SendTo(value= "/topic/messages")

MessageBroker

/message

/app/message@EnableWebSocketMessageBroker

/topic/messages

ChatForm

Page 74: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

チャットツールの作成内容 2章

①WebSocketへの接続要求

⑥WebSocketコネクション切断

④メッセージ送信

⑤メッセージ受信

②WebSocketコネクション確立

③メッセージ受信時の挙動設定

ここだよ

Page 75: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

チャットツールの作成内容 2章

ここだよ

Page 76: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

クライアント側(javajo.js) 2章

ChatStomp.prototype.disconnect = function () { if (this.stompClient) { this.stompClient.disconnect(); this.stompClient = null; } this.setConnected(false);};

88行〜94行目

Page 77: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

ハンズオンはここまで!実際に動かしてみよう!

#jjug_ccc #ccc_m3

Page 78: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

1. chat-exerciseのプロジェクトを実行!

2. http://localhost:8080/chat にアクセス!

ローカルで動かしてみようローカルで動かしてみよう

3. ユーザ名を入力してConnectボタンクリック! 

4.メッセージを入力してSendボタンをクリック!

#jjug_ccc #ccc_m3

Page 79: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

まとめ

#jjug_ccc #ccc_m3

Page 80: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

・「Hello World」を出力するアプリケーションをSpring Bootで作りました

・チャットを作りながらWebSocketについて学びました

まとめ#jjug_ccc #ccc_m3

Page 81: Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!

お疲れ様でしたありがとうございました

【講師】ゆう・ちか【チューター】えりこ・あや・とぅん・よこな

#jjug_ccc #ccc_m3