(서버 → 클라이언트) 실시간 이벤트를 전송하는 웹 기술
== 클라이언트는 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
복사