[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
'Spring' 카테고리의 다른 글
| [SUMMERNOTE] 썸머노트 이미지 다중 업로드 처리 (글 저장 클릭 시 임시폴더에 있던 파일 복사하여 외부 폴더에..) (2) | 2022.02.24 |
|---|---|
| @RequestParam 값이 Null / 예외 처리 (required=false) (0) | 2022.02.16 |
| [Spring] 파일 다운로드 구현 (0) | 2021.12.15 |
| 컨트롤러 아닌곳에서 session 값 얻기 (0) | 2021.11.28 |
| [JAVA] sever ip 얻는 방법 InetAddress.getLocalHost() (0) | 2021.11.28 |