웹소켓 기본 흐름

  1. 클라이언트에서 웹소켓에 접속 (onopen메서드)

  2. 웹소켓 Handler는 afterConnectionEstablished 메서드를 통해 접속한 세션을 만들어 놓은 컬렉션에 담는다.

    1. Map<Integer, ArrayList<WebSocketSession>> roomList

      → 접속한 유저가 속해있는 채팅방 번호를 key로 하여 비어있는 ArrayList를 value로 채워 넣는다.

    2. private Map<WebSocketSession, String> userSessionMap

      → 해당 key는 onopen한 유저의 WebSocketSession값을 넣고 value는 로그인한 유저의 HttpSession에 담긴 userId를 담는다.

    3. private List<WebSocketSession> sessionList

      → 로그인한 전체 session을 담는 List

  3. 클라이언트에서 메시지를 보낸다 (send메서드)

  4. 웹소켓 Handler는 메세지가 수신되면 (handleTextMessage) 메서드를 통해 전체 세션 또는 특정 세션에 메시지를 보내준다.

  5. 클라이언트에서 수신된 메시지를 받는다(onmessage메서드)

  6. 클라이언트에서 연결이 종료된다.

  7. 웹소켓Handler는 연결이 종료되면 afterConnectionClosed 메서드에서 해당 세션을 삭제한다.

시나리오

실시간 알림 (polling 방식)

  1. 스터디 모집 게시글 작성자가 게시글을 작성하여 DB에 insert 됐을 때 알림 테이블에도 작성자를 제외한 모든 유저에게 새 알림 row가 insert된다.
  2. 로그인 시 header에서 alarm 테이블에 해당 유저의 알람을 가져오기 위해 비동기 방식 이용(AJAX)
  3. setInterval 을 이용하여 해당 알람을 가져오는 AJAX를 3초 주기로 가져와서 알림에 뿌려 알림 아이콘을 빨간색으로 활성화 시켜준다.
  4. 해당 알림을 클릭해 이동하면 해당 알림은 삭제된다. ( DB에 해당 알림 row는 delete 된다.)

실시간 채팅 (websocket 방식)

  1. 스터디 모집 게시글을 작성하면 게시글 작성자는 스터디장이 되며 본인만 있는 채팅방이 생성된다. ( studygroupstudymember이 1:N 관계로 작성자는 자동으로 studymember에 해당 studygroup번호와 역할이 주어진다)