File tree Expand file tree Collapse file tree 3 files changed +84
-0
lines changed
backend/src/main/java/io/f1/backend/domain/game/sse Expand file tree Collapse file tree 3 files changed +84
-0
lines changed Original file line number Diff line number Diff line change 1+ package io .f1 .backend .domain .game .sse ;
2+
3+ import lombok .RequiredArgsConstructor ;
4+
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 org .springframework .stereotype .Repository ;
4+ import org .springframework .web .servlet .mvc .method .annotation .SseEmitter ;
5+
6+ import java .util .List ;
7+ import java .util .concurrent .CopyOnWriteArrayList ;
8+
9+ @ Repository
10+ public class SseEmitterRepository {
11+
12+ private final List <SseEmitter > emitters = new CopyOnWriteArrayList <>();
13+
14+ public void save (SseEmitter emitter ) {
15+ emitters .add (emitter );
16+ // 연결종료 객체정리
17+ emitter .onCompletion (
18+ () -> {
19+ emitters .remove (emitter );
20+ });
21+ emitter .onTimeout (() -> emitters .remove (emitter ));
22+ emitter .onError (error -> emitters .remove (emitter ));
23+ }
24+
25+ // 연결 종료 객체 정리
26+ public void remove (SseEmitter emitter ) {
27+ emitters .remove (emitter );
28+ }
29+
30+ // 브로드캐스팅
31+ public List <SseEmitter > getAll () {
32+ return emitters ;
33+ }
34+ }
Original file line number Diff line number Diff line change 1+ package io .f1 .backend .domain .game .sse ;
2+
3+ import lombok .RequiredArgsConstructor ;
4+
5+ import org .springframework .stereotype .Service ;
6+ import org .springframework .web .servlet .mvc .method .annotation .SseEmitter ;
7+
8+ import java .io .IOException ;
9+
10+ @ Service
11+ @ RequiredArgsConstructor
12+ public class SseService {
13+
14+ private final SseEmitterRepository emitterRepository ;
15+
16+ public SseEmitter subscribe () {
17+ SseEmitter emitter = new SseEmitter (30_000L );
18+ emitterRepository .save (emitter );
19+
20+ try {
21+ // emitter 정상 전송확인 메시지
22+ emitter .send (SseEmitter .event ().name ("connect" ).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