๐ ๊ฐ์
ํ๋ก์ ํธ์์ ์ค์๊ฐ ์๋ฆผ ๊ธฐ๋ฅ์ ๊ตฌํํด์ผ ํ๋ค.
์ด๊ธฐ์ ๊ณ ๋ฏผํ๋ ์ค
์ฃผ๊ธฐ์ ์ผ๋ก ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๋ ๋ฐฉ์์ ํํ๋๋ฐ
๋์ค์ ์๊ณ ๋ณด๋ Short Polling ์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ ๋ฐฉ์์ด์๋ค.
์น ํต์ ๋ฐฉ์์ Long Polling๊ณผ ์น ์์ผ ๋ฐฉ์๋ ์๋๋ฐ ์ด ๊ธ์์ ์ค๋ช ํ์ง ์๋๋ค.
โญ Short Polling

๊ณ์ ์์ฒญ๊ณผ ์๋ต์ ๋ฐ๋ณตํ๋ ํํ ๋ฐฉ์์ด๋ค.
์ฃผ๊ธฐ์ ์ผ๋ก ์์ฒญ์ ๋ณด๋ธ๋ค๋ ๋์ฒด ์ด๋ ๊ฐ๊ฒฉ์ผ๋ก?
๋ด๊ฐ ์๊ฐํ ๋ฐฉ๋ฒ์ 5์ด๋ง๋ค ์๋ฆผ ์กฐํ ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ด์๋ค.
๋ฐ๋ณด๊ฐ ์๋ ์ด์
์ด ๋ฐฉ๋ฒ์ ๋์ ์ฌ์ฉ์๊ฐ ๋์ด๋ ์๋ก ์์ฒญ์ด ๊ธฐํ๊ธ์์ ์ผ๋ก ๋น๋กํด ๋์ด๋ ๊ฒ์ด๋ค.
๊ธธ๊ฒ ๋ณด๋ฉด ๋๊ฐ๋ด๋ ๋ฆฌ์์ค๋ฅผ ๋ง์ด ๋จน๋ ๊ตฌ์กฐ์ด๋ค.
๋๋ ์ด๋ ๊ฒ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํด๋ ๋ฐ๋ก ์ ๋ณด๋ด์ง๊ณ
์ฃผ๊ธฐ์ ์ผ๋ก ์กฐํํด์ผ ํ๋ ๋ฐฉ๋ฒ๋ณด๋ค๋
์๋ฒ์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ ์๊ฐ์ ์๋ฆผ์ ๋ณด๋ด๊ณ ์ถ์๋ค.
๋ฐฉ๋ฒ์ ๊ณ์ ์๊ฐํ๋ค ๋ณด๋ ์น ์์ผ๋ ์๊ฐํ์๋ค.
ํ์ง๋ง ์์ผ์ ๋ฌ๋์ปค๋ธ๊ฐ ์์ด์ ๋ถ๋ด์ค๋ฌ์ ๋ค.(์ธ์ ๊ฐ ํด์ผ๊ฒ ์ง?)
๊ทธ๋ฌ๋ค ์ ๋ง ๋ด๊ฐ ์ํ๋ ๋ฐฉ์์ ์ฐพ์๋ค.
โญ SSE(Server-Sent Events)

SSE๋ ํ ๋ฒ ์์ฒญ์ ํตํด ๊ตฌ๋ ํ๋ฉด ์ฐ๊ฒฐ์ด ์ง์๋๋ค.
์๋ฒ์์๋ ํด๋ผ์ด์ธํธ์ ๋งคํ๋๋ SSE ํต์ ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค(SseEmitter).
SseEmitter๋ ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก ๋น๋๊ธฐ์ ์ผ๋ก ์ด๋ฒคํธ ์คํธ๋ฆผ์ ์ ์กํ ์ ์๊ฒ ํด์ฃผ๋ ์คํ๋ง์ ํด๋์ค์ด๋ค.
์ฐ๊ฒฐ๋์ด ์๋ ๋์ ์ด๋ฒคํธ ๋ฐ์์ ํด๋น ๊ฐ์ฒด๊ฐ
EventSource๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ์ ์กํ๋ฉด์ ๋ฐ์ดํฐ๊ฐ ์ ๋ฌ๋๋ ๋ฐฉ์์ด๋ค.
๋ฌดํ ์์ฒญ์ ํด๊ฒฐํ ์ ์๋ค๋...
์ ๋ง ๋ด๊ฐ ์๊ฐํ๋ ๋ฐฉ์ํ๊ณ ์์ ์ฐฐ๋ก์ด์ด์ ๋ฐ๋ก ์ ์ฉํ๊ธฐ๋ก ํ๋ค.
๐ SSE ์ ์ฉํ๊ธฐ
โญ Controller

