웹소켓 실시간 알림 만들기(1)

LHR·2022년 10월 30일
0

java

목록 보기
12/13

웹소켓 기본 흐름

  1. 클라이언트에서 웹소켓에 접속(onOpen메서드)
  2. 웹소켓Handler는 afterConnectionEstablished메서드를 통해 접속한 세션을 List<WebSocketSession> sessions에 담는다
  3. 클라이언트에서 메세지를 보낸다(send메서드)
  4. 웹소켓Handler는 메세지가 수신되면 handleTextMessage메서드를 통해 전체 세션 또는 특정 세션에 메세지를 보내준다.
  5. 클라이언트에서 수신된 메세지를 받는다(onmessage메서드)
  6. 클라이언트에서 연결이 종료된다.
  7. 웹소켓Handler는 연결이 종료되면 afterConnectionClosed메서드에서 해당 세션을 삭제한다.

시나리오

  • back - 유저에게 알림을 보내야 하는 정보(새 글, 답변, 상담신청 수락 등)가 DB에 insert 됐을 때 알림 테이블에도 새 알림 row가 insert된다.
  • front
    1. 메인페이지가 로딩되면 웹소켓에 접속(onOpen).
    2. 로그인한 유저의 아이디를 소켓에 메세지로 보내준다.(send)
    3. 메세지를 수신한 소켓Handler는 AlarmDAO에서 아이디로 최근 3일 이내의 미확인알림리스트, 확인알림리스트를 HashMap에 담아 json으로 반환해준다.
    4. 반환된 json데이터에서 미확인알림리스트의 길이가 0이 아니라면 알림 아이콘에 깜빡거리는 배지를 활성화 시켜준다.(onmessage)

초기세팅

pom.xml

spring framework는 4.3.2. 버전

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-websocket</artifactId>
	<version>${org.springframework-version}</version>
</dependency>

servlet-context.xml

  1. 상단에 네임스페이스 추가
    xmlns:websocket="http://www.springframework.org/schema/websocket"

  2. bean추가

<bean id="alarmHandler" class="kr.or.ddit.handler.AlarmHandler"
		p:alarmDAO-ref="alarmDAO"></bean>
<websocket:handlers allowed-origins="*">
  <websocket:mapping handler="alarmHandler" path="/ws-alarm" />
  <websocket:handshake-interceptors>
  	<bean class="org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor" />
  </websocket:handshake-interceptors>
</websocket:handlers>

실제 프로젝트에서는 다른 페이지에서도 websocket을 사용하고 있어서 websocket-context.xml을 따로 만들어주고 root-context.xml에 추가해줬다.
websocket-context.xml에서는 namespace를 websocket으로 줬다.

1개의 댓글

comment-user-thumbnail
2023년 6월 7일

혹시 어떤걸 참조하시고 구현하셨나요??

답글 달기