File tree Expand file tree Collapse file tree 3 files changed +82
-0
lines changed
backend/src/main/java/io/f1/backend/domain/game/sse Expand file tree Collapse file tree 3 files changed +82
-0
lines changed Original file line number Diff line number Diff line change 1+ package io .f1 .backend .domain .game .sse ;
2+
3+ import java .io .IOException ;
4+ import lombok .RequiredArgsConstructor ;
5+ import org .springframework .web .bind .annotation .GetMapping ;
6+ import org .springframework .web .bind .annotation .RequestMapping ;
7+ import org .springframework .web .bind .annotation .RestController ;
8+ import org .springframework .web .servlet .mvc .method .annotation .SseEmitter ;
9+
10+ @ RestController
11+ @ RequestMapping ("/sse" )
12+ @ RequiredArgsConstructor
13+ public class SseController {
14+
15+ private final SseService sseService ;
16+
17+ @ GetMapping ("/lobby" )
18+ public SseEmitter subscribe () {
19+ return sseService .subscribe ();
20+ }
21+ }
Original file line number Diff line number Diff line change 1+ package io .f1 .backend .domain .game .sse ;
2+
3+ import java .util .List ;
4+ import java .util .concurrent .CopyOnWriteArrayList ;
5+ import org .springframework .stereotype .Repository ;
6+ import org .springframework .web .servlet .mvc .method .annotation .SseEmitter ;
7+
8+ @ Repository
9+ public class SseEmitterRepository {
10+
11+ private final List <SseEmitter > emitters = new CopyOnWriteArrayList <>();
12+
13+ public void save (SseEmitter emitter ) {
14+ emitters .add (emitter );
15+ // 연결종료 객체정리
16+ emitter .onCompletion (() -> {
17+ emitters .remove (emitter );
18+ });
19+ emitter .onTimeout (() -> emitters .remove (emitter ));
20+ emitter .onError (error -> emitters .remove (emitter ));
21+ }
22+
23+ // 연결 종료 객체 정리
24+ public void remove (SseEmitter emitter ) {
25+ emitters .remove (emitter );
26+ }
27+
28+ // 브로드캐스팅
29+ public List <SseEmitter > getAll () {
30+ return emitters ;
31+ }
32+ }
Original file line number Diff line number Diff line change 1+ package io .f1 .backend .domain .game .sse ;
2+
3+ import java .io .IOException ;
4+ import lombok .RequiredArgsConstructor ;
5+ import org .springframework .stereotype .Service ;
6+ import org .springframework .web .servlet .mvc .method .annotation .SseEmitter ;
7+
8+ @ Service
9+ @ RequiredArgsConstructor
10+ public class SseService {
11+
12+ private final SseEmitterRepository emitterRepository ;
13+
14+ public SseEmitter subscribe () {
15+ SseEmitter emitter = new SseEmitter (30_000L );
16+ emitterRepository .save (emitter );
17+
18+ try {
19+ // emitter 정상 전송확인 메시지
20+ emitter .send (SseEmitter .event ()
21+ .name ("connect" )
22+ .data ("connected" ));
23+ } catch (IOException e ) {
24+ // emitter send() 호출 시 예외 처리
25+ emitterRepository .remove (emitter );
26+ }
27+ return emitter ;
28+ }
29+ }
You can’t perform that action at this time.
0 commit comments