ํ์ฌ ํ๋ก์ ํธ๊ฐ JWT ๋ก๊ทธ์ธ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ด์
ํด๋ผ์ด์ธํธ์์๋ ์ก์ธ์ค ํ ํฐ์ ๋ด์์ ๋ณด๋ด์ค๋ค.
๋ฐ๋ผ์ UserDetails๋ฅผ ํตํด ์ฌ์ฉ์ ์๋ณ์ด ๊ฐ๋ฅํ๋ค.
lastEventId ํ๋ผ๋ฏธํฐ๋ ๋ง์ฝ ํด๋น ์ฌ์ฉ์์ ๋ํ ๋ฏธ์์ ์๋ฆผ์ด ์๋ค๋ฉด ๋ณด๋ด์ฃผ๊ธฐ ์ํจ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์์ฒญ์ Accept ํค๋๊ฐ "text/event-stream"์ ํฌํจํ๊ณ ์๋ ๊ฒฝ์ฐ์๋ง, ์ด ๋ฉ์๋๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ๊ฒ ๋จ์ ์๋ฏธํ๋ค.
โญ Repository
์๋ฆผ์ ์ํด ํ์ฌ ์ด 3๊ฐ์ DB๋ฅผ ์ด์ฉํ๊ณ ์๋ค.
- emitterMap : SseEmitter ๊ฐ์ฒด ์ ์ฅ์ฉ
- eventCache : ์ฐ๊ฒฐ์ด ๋๊ฒจ์๋ ๋์ ๋ฐ์ํ๋ ์ด๋ฒคํธ ๊ฐ์ฒด ์ ์ฅ์ฉ
- tbl_notification : ๋ชจ๋ ์๋ฆผ ์ํฐํฐ ์ ์ฅ์ฉ - MySQL

ConcurrentHashMap ์ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ์ฌ์ฉํ๊ธฐ ์ข์ thread-safeํ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
๋์ ์ฌ์ฉ์๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ ์ ์ฉํ๋ค๊ณ ์๊ณ ์๋ค.
โญ Service

1. ์ฒซ ์ฐ๊ฒฐ ์ eventId๋ฅผ ์์ฑํ๋ค.
ํน์ดํ ์ ์ eventId์ ํ์ฌ ์๊ฐ์ ํฌํจํ๋๋ฐ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ๋ค.
Last-Event-Id = 3
{3, data1}
{3, data2}
{3, data3}
=> ์ด๋ค ๋ฐ์ดํฐ๊น์ง ์ ๋๋ก ์ ์ก๋์๋์ง ์ ์ ์๋ค.
Last-Event-Id = 3_1631593143664
{3_1631593143664, data1}
-------์ฐ๊ฒฐ ๋๊น-------
{3_1731593143664, data2}
{3_1831593143664, data3}
=> data1 ๊น์ง ์ ๋๋ก ์ ์ก๋์๊ณ , data2, data3์ ๋ค์ ๋ณด๋ด์ผํ๋ค.
๋ค์๊ณผ ๊ฐ์ด 3์ด๋ผ๋ ID๋ฅผ ๊ฐ์ง ํ์์ ์ด๋ฒคํธ ์ค ๋ค์ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ๊ตฌ๋ถํ ์ ์๊ฒ ๋๋ค.
์ด๋ ํ ์ด์ ๋ก ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ ์ฐ๊ฒฐ์ด ๋๊ฒผ๊ณ ๊ทธ ์์ ์ดํ๋ก ๋ฐ์ํ ์ด๋ฒคํธ๋ค์ ํด๋ผ์ด์ธํธ๋ก ๊ฐ์ง ์๊ณ ์์ธ๋ค.
์ฌ์ฐ๊ฒฐ ์, ์ด๋ค ์ด๋ฒคํธ๋ถํฐ ๋ค์ ๋ณด๋ด์ค์ผ ํ ์ง ๊ตฌ๋ถํ๊ธฐ ์ํด์ eventId๋ฅผ ์ฌ์ฉํ๋ค.
ํด๋ผ์ด์ธํธ๋ ์ฐ๊ฒฐ ์์ฒญ ํค๋์ Last-Event-Id ๋ฅผ ๋ด์์ ๋ณด๋ด๋ฉด ๋๋ค.
2. SseEmitter ๊ฐ์ฒด ์์ฑ ํ Map์ ์ ์ฅํ๋ค.
SseEmitter ํ์์์ ์๊ฐ์ ์ฐ๋ฆฌ ํ ํฐ ์ ํจ๊ธฐ๊ฐ์ ๋ง๊ฒ ์ค์ ํ๋ค.
3. onCompletion ๋ฐ onTimeout ์ค์
SseEmitter ์ ์ ์ก ์๋ฃ ํน์ ํ์์์, ์๋ฌ๋ก ์ธํ ์ ์ก ๋ถ๊ฐ ์ sseEmitter๋ฅผ ์ญ์ ํ๋ค.
4. ์ฐ๊ฒฐ ์ ์๋ต์ ๋ณด๋ด์ง ์์ผ๋ฉด 503 ์๋ฌ๊ฐ ๋ฐ์ํ๋ฏ๋ก ์ต์ด ์ฐ๊ฒฐ ์ ๋๋ฏธ ์ด๋ฒคํธ๋ฅผ ์ ์กํ๋ค.
5. ํด๋ผ์ด์ธํธ๊ฐ ๋ฏธ์์ ํ Event ๋ชฉ๋ก์ด ์กด์ฌํ ๊ฒฝ์ฐ ์ ์กํ์ฌ Event ์ ์ค์ ์๋ฐฉํ๋ค.
์ฐ๊ฒฐ ์์ฒญ ํค๋์ Last-Event-Id๊ฐ ์๋ค๋ฉด ์ฌ๊ธฐ์ ์ฌ์ฉ๋๋ค.
์ ์ก๋์ง ์๊ณ ์์ธ Event๋ค์ ์ฐพ์์ ๋ณด๋ด๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๊ฒ์ด๋ค.

