Duplicate

Server-Sent Events (SSE)

(서버 → 클라이언트) 실시간 이벤트를 전송하는 웹 기술
== 클라이언트는 HTTP 통신 ~> 서버로부터 이벤트 받음(단방향 통신에서 주로 사용)
이벤트: 텍스트 형식으로 전송, JSON 형태도 사용
WebSockets: 양방향 통신

특징

단방향 통신: 서버 → 클라이언트
HTTP 기반 프로토콜
이벤트 포맷
data: 이벤트 데이터 포함, 텍스트 or JSON 데이터
event: 이벤트의 이름 지정(선택), 클라이언트에서 구분
id: 이벤트의 고유 식별자, 클라이언트가 연결 잃어도 이전 상태 유지
재접속 및 재시도: 연결 끊어질 경우 자동 재연결 시도

구현

SseEmitter 클래스
Spring Framework에서 제공하는 클래스
SSE를 위한 서버 측 이벤트 스트림 생성
클라이언트에게 데이터 전송 및 연결 관리
Spring MVC 컨트롤러
SSE 연결 관리, 이벤트 생성 → SseEmitter ~> 클라이언트로 전송
클라이언트 요청 → SseEmitter 생성

Controller

@GetMapping(value = "", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public SseEmitter subscribe() { int userId = jwtAuthenticationProvider.getUserId(); // notificationService ~> SSE 연결 생성 및 반환 return notificationService.subscribe(userId); }
Java
복사

EmitterRepository

package com.example.tusori_backend.repository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @Repository @RequiredArgsConstructor public class EmitterRepository { private final Map<Integer, SseEmitter> emitters = new ConcurrentHashMap<>(); // SSE 연결 설정 // 사용자 식별자, SseEmitter 객체 저장 public void save(int userId, SseEmitter emitter) { emitters.put(userId, emitter); } // 연결 종료 // 연결 완료 or 시간 초과 -> 사용자의 SseEmitter 객체 삭제 public void deleteById(int userId) { emitters.remove(userId); } // 알림 전송 // 사용자의 SseEmitter 객체 가져와 데이터 전송 public SseEmitter get(int userId) { return emitters.get(userId); } }
Java
복사