Skip to content

Commit 18c2771

Browse files
authored
✨ feat: SSE 기본 연결 기능 구현 (#11)
* ✨ feat: SSE 기본 기능 구현 * chore: Java 스타일 수정 * 🚚 rename: SSE 관련 파일 패키지 구분 추가 * chore: Java 스타일 수정 * 🗑️ remove: SSE 관련 중복 파일 삭제 --------- Co-authored-by: github-actions <>
1 parent 82f88b1 commit 18c2771

File tree

3 files changed

+88
-0
lines changed

3 files changed

+88
-0
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
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+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
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+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
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+
}

0 commit comments

Comments
 (0)