1. ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… โ€” WebSocket(STOMP) ์„ ํƒ
๋ฐฉ์‹ ๊ฒ€ํ†  ๋‚ด์šฉ
HTTP Polling ๊ตฌํ˜„ ๋‹จ์ˆœํ•˜๋‚˜ ๋ถˆํ•„์š”ํ•œ ์š”์ฒญ ๋ฐ˜๋ณต, ์„œ๋ฒ„ ๋ถ€ํ•˜ ์ฆ๊ฐ€
SSE ์„œ๋ฒ„โ†’ํด๋ผ์ด์–ธํŠธ ๋‹จ๋ฐฉํ–ฅ๋งŒ ๊ฐ€๋Šฅ โ€” ์ฑ„ํŒ…์— ๋ถ€์ ํ•ฉ
WebSocket (STOMP)ย โœ… ์–‘๋ฐฉํ–ฅ ์ง€์† ์—ฐ๊ฒฐ, STOMP๋กœย /pubย ยทย /subย ์—”๋“œํฌ์ธํŠธ ๋ถ„๋ฆฌ ๋ฐ ์ฑ„ํŒ…๋ฐฉ๋ณ„ ๊ตฌ๋… ๊ตฌ์กฐํ™”

์ฑ„ํŒ…์€ ์†กยท์ˆ˜์‹ ์ด ๋™์‹œ์— ์ผ์–ด๋‚˜๋Š” ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์ด ํ•„์ˆ˜์˜€๊ธฐ ๋•Œ๋ฌธ์— SSE์™€ Polling์€ ๊ณ ๋ ค ๋Œ€์ƒ์—์„œ ์ œ์™ธํ–ˆ์Šต๋‹ˆ๋‹ค.


2. ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ ํŽ˜์ด์ง• โ€” ์ปค์„œ ๊ธฐ๋ฐ˜ ์„ ํƒ

๋ฐฉ์‹ ๊ฒ€ํ†  ๋‚ด์šฉ
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}

3. ์ฝ์Œ ์ƒํƒœ ๊ด€๋ฆฌ โ€” room_read_tb ๋ถ„๋ฆฌ ์„ค๊ณ„

๋ฐฉ์‹ ๊ฒ€ํ†  ๋‚ด์šฉ
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

4. Presence(์ ‘์† ์ƒํƒœ) ๊ด€๋ฆฌ โ€” ์„œ๋ฒ„ ๊ธฐ์ค€ ์ƒํƒœ ๊ด€๋ฆฌ

ํด๋ผ์ด์–ธํŠธ ๊ธฐ์ค€์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉด ํƒญ ๋‹ซ๊ธฐยท์ƒˆ๋กœ๊ณ ์นจยท์ค‘๋ณต ์ ‘์† ์ƒํ™ฉ์—์„œ ์—ฃ์ง€ ์ผ€์ด์Šค๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. WebSocketย CONNECT / DISCONNECTย ์ด๋ฒคํŠธ๋กœ online user๋ฅผ ์„œ๋ฒ„์—์„œ ๊ด€๋ฆฌํ•˜๊ณ ,ย ENTER_ROOM / LEAVE_ROOMย ์ด๋ฒคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ดย userId โ†’ activeRoomIdย ๋งคํ•‘์„ ์„œ๋ฒ„๊ฐ€ ๋ณด์œ ํ•˜๋„๋ก ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

์„œ๋ฒ„๊ฐ€ ๋ฐ˜๋“œ์‹œ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•  ์ƒํƒœ
โ”œโ”€โ”€ Connection State  (์—ฐ๊ฒฐ ์—ฌ๋ถ€)
โ”œโ”€โ”€ User State        (์˜จ๋ผ์ธ ์—ฌ๋ถ€)
โ””โ”€โ”€ Room State        (ํ˜„์žฌ ํ™œ์„ฑ ์ฑ„ํŒ…๋ฐฉ)

์ด ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์—†์œผ๋ฉด ์•Œ๋ฆผ ์ค‘๋ณต ยท unread ์˜ค๋ฅ˜ ยท 1์ธ๋ฐฉ ๋ฒ„๊ทธ ยท ์žฌ์ ‘์† ๋ฌธ์ œ๊ฐ€ ์—ฐ์‡„์ ์œผ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.