Skip to content

Commit 2fbe642

Browse files
committed
🚚 rename: SSE 관련 파일 패키지 구분 추가
1 parent 9ec213f commit 2fbe642

File tree

3 files changed

+83
-0
lines changed

3 files changed

+83
-0
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package io.f1.backend.domain.game.sse.api;
2+
3+
import io.f1.backend.domain.game.sse.app.SseService;
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+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package io.f1.backend.domain.game.sse.app;
2+
3+
import io.f1.backend.domain.game.sse.store.SseEmitterRepository;
4+
import java.io.IOException;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.stereotype.Service;
7+
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
8+
9+
@Service
10+
@RequiredArgsConstructor
11+
public class SseService {
12+
13+
private final SseEmitterRepository emitterRepository;
14+
15+
public SseEmitter subscribe() {
16+
SseEmitter emitter = new SseEmitter(30_000L);
17+
emitterRepository.save(emitter);
18+
19+
try {
20+
// emitter 정상 전송확인 메시지
21+
emitter.send(SseEmitter.event()
22+
.name("connect")
23+
.data("connected"));
24+
} catch (IOException e) {
25+
// emitter send() 호출 시 예외 처리
26+
emitterRepository.remove(emitter);
27+
}
28+
return emitter;
29+
}
30+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package io.f1.backend.domain.game.sse.store;
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+
}

0 commit comments

Comments
 (0)