Spring

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

natrue 2022. 1. 10. 14:22
728x90

 

 

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

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

truecode-95.tistory.com

 

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

[ ๊ฐœ๋ฐœ ๋ถ€๋ถ„ ] WebSocketHandler.java package egovframework...; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.apache.commons.lang3.StringUtils; import org.apache.ibat..

truecode-95.tistory.com

Q&A๋ฟ๋งŒ์•„๋‹ˆ๋ผ ๊ณต์ง€์‚ฌํ•ญ์ด๋‚˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์—์„œ๋„ ๊ธ€์ด insert ๋ ๋•Œ

WebSocket์„ ๋ฐฑ๋‹จ์—์„œ ํ˜ธ์ถœํ•ด ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ์„ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค.

 

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

1. ๋ฉ”์„œ๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋˜๊ณ , ์ธ์Šคํ„ด์Šค๊ฐ€ ์ž๋™์œผ๋กœ ์ฃผ์ž…

์‚ฌ์šฉํ•  controller ์— ์ถ”๊ฐ€ (์˜ˆ : boardController.java)

@Autowired
private WebSocketHandler websocketHandler;

2. handleTextMessage ์ด๋™ 

WebSocketHandler.java ๋ถ€๋ถ„์˜ handleTextMessage๋ฅผ ์ž์‹ ์ด ์‚ฌ์šฉํ•˜๋Š” (์˜ˆ : boardController.java)๋กœ ์ด๋™.

public void boardSocket(String who,LoginVO loginVO) throws Exception{
  Map<String, WebSocketSession> users = websocketHandler.getUserMap();
  for (WebSocketSession responseIdSession : users.values()) {
    if (responseIdSession != null) {
      //JSON.parse๋กœ ๋„˜๊ธธ๋–„ 
      TextMessage tmpMsg = new TextMessage("{\"code\" : \""+ who +"\", \"id\" : \""+ loginVO.getId() +"\"}");

      //JSON.stringify๋กœ ๋„˜๊ธธ๋–„ 
      //TextMessage tmpMsg = new TextMessage(who);
      responseIdSession.sendMessage(tmpMsg);
    }
  }
}

//์ˆ˜์ • 
public void broadCast(String who, LoginVO loginVO) throws Exception{
    Map<String, WebSocketSession> users = websocketHandler.getUserMap();
    for (WebSocketSession responseIdSession : users.values()) {
        Map<String,Object> map = responseIdSession.getAttributes();
        LoginVO vo = (LoginVO) map.get("LoginResultVO");
        if (responseIdSession != null) {
            if(vo.getId() != loginVO.getId()){
                TextMessage tmpMsg = new TextMessage("{\"code\" : \""+ who +"\"}");
                //TextMessage tmpMsg = new TextMessage("{\"code\" : \""+ who +"\", \"id\" : \""+ loginVO.getId() +"\"}");
                responseIdSession.sendMessage(tmpMsg);
            }
        }
    }
}

 

3. insert ๋˜๋Š” ๋ถ€๋ถ„์— ํ•จ์ˆ˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ 

boardService.insertBoard(~~);

// ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ 
broadSocket("qna",loginVO);

4. ํ”„๋ก ํŠธ ๋ถ€๋ถ„

webSocketConnect : function(){
        var socket = null;
        // localhost:8082๋ฅผ ์–ป๊ธฐ์œ„ํ•จ 
        var uriGet2 = window.location.origin.substring(6);  
        // Path์„ ์–ป๊ธฐ์œ„ํ•จ 
        var offset = location.href.indexOf(location.host)+location.host.length;
        var ctxPath = location.href.substring(offset,location.href.indexOf('/',offset+1));

        var ws = new WebSocket("ws://" + uriGet2 + ctxPath +"/websocket");
        socket = ws;

        ws.onopen = function() {
            console.log('Info: connection opened.');
        };

        ws.onmessage = function(event) {
            var msg;
            try{
                msg = JSON.parse(event.data);
            }catch(error){
                console.error(error);
            }

            var websocketQna = $(".websocketQna");
            var li;

            var userSessionId = $("#userSessionId").val();
			
            // ์ž์‹ ์„ ์ œ์™ธํ•˜๊ธฐ ์œ„ํ•จ => ์ปจํ‹€๋กœ๋Ÿฌ์—์„œ ์ˆ˜ํ–‰๋„๋ก ์ˆ˜์ •ํ–ˆ์Œ.
            //if(userSessionId != msg.id){
                $("#boardMenuTop").css("color","#fcff3a");
                switch(msg.code) { // board,noice,qna ๊ตฌ๋ถ„ 
                case "notice":
                    $("#noticeMenuBtn").css("color","red");
                    li = $('<li>์ƒˆ๋กœ์šด ๊ณต์ง€์‚ฌํ•ญ ๊ธ€์ด ๋“ฑ๋ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค.</li>');
                    break;
                case "board":
                    $("#boardMenuBtn").css("color","red");
                    li = $('<li>์ƒˆ๋กœ์šด ๊ฒŒ์‹œํŒ ๊ธ€์ด ๋“ฑ๋ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค.</li>');
                    break;
                case "qna":
                    $("#qnaMenuBtn").css("color","red");
                    li = $('<li>์ƒˆ๋กœ์šด Q&A ๊ธ€์ด ๋“ฑ๋ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค.</li>');
                    break;
                }
            //}
            websocketQna.append(li);
            setTimeout(function(){ 
                $(".websocketQna").find(li).remove();
            }, 3000);
        };

        ws.onclose = function(event) {
            console.log('Info: ws connection closed');
        };
        ws.onerror = function(err) {
            console.log('ws Error:', err);
        };
    },
}

 

JSON ๊ฐ์ฒด ์ฐจ์ด๋Š” ์•„๋ž˜์— ์ •๋ฆฌํ•ด ๋†“์•˜๋‹ค. 

 

JSON ๊ฐ์ฒด์˜ parse / stringify ์ฐจ์ด

* JSON ๊ฐ์ฒด์˜ parse String -> Object : String ๊ฐ์ฒด๋ฅผ json ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ who๋Š” ์ธ์ž๊ฐ’์œผ๋กœ ๊ฐ’์ด ๋‹ด๊ฒจ์žˆ๋‹ค. TextMessage tmpMsg = new TextMessage("{\"code\" : \""+ who +"\"}"); var msg = JSON.parse(event..

truecode-95.tistory.com