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

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

Spring

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

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

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

WebSocket : ์›น์†Œ์ผ“์—์„œ๋Š” ์„œ๋ฒ„์™€ ๋ธŒ๋ผ์šฐ์ € ์‚ฌ์ด์— ์–‘๋ฐฉํ–ฅ ์†Œํ†ต์ด ๊ฐ€๋Šฅ ์›น ์†Œ์ผ“์€ HTML5 ์ดํ›„์— ๋‚˜์™”๊ธฐ ๋•Œ๋ฌธ์— Socket.io์™€ SockJS ์ด์šฉํ•ด์„œ HTML5 ์ด์ „ ๊ธฐ์ˆ ๋กœ ๊ตฌํ˜„๋œ ์„œ๋น„์Šค์—์„œ๋„ ์›น ์†Œ์ผ“์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜

truecode-95.tistory.com

[ ๊ฐœ๋ฐœ ๋ถ€๋ถ„ ]

WebSocketHandler.java

package egovframework...;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.session.SqlSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

import egovframework.pcr.main.web.controller.AdminController;

@Repository
public class WebSocketHandler extends TextWebSocketHandler {

   @Autowired
   SqlSession sqlsession;
   private static final Logger logger = LoggerFactory.getLogger(AdminController.class);

   private Map<String, WebSocketSession> users = new ConcurrentHashMap<>();

   @Override
   public void afterConnectionEstablished(WebSocketSession session) throws Exception{
      logger.debug(session.getId() + " ์—ฐ๊ฒฐ ๋จ");
      users.put(session.getId(), session);
   }
   
   @Override
   protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
      String msg = message.getPayload();
  	  // js์—์„œ ๋ณด๋‚ธ ์„ธ์…˜ ์•„์ด๋”” ๊ฐ’ 
      if(StringUtils.isNotEmpty(msg)) {
         String sendId = msg;
         // ํ˜„์žฌ session์— ๋‹ด๊ฒจ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž๋ฅผ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•จ.
         for (WebSocketSession responseIdSession : users.values()) {
            if (responseIdSession != null) {
               TextMessage tmpMsg = new TextMessage(sendId);
               responseIdSession.sendMessage(tmpMsg);
            }
         }
      }
   }
   
   @Override
   public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception{
      logger.debug(session.getId() + " ์—ฐ๊ฒฐ ์ข…๋ฃŒ๋จ");
      users.remove(session.getId());
   }
}

 

js

<script>
   var socket = null;
   connect();

   function connect() {
      
      // egov-com-sevlet.xml์—์„œ mapping path์— ๊ฑธ๋ ค ์›น์†Œ์ผ“ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌ
      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) {
         
         var gUserId = $("#userSessionId").val();
         var sm = event.data;
         
         // ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์—๊ฒ ์•Œ๋ฆผ์ด ๊ฐ€์ง€์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ.
         if(sm != gUserId){
            var websocketQna =  document.getElementById("websocketQna");
            websocketQna.style.display = "block"; 
            
            // setTimeout์„ ์ฃผ์–ด 3์ดˆ๋งŒ ํ™”๋ฉด์— ์ถœ๋ ฅ 
            setTimeout(function(){ 
               websocketQna.style.display = "none"; 
            }, 3000); //3000 : 3์ดˆ 
         }
      };
      // ์—ฐ๊ฒฐ ์ข…๋ฃŒ์‹œ 
      ws.onclose = function(event) {
         console.log('Info: connection closed');
      };
      // ์—๋Ÿฌ ๋ฐœ์ƒ์‹œ
      ws.onerror = function(err) {
         console.log('Error:', err);
      };
   }
	
   // ์ œ์ผ ๋จผ์ € ์‹คํ–‰ ๋˜๋Š” ๋ถ€๋ถ„.
   $(document).ready(function() {
      // ๋ฒ„ํŠผ์„ ํด๋ฆญ ์‹œ ์ด๋ฒคํŠธ 
      $('#alertQnaOk').on('click', function(evt) {
      
         // ํ˜„์žฌ ๋กœ๊ทธ์ธ ํ•œ sessionId๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•จ.
         var gUserId = $("#userSessionId").val();
        
         // form ์•ˆ์— ์žˆ๋Š” input ๋“ฑ ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š” ๋™์ž‘์„ ์ค‘๋‹จ
         evt.preventDefault();
         
         // readyState 1์ผ๋•Œ webSocket๊ฐ์ฒด ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
         if (socket.readyState !== 1)
            return;
            
         // ์„ธ์…˜๊ฐ’์„ ๋ณด๋‚ธ๋‹ค. 
         socket.send(gUserId);
         $('#alertQna').css('display', 'none');
      });
      socket.onclose();
   });
</script>

html

 <div class="alret QnA" id="websocketQna" style="top:-10px;left: 1345px;">
    <h4>์ƒˆ๋กœ์šด Q&A๊ฐ€ ๋“ฑ๋ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค.</h4>
    <div class="btn-box">
    </div>
 </div>

 

์ถ”์ฒœ  ๊ธ€์ด insert ๋ ๋•Œ websocket์„ ๋ฐฑ๋‹จ์—์„œ ํ˜ธ์ถœํ•ด ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ์„ ๊ตฌํ˜„์€ ์•„๋ž˜ ํด๋ฆญ  

 

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

[ ๊ฐœ๋ฐœ ๋ถ€๋ถ„ ]

truecode-95.tistory.com