WebSocket : ์น์์ผ์์๋ ์๋ฒ์ ๋ธ๋ผ์ฐ์ ์ฌ์ด์ ์๋ฐฉํฅ ์ํต์ด ๊ฐ๋ฅ
์น ์์ผ์ HTML5 ์ดํ์ ๋์๊ธฐ ๋๋ฌธ์ Socket.io์ SockJS ์ด์ฉํด์ HTML5 ์ด์ ๊ธฐ์ ๋ก ๊ตฌํ๋ ์๋น์ค์์๋ ์น ์์ผ์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค. ํด๋ผ์ด์ธํธ์ชฝ์SockJS client๋ฅผ ํตํด ์๋ฒ์ ํต์ ํ๋ค.
๊ทธ๋์ javaScript์์ sockJS ์ด์ฉํ์ฌ ์ค์๊ฐ ์๋ฆผ์ ๊ตฌํํด๋ณด๋ ค๊ณ ํ๋ค.
[ ์ธํ ๋ถ๋ถ ]
pom.xml (= Maven ์ค์ )
https://mvnrepository.com/artifact/org.springframework/spring-websocket
<!-- https://mvnrepository.com/artifact/org.springframework/spring-websocket -->
<!-- ์น์์ผ ์ถ๊ฐ -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
<version>${spring.maven.artifact.version}</version>
</dependency>
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.1</version>
</dependency>
<!-- ์น์์ผ ๋ -->
web.xml ๋๋ EgovWebApplicationInitializer.java
1. <async-supported> true </async-supported> ์ถ๊ฐ
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/egovframework/springmvc/egov-com-*.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
2. egovframework์ผ๊ฒฝ์ฐ EgovWebApplicationInitializer.java ํ์ผ์ .setAsyncSupported(true) ์ถ๊ฐ
์ผ๋ฐ์ ์ผ๋ก ์คํ๋ง ๊ตฌ๋์์๋ web.xml์์ ํ์ผ๋ค์ ์ฝ์ด์ค๋๋ฐ ๊ณตํต์ปดํฌ๋ํธ๋ EgovWebApplicationInitializer.java์์ ์์
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(xmlWebApplicationContext));
dispatcher.addMapping("*.do");
dispatcher.setLoadOnStartup(1);
dispatcher.setAsyncSupported(true);
egov-com-sevlet.xml (=ํธ๋ค๋ฌ ๋ฑ๋ก)
* WebSocket Handshake : ์น์์ผ ํธ๋ค๋ฌ ํด๋์ค(echoHandler)๊ฐ ํธ์ถ๋๊ธฐ ์ ์ HttpSession์ ์ ์ํ์ฌ ์ด์ฉ์ ์์ด๋๋ฅผ ์ถ์ถํ๋ ๊ธฐ๋ฅ ๋ฑ์ ์ธํฐ์ ํฐ๊ฐ ์ํํ๋๋ก ์ค์
<!-- ์น ์์ผํธ๋ค๋ฌ -->
<websocket:handlers>
<websocket:mapping handler="WebSocketHandler" path="/websocket.do"/>
<websocket:handshake-interceptors>
<bean class="org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor"/>
</websocket:handshake-interceptors>
<!-- <websocket:sockjs /> -->
</websocket:handlers>
<bean id="WebSocketHandler" class="egovframework.pcr.main.common.controller.WebSocketHandler" />
WebSocketHandler.java ์์ฑ (= TextWebSocketHandler์ ์์๋ฐ์ ํธ๋ค๋ฌ ํด๋์ค๋ฅผ ์ ์)
@Repository
public class WebSocketHandler extends TextWebSocketHandler {
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception{
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception{
}
}
afterConnectionEstablished(), afterConnectionClosed() : ๊ฐ๊ฐ ์น์์ผ ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ๋๊ฑฐ๋ ์ฐ๊ฒฐ์ด ๋๊ฒผ์ ๋ ํธ์ถ
HandleTextMessage() : ์น์์ผ ํด๋ผ์ด์ธํธ๊ฐ ํ ์คํธ ๋ฉ์์ง๋ฅผ ์ ์กํ ๋ ํธ์ถ
sockjs ์ถ๊ฐ (1,2๋ฒ์ค ์ ํ)
1. js ์ง์ ๋ค์ด๋ก๋ ํ ์ถ๊ฐ
https://github.com/sockjs/sockjs-client
2. cdn์ผ๋ก ์ถ๊ฐ
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/sockjs-client/1.1.5/sockjs.min.js"></script>
jsp view๋จ ์ธํ
ws.onopen : ์๋ฒ์ ์ ์ํ ํ ์ด๋ฒคํธ ์ ์
ws.onmessage : ์๋ฒ์์ Session.send๋ฅผ ์ด์ฉํด์ ๋ฉ์์ง ์ ์กํ ๋ ์์ ์ด๋ฒคํธ ์ ์
ws.onclose : ์๋ฒ์์ ์ ์ ์ข ๋ฃํ ํ ์ด๋ฒคํธ ์ ์
ws.send : ์๋ฒ์ ๋ฉ์์ง๋ฅผ ์ ์ก
ws://localhost:8084${pageContext.request.contextPath}/websocket.do
๊ฐ์ ์๋ฏธ
ws://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}/websocket.do
<script>
var socket = null;
connect();
function connect() {
var ws = new WebSocket('ws://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}/websocket.do');
socket = ws;
ws.onopen = function() {
console.log('Info: connection opened.');
};
ws.onmessage = function(event) {
console.log('Info: connection onmessage.');
};
ws.onclose = function(event) {
console.log('Info: connection closed');
};
ws.onerror = function(err) {
console.log('Error:', err);
};
}
$(document).ready(function() {
socket.send();
});
socket.onclose();
});
</script>
[Spring] WebSocket sockJS Q&A ์ค์๊ฐ ์๋ฆผ ๊ตฌํํ๊ธฐ (2) ์๋ ๋งํฌ ํด๋ฆญ
์ฐธ๊ณ : https://simsimjae.tistory.com/25