Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Kim ByeungHyun

SSE API 본문

카테고리 없음

SSE API

sandbackend 2022. 12. 9. 20:37

Server-Sent Event

 

sse를 사용하면 웹페이지가 서버에서 업데이트를 가져올 수 있습니다.

 

- 단방향 메시징

웹 페이지가 자동으로 서버로부터 업데이트를 받는것 입니다.

 

지원 브라우저

브라우저 구글 Chrome 마이크로소프트
Edge
FireFox Safari Opera
버전 6.0 9.0 6.0 5.0 11.5

 

SSE는 HTTP를 기반으로 하므로 HTTP/2와 자연스럽게 맞고 결합합니다. HTTP/2는 다중화된 스트림을 기반으로 효율적인 전송 계층을 처리하고 SSE는 응용 프로그램에 API를 제공하여 활성화 합니다. 

푸시. 즉석에서 HTTP/2를 통한 멀티플렉싱을 얻을 수 있습니다. 연결이 끊어지면 클라이언트와 서버에 알립니다.

 

Server-Sent Event를 사용 할 수 있는 애플리케이션의 예 :

- 스트리밍 주가의 실시간 차트

- 중요한 이벤트에 대한 실기간 뉴스 보도 (게시 링크, 트윗 및 이미지)

- Twitter의 스트리밍 API가 제공하는 라이브 Github/Twitter 대시보드 월

- 가동 시간, 상태 및 실행 중인 프로세스와 같은 서버 통계에 대한 모니

 


spring에서의 sse 도입 방법 -ai의 답변

spring에서 SSE를 사용하려면 먼저 Spring MVC 라이브러를 사용해야 합니다.

다음으로 서블릿 3.0이상 버전이 설치되어 있어야 합니다. 그리고 이를 사용하기 위해

@EnableSse를 메인 에플리케이션 클래스(ex : Spring Boot 어플리케이션)에 붙여 줘야 합니다.

마지막으로 @SseEmitter라는 어노테이션을 사용하여 SSE 이벤트를 발송 할 수 있는 컨트롤러를 만들어야 합니다.

 


SSE in Spring

 

서버에서는 EventSource를 통해 날아오는 요청을 처리할 컨트롤러가 필요하다.

sse 통신을 하기 위해서는 MIME 타입을 text/event-stream로 해줘야 한다.

 

 

@Slf4j
@RestController
public class SseController {
    private static final Map<String, SseEmitter> CLIENTS = new ConcurrentHashMap<>();

    @GetMapping("/api/subscribe")
    public SseEmitter subscribe(String id) {
        SseEmitter emitter = new SseEmitter();
        CLIENTS.put(id, emitter);

        emitter.onTimeout(() -> CLIENTS.remove(id));
        emitter.onCompletion(() -> CLIENTS.remove(id));
        return emitter;
    }

    @GetMapping("/api/publish")
    public void publish(String message) {
        Set<String> deadIds = new HashSet<>();

        CLIENTS.forEach((id, emitter) -> {
            try {
                emitter.send(message, MediaType.APPLICATION_JSON);
            } catch (Exception e) {
                deadIds.add(id);
                log.warn("disconnected id : {}", id);
            }
        });

        deadIds.forEach(CLIENTS::remove);
    }
}