web developer๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป

[Spring] WebSocket sockJS Q&A ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ๊ตฌํ˜„ํ•˜๊ธฐ (1) ๋ณธ๋ฌธ

Spring

[Spring] WebSocket sockJS Q&A ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ๊ตฌํ˜„ํ•˜๊ธฐ (1)

natrue 2021. 11. 11. 17:11
728x90

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

 

GitHub - sockjs/sockjs-client: WebSocket emulation - Javascript client

WebSocket emulation - Javascript client. Contribute to sockjs/sockjs-client development by creating an account on GitHub.

github.com

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 : ์„œ๋ฒ„์— ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†ก

 

 

JSP์—์„œ ${pageContext.request} ์ •๋ณด ์–ป๊ธฐ

javax.servlet.http.HttpServletRequest ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ •๋ณด๋ฅผ ํ™œ์šฉํ•ด์„œ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ${pageContext.request.scheme} http ${pageContext.request.serverName} localhost ${pageContext.request...

truecode-95.tistory.com

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) ์•„๋ž˜ ๋งํฌ ํด๋ฆญ 

 

[Spring] Q&A ๋“ฑ๋ก์‹œ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ๊ตฌํ˜„ํ•˜๊ธฐ (2) [WebSocket]

[ ๊ฐœ๋ฐœ ๋ถ€๋ถ„ ] package egovframework.pcr.main.common.controller; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.apache.commons.lang3.StringUtils; import org.apache.ib..

truecode-95.tistory.com

 

 

 

 

 

 

 

 

 

์ฐธ๊ณ  : https://simsimjae.tistory.com/25

 

[์Šคํ”„๋ง/spring] ์›น ์†Œ์ผ“์„ ํ™œ์šฉํ•œ ์ชฝ์ง€ ์•Œ๋žŒ ๊ธฐ๋Šฅ(ํŽ˜์ด์ง€ ์ด๋™์‹œ)

์ด ์‚ฌ์ง„ ์ฒ˜๋Ÿผ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ• ๋•Œ๋งˆ๋‹ค ํ˜„์žฌ ๋‚˜์—๊ฒŒ ๋„์ฐฉํ•œ ์ชฝ์ง€์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…, ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ๊ธฐ๋Šฅ๋“ฑ์— ์‚ฌ์šฉ๋˜๋Š” ์›น ์†Œ์ผ“์„ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

simsimjae.tistory.com