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