๐ Spring Boot(Kotlin)๋ก ๊ตฌํํ๋ ์ค์๊ฐ ์๋ฆผ: SSE ๊ธฐ์ด
์ค์๊ฐ ์๋ฆผ ๊ธฐ๋ฅ, ๋งค๋ฒ ์น์์ผ(WebSocket)์ผ๋ก ๋ฌด๊ฒ๊ฒ ๊ตฌํํ์ จ๋์? ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก ์ผ๋ฐฉ์ ์ธ ์๋ฆผ๋ง ๋ณด๋ด๋ฉด ๋๋ค๋ฉด **SSE(Server-Sent Events)**๊ฐ ์ ๋ต์ ๋๋ค.
1. SSE๋?
SSE๋ ์๋ฒ์์ ์น ๋ธ๋ผ์ฐ์ ๋ก ์ค์๊ฐ ๋ฐ์ดํฐ๋ฅผ ํธ์ํ๋ HTTP ํ์ค ๊ธฐ์ ์ ๋๋ค.
| ํน์ง | ์ค๋ช |
| ํต์ ๋ฐฉํฅ | ๋จ๋ฐฉํฅ (์๋ฒ → ํด๋ผ์ด์ธํธ) |
| ํ๋กํ ์ฝ | ์ผ๋ฐ HTTP ์ฌ์ฉ (text/event-stream) |
| ์ฐ๊ฒฐ ์ ์ง | ํ ๋ฒ ์ฐ๊ฒฐํ๋ฉด ์๋ฒ๊ฐ ๊ณ์ ๋ฐ์ดํฐ ์ ์ก ๊ฐ๋ฅ |
| ์ฌ์ฐ๊ฒฐ | ๋คํธ์ํฌ ์ค๋จ ์ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋์ผ๋ก ์ฌ์ฐ๊ฒฐ ์๋ |
2. Backend: Kotlin ํต์ฌ ์ฝ๋
Spring์์ ์ ๊ณตํ๋ SseEmitter๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฃผ ์งง์ ์ฝ๋๋ก ๊ตฌํ์ด ๊ฐ๋ฅํฉ๋๋ค.
@RestController
class SseController {
// 1. SSE ์ฐ๊ฒฐ ์๋ํฌ์ธํธ
@GetMapping("/connect", produces = [MediaType.TEXT_EVENT_STREAM_VALUE])
fun connect(): SseEmitter {
val emitter = SseEmitter(60 * 1000L) // 60์ด ํ์์์ ์ค์
// ์ฐ๊ฒฐ ์ฆ์ ๋ฐ์ดํฐ ์ ์ก (503 ์๋ฌ ๋ฐฉ์ง์ฉ)
emitter.send(SseEmitter.event().name("connect").data("connected!"))
return emitter
}
}
3. Frontend: JavaScript ํต์ฌ ์ฝ๋
๋ธ๋ผ์ฐ์ ๋ด์ฅ API์ธ EventSource๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ ์์ต๋๋ค.
// 1. ์๋ฒ ์ฐ๊ฒฐ
const eventSource = new EventSource('http://localhost:8080/connect');
// 2. ๋ฉ์์ง ์์ ์ด๋ฒคํธ
eventSource.onmessage = (event) => {
console.log("์๋ก์ด ๋ฉ์์ง:", event.data);
};
// 3. ์ฐ๊ฒฐ ์๋ฌ ์ฒ๋ฆฌ
eventSource.onerror = (error) => {
console.error("SSE ์ฐ๊ฒฐ ์คํจ:", error);
eventSource.close(); // ํ์์ ์ฐ๊ฒฐ ์ข
๋ฃ
};
4. ๊ตฌํ ์ ํต์ฌ ์ฒดํฌ๋ฆฌ์คํธ (Tips)
- ํ์์์ ๊ด๋ฆฌ: SseEmitter ์์ฑ ์ ์๊ฐ์ ๋๋ํ ์ฃผ๊ฑฐ๋, ํด๋ผ์ด์ธํธ์์ ์ฌ์ฐ๊ฒฐ ๋ก์ง์ ํ์ธํ์ธ์.
- ๋๋ฏธ ๋ฐ์ดํฐ ์ ์ก: ์ฐ๊ฒฐ ์งํ ์๋ฒ์์ ์๋ฌด ๋ฐ์ดํฐ๋ ๋ณด๋ด์ง ์์ผ๋ฉด ์ฐ๊ฒฐ์ด ๋๊ธธ ์ ์์ต๋๋ค. "connect" ์ด๋ฒคํธ๋ฅผ ํ ๋ฒ ์ด์ฃผ๋ ๊ฒ ๊ตญ๋ฃฐ์ ๋๋ค.
- Nginx ์ค์ : ๋ง์ฝ ์๋ฒ ์์ Nginx๊ฐ ์๋ค๋ฉด ์๋ ์ค์ ์ ์ถ๊ฐํด์ผ ์ค์๊ฐ์ผ๋ก ์ ๋ฌ๋ฉ๋๋ค.
- proxy_buffering off;
- proxy_set_header Connection '';
์ ๋ฆฌํ๋ฉฐ
๋จ์ ์๋ฆผ, ์ค์๊ฐ ์ฃผ๊ฐ ์ฐจํธ, ์งํ๋ฅ ํ์ ๋ฑ์ ์น์์ผ๋ณด๋ค SSE๊ฐ ํจ์ฌ ๊ฐ๋ณ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ํธํฉ๋๋ค. ๋ค์ ํฌ์คํ ์์๋ ์ฌ๋ฌ ๋์ ์๋ฒ ํ๊ฒฝ์์ Redis๋ฅผ ํ์ฉํด SSE๋ฅผ ๊ณต์ ํ๋ ๋ฐฉ๋ฒ์ ๋ค๋ค๋ณด๊ฒ ์ต๋๋ค!
'Spring Boot > etc' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Spring ๊ฐ๋ฐ์์ FastAPI ์ฐ๋จน๊ธฐ: URL ๋จ์ถ๊ธฐ ํ๋ก์ ํธ (0) | 2026.01.07 |
|---|---|
| [Spring boot 3.x] Spring boot๋ ์ ์๋ ์ค์ ์ ๋ง๋ค์๋? (0) | 2025.12.02 |
| Spring boot 3.0 Pre-Update ๋ด์ฉ ์ ๋ฆฌ (1) | 2022.11.14 |
| [Spring boot] FilterRegistrationBean - url ํจํด์ผ๋ก Filter ์ค์ (0) | 2022.08.10 |
| [Spring boot] url query string ์ ๋ณด์ด๊ฒ ์ฒ๋ฆฌํ๊ธฐ (0) | 2022.08.09 |