| ๋ฐฉ์ | ๊ฒํ ๋ด์ฉ |
|---|---|
| HTTP Polling | ๊ตฌํ ๋จ์ํ๋ ๋ถํ์ํ ์์ฒญ ๋ฐ๋ณต, ์๋ฒ ๋ถํ ์ฆ๊ฐ |
| SSE | ์๋ฒโํด๋ผ์ด์ธํธ ๋จ๋ฐฉํฅ๋ง ๊ฐ๋ฅ โ ์ฑํ ์ ๋ถ์ ํฉ |
| WebSocket (STOMP)ย โ | ์๋ฐฉํฅ ์ง์ ์ฐ๊ฒฐ, STOMP๋กย /pubย ยทย /subย ์๋ํฌ์ธํธ ๋ถ๋ฆฌ ๋ฐ ์ฑํ
๋ฐฉ๋ณ ๊ตฌ๋
๊ตฌ์กฐํ |
์ฑํ ์ ์กยท์์ ์ด ๋์์ ์ผ์ด๋๋ ์๋ฐฉํฅ ํต์ ์ด ํ์์๊ธฐ ๋๋ฌธ์ SSE์ Polling์ ๊ณ ๋ ค ๋์์์ ์ ์ธํ์ต๋๋ค.
| ๋ฐฉ์ | ๊ฒํ ๋ด์ฉ |
|---|---|
| Offset ๊ธฐ๋ฐ | ๊ตฌํ ๋จ์ํ๋ ๋ฐ์ดํฐ ์ฆ๊ฐ ์ SKIP ๋น์ฉ ์ ํ ์ฆ๊ฐ |
| ์ปค์ ๊ธฐ๋ฐ (create_dt + message_id)ย โ | ์ธ๋ฑ์ค ๋ฒ์ ์ค์บ์ผ๋ก ์ผ์ ํ ์กฐํ ์ฑ๋ฅ ์ ์ง |
create_dtย ๋จ๋
์ปค์๋ ๋์ผ ์๊ฐ ๋ฉ์์ง๊ฐ ๋ณต์์ผ ๋ ์ ๋ ฌ์ด ๋ถ์์ ํฉ๋๋ค.ย message_id๋ฅผ ๋ณด์กฐ ์ปค์๋ก ์ถ๊ฐํดย ์ ๋ ฌ ์์ ์ฑ๊ณผ ์ฑ๋ฅ์ ๋์์ ํ๋ณดํ์ต๋๋ค.
WHERE (create_dt < #{lastCreateDt})
OR (create_dt = #{lastCreateDt} AND message_id < #{lastMessageId})
ORDER BY create_dt DESC, message_id DESC
LIMIT #{pageSize}
| ๋ฐฉ์ | ๊ฒํ ๋ด์ฉ |
|---|---|
| message ํ ์ด๋ธ์ is_read ์ปฌ๋ผ ์ถ๊ฐ | ์ฌ์ฉ์ ์ ์ฆ๊ฐ ์ ๋ฉ์์ง๋ง๋ค UPDATE ๋น์ฉ ๊ธ์ฆ |
| room_read_tb ๋ถ๋ฆฌย โ | ์ฑํ ๋ฐฉ๋ณ last_read_message_id๋ง ๊ด๋ฆฌ โ unread count๋ฅผ ๋จ์ COUNT๋ก ์ฒ๋ฆฌ |
๋ฉ์์ง์ ์ฝ์ ์ํ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๋ถ๋ฆฌํดย ๋ฐ์ดํฐ ์ ํฉ์ฑ๊ณผ ์ค์๊ฐ์ฑ์ ๋์์ ๋ง์กฑํ๋ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ์ต๋๋ค.
room_read_tb
โโโ room_id
โโโ user_id
โโโ last_read_message_id
unread count = COUNT(*) WHERE message_id > last_read_message_id
ํด๋ผ์ด์ธํธ ๊ธฐ์ค์ผ๋ก ์ํ๋ฅผ ๊ด๋ฆฌํ๋ฉด ํญ ๋ซ๊ธฐยท์๋ก๊ณ ์นจยท์ค๋ณต ์ ์ ์ํฉ์์ ์ฃ์ง ์ผ์ด์ค๊ฐ ๋ฐ์ํฉ๋๋ค. WebSocketย CONNECT / DISCONNECTย ์ด๋ฒคํธ๋ก online user๋ฅผ ์๋ฒ์์ ๊ด๋ฆฌํ๊ณ ,ย ENTER_ROOM / LEAVE_ROOMย ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํดย userId โ activeRoomIdย ๋งคํ์ ์๋ฒ๊ฐ ๋ณด์ ํ๋๋ก ์ค๊ณํ์ต๋๋ค.
์๋ฒ๊ฐ ๋ฐ๋์ ์๊ณ ์์ด์ผ ํ ์ํ
โโโ Connection State (์ฐ๊ฒฐ ์ฌ๋ถ)
โโโ User State (์จ๋ผ์ธ ์ฌ๋ถ)
โโโ Room State (ํ์ฌ ํ์ฑ ์ฑํ
๋ฐฉ)
์ด ์ค ํ๋๋ผ๋ ์์ผ๋ฉด ์๋ฆผ ์ค๋ณต ยท unread ์ค๋ฅ ยท 1์ธ๋ฐฉ ๋ฒ๊ทธ ยท ์ฌ์ ์ ๋ฌธ์ ๊ฐ ์ฐ์์ ์ผ๋ก ๋ฐ์ํฉ๋๋ค.