๋ค๋ฅธ ์๋น์ค ํด๋์ค์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์ด send() ๋ฉ์๋๋ฅผ ํธ์ถํด์ ์๋ฆผ์ ๋ณด๋ธ๋ค.
1. ๋จผ์ ์๋ฆผ์ DB์ ์ ์ฅํ๋ค.
2. eventId๋ฅผ ๋ง๋ ๋ค.
3. '์๋ฆผ์ ๋ฐ์ ๋์'์ ์ด๋ฒคํธ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์จ๋ค.
์๋ฅผ ๋ค์ด, ๋ด๊ฐ ๋จ๊ธด ์ง๋ฌธ์ ๋ค๋ฅธ ์ฌ๋์ด ๋ต๋ณ์ ๋ฌ๋ฉด '์๋ฆผ์ ๋ฐ์ ๋์'์ ๊ณง ์์ ์ด๋ค.

์ด ๋ฉ์๋๋ฅผ ํตํด ๋น๋ก์ ์๋ฒ ์ธก ์ด๋ฒคํธ๊ฐ ํด๋ผ์ด์ธํธ๋ก ์ง์ ๊ฐ๋ค.
๐ ๊ฒฐ๊ณผ
โญ ๋ฌดํ ์ฌ๊ท ๋ฌธ์ ๋ฐ์ ๋ฐ ํด๊ฒฐ

ํด๋น ์ค๋ฅ๊ฐ ๊ณ์ ๋ฌ์๋ค.
์ฒ์์ ์์ธ ํ์ ์ ๋ชปํ๊ณ ์๋ค๊ฐ
ํ ๊ณณ ํ ๊ณณ ์ด์ฌํ ๋ก๊ทธ ์ฐ์ด๊ฐ๋ฉฐ ์ฐพ์๋ณด๋
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError)
์ด๋ฐ ๋ ์์ด ๋ณด์๋๋ฐ ์๊ณ ๋ณด๋
์ํฐํฐ ๊ฐ์ ์๋ฐฉํฅ ๊ด๊ณ๋ฅผ ์ง๋ ฌํํ ๋ ๋ฐ์ํ๋ ๋ฌดํ ์ฌ๊ท ๋ฌธ์ ๋ผ๊ณ ํ๋ค.
@JsonManagedReference ๋ฐ @JsonBackReference ์ ๋ ธํ ์ด์ ์ ํ์ฉํด ์ ํด๊ฒฐํ๋ค.
์ถํ์ ๋ฐ๋ก ํธ๋ฌ๋ธ ์ํ ๊ธ๋ก ์์ฑํ ์์ ์ด๋ค.
์ด์ ํ ์คํธ๋ฅผ ์ํด ๋ด ์ง๋ฌธ์ (์๋ ์๋์ง๋ง)๋ด๊ฐ ๋ต๋ณ์ ๋ฌ๋ฉด
์ค์๊ฐ์ผ๋ก ์๋ฆผ์ด ๊ฐ๋ ๋ชจ์ต์ด๋ค.

์ฌ์ธ ์ค๋ง ์์๋ sse๋ ๊ตฌํํ๋ ๊ณผ์ ์ด ์๊ฐ๋ณด๋ค ์ด๋ ค์ ๋ค.
๊ทธ๋๋ ์ ๊ตฌํํ ๊ฒ ๊ฐ์ ๋ง์กฑํ๋ค.
์ด์ ํ๋ก ํธ๋๋คํ๊ณ ์์ํด์
์ค์๊ฐ ์๋ฆผ UI๋ฅผ ์ด๋ป๊ฒ ๋ณด์ฌ์ค์ง๊ฐ ๊ด๊ฑด์ด๋ค.
- ๋ -