[Project] SSE 사용 이유와 구현

Fraise_KIM·2023년 7월 27일
0

⏱️ SSE 사용 이유

  • 게시글 편집 상태 조회 및 알림 기능이 필요했다.
  • 한 사람이 수정 중인 게시글에 대해서는 다른 사람이 수정하지 못하도록 하며,수정이 완료된 게시물에 대해서는 수정 완료 되었음을 프론트에 보내주고, 나아가 알림 기능까지 구현하고자 했다.

🎛️ SSE 사용 방향

  • 게시글을 수정하기를 누르면 SSE emitter 객체가 생성되어, SSE가 연결된다.
  • SSE 연결은 크게 게시글에 연결되고, 게시글 안에 수정을 원하는 여러 멤버가 연결된다.
  • 편집이 완료되면 SSE가 연결된 멤버들에게 event에 대한 data를 보내고, SSE 연결을 끊는다.

⛏️ 구현

  • EmitterRepository에서 ConcurrentHashMap을 사용하여 SSE 구독 정보 저장
    public static Map<Long, SseEmitters> postSseEmitters = new ConcurrentHashMap<>();
    
        public SseEmitters subscibePosts(Long postId) {
            if (postSseEmitters.get(postId) == null) {
                SseEmitters postSseEmittersMap = new SseEmitters();
                postSseEmitters.put(postId, postSseEmittersMap);
            }
    
            return postSseEmitters.get(postId);
        }
    • repository에서 Spring Data JPA 대신 HashMap 사용하여 데이터 저장 및 조회
    • Disk가 아닌 memory에 저장하기 때문에 disk I/O 작업이 발생하지 않아 속도가 빠르며, 휘발성이라는 점에서 사용함.

  • HashMap 사용 이유

    • HashMap

      • 데이터를 저장할 때 Key와 Value 가 짝을 이루어 저장되는 자료구조

      • 데이터를 저장할 때는 키(Key) 값으로 해시함수를 실행한 결과를 통해 저장위치를 결정

      • HashMap은 특정 데이터의 저장위치를 해시함수를 통해 바로 알 수 있기 때문에
        데이터의 추가, 삭제, 특히 검색이 빠르다는 장점

      • Spring Data JPA를 사용하여 데이터를 저장하고 조회하는 것보다 빠르고,

      • 멤버와 게시글에 대한 데이터의 저장위치를 해시함수를 통해 바로 알 수 있기 때문에 검색이 빠르다는 점에서 도입함.


  • Concurrent HashMap 사용 이유
    • Concurrent HashMap
      : Thread-safety를 보장하면서 HashTable, HashMap과 동일한 기능을 가지는 클래스
    • Thread-safety : 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제 없음 (동시성 문제 해결)

    • 💡 동시성 문제를 해결하기 위해
      • HashMap은 기본적으로 동기화 되지 않는다. (=Thread-safe하지 않음)
      • 동시성 문제가 없는 (여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제 없는) ConcurrentHashMap을 사용 = Tread-safe
      • 하나의 쓰레드가 HashMap 객체를 iterate하는 동안, 다른 쓰레드가 객체의 내용을 추가/수정하려고 하면, HashpMapConcurrentModificationException이라는 런타임 예외가 발생한다.
      • 반면 ConcurrentHashMap에서는 iterate할 때 객체 수정이 발생하더라도 예외가 발생하지 않는다.

Web Socket과의 차이점


🔎 SSE(Server Sent Event)

  • 서버- 클라이언트의 단방향 통신으로 지속적인 연결을 통해, 서버의 데이터를 실시간으로 클라이언트로 보낸다.
  • 처음 한 번 맺은 HTTP 연결을 통해 서버는 클라이언트로 지속적으로 데이터 전송 가능하다.
    • 일반적인 HTTP 요청 : request - respones ➡️ disconnect
    • SSE의 경우 : request - data transmission - data transmission - data transmission -... ➡️ disconnect

🔛 WebSocket (Server push)

  • TCP 통신을 통해 서버와 브라우저가 실시간으로 데이터를 주고 받는 방법
  • TCP가 handshake를 통한 연결 지향 양방향 통신이기 때문에 실시간 양방향 통신이 가능하다.
  • 채팅, 게임, 주식 등에 사용
  • 계속해서 HTTP 요청을 보내지 않고, websocket은 연결을 유지하며 서버-클라이언트 통신 가능

자세한 사항

0개의 댓글