-
Spring Boot Web Socket 실시간 알림
프로젝트로 SNS를 개발하던 도중 실시간 알림 기능이 필요하게 되어 구글링을 통해 알아보던 중 좋은 블로그를 접하게 되었고 해당 블로그를 참고하여 개발을 성공할 수 있었다. 먼저 웹은 HTT
soonil.tistory.com
해당 포스팅에 이어 이번에는 Vue 코드도 설명과 함께 포스팅하도록 하겠다.
참고 블로그 : https://velog.io/@skyepodium/vue-spring-boot-stomp-%EC%9B%B9%EC%86%8C%EC%BC%93
먼저 코드 설명 전에 npm을 통해 라이브러리를 설치해주어야 한다.
npm i webstomp-client sockjs-client
프로젝트 주제가 SNS였기 때문에 팔로우 신청을 예시로 코드를 보여주고 설명할 예정이며, Vuex store를 이용했기 때문에 Vuex에 맞춰 설명하도록 하겠다. 아래 두 코드 모두 store의 actions에 작성해서 사용했으며, 메인 페이지가 created 될 때 connect()를 호출해 주었고, 팔로우를 신청할 경우 follow를 호출하도록 하였다. msg를 Object 형으로 전송함으로써 서버 측 Controller에서 Dto로 데이터를 가져올 수 있었다.
1. connect => WebSocket를 연결하는 부분
connect() { // 웹 소켓 연결하는 부분. const serverURL = "http://localhost:5500"; let socket = new SockJS(serverURL); this.stompClient = Stomp.over(socket); console.log(`소켓 연결을 시도합니다. 서버 주소: ${serverURL}`); this.stompClient.connect( {}, (frame) => { // 소켓 연결 성공 this.connected = true; console.log("소켓 연결 성공",frame); // 서버의 메시지 전송 endpoint를 구독합니다. // 이런형태를 pub sub 구조라고 합니다. this.stompClient.subscribe(`/alarm/receive/${this.state.userInfo.no}`, (res) => { this.dispatch('alarmselect') //해당 부분에서 store에 있는 alarmselect를 호출 -> 디비에 저장된 읽지 않은 알림을 다가져와줌 const obj = JSON.parse(res.body); //여기에 전송받은 데이터가 저장되어있음 if(obj.type === 1){ console.log("팔로우 신청 도착") } }); }, (error) => { // 소켓 연결 실패 console.log("소켓 연결 실패", error); this.connected = false; this.state.socketcount++ if(this.state.socketcount > 10){ //소켓 연결 실패 시 재귀를 통해 반복하고 10회이상 카운트 하면 로그아웃 시킴 const authInst = window.gapi.auth2.getAuthInstance(); console.log('signout called', authInst) authInst.signOut() .then(() => { // eslint-disable-next-line console.log('User Signed Out!!!'); authInst.disconnect(); session.clear(); }) .then(() => { window.location.reload() }) .catch(() => alert('fail')) alert("서버 문제 발생") } this.dispatch('connect'); // 소켓 재연결 시도 } ); },
2. follow => WebSocket으로 팔로우 정보 날려주는 부분
follow(state, el) { //팔로우 알림 보내는 부분 파라미터로 받는사람 유저번호 넘겨줌 console.log("팔로우 알림"); if (this.stompClient && this.stompClient.connected) { const msg = { sender: this.state.userInfo.no, receiver: el, type: 1, }; this.stompClient.send( "/alarm/send/" + el, JSON.stringify(msg), {} ); } },
728x90'공부 > FrontEnd' 카테고리의 다른 글
JavaScript canvas를 이용해서 드래그로 도형 그리기 (0) 2022.05.26 Vue Router 특정 Component 비활성화 하기 (0) 2022.04.17 댓글