-
Notifications
You must be signed in to change notification settings - Fork 0
๐ฎ SSE(Server Sent Events)
์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก ์ค์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๊ธฐ์
์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก๋ง ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ์ ์๋ ๋จ๋ฐฉํฅ ํต์
HTTP ํ๋กํ ์ฝ ๊ธฐ๋ฐ
๋ฐฉ ์์ฑ ๋ค์ด์ด๊ทธ๋จ
sequenceDiagram
participant Client
participant GameSocket
participant SignalingSocket
participant Store
participant REST
participant SSE
%% useRoomsSSE ํ
์คํ
Note over Client: useRoomsSSE ํ
๋ง์ดํธ
%% getRoomsQuery๋ก ์ด๊ธฐ ๋ฐ์ดํฐ ๋ก๋
Client->>REST: react-query getRoomsQuery() ์คํ
REST-->>Client: initialRooms ๋ฐ์ดํฐ
Client->>Store: setRooms(initialRooms)
%% SSE ์ฐ๊ฒฐ ์ค์
Client->>SSE: new EventSource(ENV.SSE_URL)
SSE-->>Client: onopen: ์ฐ๊ฒฐ ์ฑ๊ณต
Note over Client,SSE: SSE ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ค์
loop SSE ์ค์๊ฐ ์
๋ฐ์ดํธ
SSE->>Client: onmessage: rooms ๋ฐ์ดํฐ ์คํธ๋ฆผ
Note over Client: JSON.parse(event.data)
Client->>Store: setRooms(rooms)
Store-->>Client: UI ๋ฆฌ๋ ๋๋ง
end
Note over Client,SSE: ์๋ฌ ๋ฐ์ ์
SSE->>Client: onerror: ์๋ฌ ์ฒ๋ฆฌ ๋ฐ ์ฐ๊ฒฐ ์ข
๋ฃ
%% ๋ฐฉ ์์ฑ ํ๋ฆ
Note over Client: ๋ฐฉ ๋ง๋ค๊ธฐ ๋ฒํผ ํด๋ฆญ
Client->>Client: CreateDialog ์คํ
Note over Client: ๋ฐฉ ์ ๋ชฉ/๋๋ค์ ์
๋ ฅ
par Socket Connections
Client->>GameSocket: gameSocket.connect()
GameSocket-->>Client: ์ฐ๊ฒฐ ์ฑ๊ณต
Client->>SignalingSocket: signaligSocket.connect()
SignalingSocket-->>Client: ์ฐ๊ฒฐ ์ฑ๊ณต
end
Client->>GameSocket: emit('createRoom', {roomName, hostNickname})
GameSocket-->>Store: roomCreated ์ด๋ฒคํธ (room ๋ฐ์ดํฐ)
Store-->>Client: ์ํ ์
๋ฐ์ดํธ
Client->>SignalingSocket: emit('joinRoom', room)
SignalingSocket-->>Client: WebRTC ์ฐ๊ฒฐ ์ค์
Client->>SSE: eventSource.close()
- ๋ฐฉ ๋ง๋ค๊ธฐ ๋ฒํผ ํด๋ฆญ ์, ๋ฐฉ ์ ๋ชฉ๊ณผ ๋๋ค์์ ์ค์ ํ ์ ์๋ ๋ฐฉ ์์ฑ Dialog๊ฐ ์คํ๋๊ณ , ๋ฐฉ ์ ๋ชฉ๊ณผ ๋๋ค์์ ์ ๋ ฅ ํ ํ์ธ ๋ฒํผ์ ํด๋ฆญํ๋ฉด Game Server Socket๊ณผ Signaling Server Socket์ ์ฐ๊ฒฐํ๊ณ , gameSocket์ createRoom ์ด๋ฒคํธ๋ฅผ emit ํ๋ ๋ฉ์๋๋ฅผ ํธ์ถ, signaligSocket์ joinRoom ์ด๋ฒคํธ๋ฅผ emit ํ๋ ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ ์ธก ๋ ๋๋ง์ ํ์ํ ๋ฐ์ดํฐ๋ gameSocket์ ํตํด์ ๋ฐ์์ Store์ ์ ์ฅ ํ ๋ ๋๋ง์ ํด์ฃผ๊ณ ์์ต๋๋ค. ์ฆ, createRoom์ ๋ํ ์๋ต์ผ๋ก ๊ฒ์๋ฐฉ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์์ ๋ฐฉ ๋ชฉ๋ก ๋ฐฐ์ด์ ์ํ๋ฅผ ์ ์ฅํ๊ณ ๋ฐฉ ๋ชฉ๋ก ํ์ด์ง์์ ๋ ๋๋ง์ ํด์ค๋๋ค.
- ์ฌ๊ธฐ์ ๋ฌธ์ ๋ โ๋ฐฉ ์์ฑโ์ด๋ผ๋ ์ด๋ฒคํธ๋ฅผ ํตํด ์์ผ์ด ์ฐ๊ฒฐ๋๊ณ ์์ด, ๋ฐฉ ๋ชฉ๋ก ํ์ด์ง์ ์ฒ์ ์ง์ ํ ์ฌ์ฉ์์ ๊ฒฝ์ฐ ์ ์ฅ๋ ์ํ๊ฐ ์๊ณ , ๋ฐฉ ๋ชฉ๋ก ํ์ด์ง์์ ์๋ก๊ณ ์นจ์ ํ ์ฌ์ฉ์์ ๊ฒฝ์ฐ ์ํ๊ฐ ์ด๊ธฐํ๋์ด ๋ฐฉ ๋ชฉ๋ก์ด ๋ณด์ด์ง ์๊ฒ ๋ฉ๋๋ค.
- ์ฐ์ ์ด ๋ถ๋ถ์ polling ๋ฐฉ์์ผ๋ก ๊ตฌํํ๊ฒ ๋์์ต๋๋ค. polling ๋ฐฉ์์ด๋, ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ ์ธก์ ์ฃผ๊ธฐ์ ์ผ๋ก API ์์ฒญ์ ํ๋ ๋ฐฉ์์ ๋๋ค. react-query๋ฅผ ์ฒ์ ์ฌ์ฉํด ๋ด์ refetchInterval ์ต์ ์ด ์๋ ์ค ๋ชฐ๋์ต๋๋ค. ๊ทธ๋์ setInterval๋ก ์ฃผ๊ธฐ๋ฅผ ์ค์ ํด refetchํ์ฌ ๋ฆฌ๋ ๋๋งํด ์ฃผ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ์ต๋๋ค.
- ์ด ๋ฐฉ์์ ๋ฌธ์ ์ ์ ์๋ก์ด ๋ฐฉ์ด ์์ฑ๋์ง ์๋๋ผ๋, ์ฆ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋ ๊ฒฝ์ฐ์๋ ๋ถํ์ํ API ์์ฒญ์ด ๊ณ์ ๋ฐ์ํ์ฌ ์๋ฒ์ ๋ถํ๋ฅผ ์ค ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋ํ, ์๊ฒฉํ๊ฒ Interval ์๊ฐ๋งํผ ์ง์ฐ์ด ๋ฐ์ํ์ฌ ์ค์๊ฐ์ผ๋ก ๋ฐ์๋๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์ ๊ฒฝํ์๋ ์ข์ง ์๋ค๊ณ ์๊ฐํ์ฌ SSE๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ํ์ต๋๋ค.
์ ํฌ ํ์์๋ ์ฒ์์ SSE๋ฅผ ์ฌ์ฉํ๋ฉด REST API ์์ฒญ์ ์ธ ์ผ์ด ์์ ๊ฒ ๊ฐ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๊ทธ๋์ SSE๋ก๋ง ์ฒ๋ฆฌํ๊ฒ ๋์๋๋ฐ, ํด๋ผ์ด์ธํธ ์ชฝ์์ SSE ์ฐ๋ ํ ํ ์คํธ๋ฅผ ํด ๋ณด๋ ๊ณผ์ ์์ ์๋ชป๋ ์๊ฐ์ด์๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค.
SSE๋ ์๋ฒ์ ๋ฐ์ํ๋ ์๋ก์ด ์ด๋ฒคํธ(๋ณ๊ฒฝ ์ฌํญ)๋ฅผ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด ์ฃผ๋ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์, ํ์ด์ง๋ฅผ ์ฒ์ ๋ก๋ํ๊ฑฐ๋ ์๋ก๊ณ ์นจ ํ ๋์ ์ด๊ธฐ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ REST API๋ฅผ ์ฌ์ฉํด ๋ฐ์์์ผ ํฉ๋๋ค. ์ด๊ธฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์จ ์ดํ์ ๋ฐ์ํ๋ ๋ณ๊ฒฝ ์ฌํญ์ SSE๋ฅผ ์ฌ์ฉํด ์ค์๊ฐ์ผ๋ก ๋ฐ์ํ๋ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
ํน์ฑ | SSE | WebSocket |
---|---|---|
์ฐ๊ฒฐ ๋ฐฉ์ | HTTP ๊ธฐ๋ฐ | ๋ ๋ฆฝ์ ์ธ ์ฐ๊ฒฐ (TCP) |
์ ์ก ๋ฐฉํฅ | ์๋ฒ โ ํด๋ผ์ด์ธํธ (๋จ๋ฐฉํฅ) | ์๋ฒ โ ํด๋ผ์ด์ธํธ (์๋ฐฉํฅ) |
๋ธ๋ผ์ฐ์ ์ง์ | ๋๋ถ๋ถ ์ง์ | ์ผ๋ถ ๋ธ๋ผ์ฐ์ ์์๋ง ์ง์ |
๋ณด์์ฑ | HTTPS ์ฌ์ฉ ๊ฐ๋ฅ | HTTPS ์ฌ์ฉ ๊ฐ๋ฅ |
// ์๋ฒ URL์ ์ค์ URL๋ก ๋ณ๊ฒฝํ์ธ์ (์: http://localhost:8000)
const serverUrl = 'http://localhost:8000/api/rooms';
const eventSource = new EventSource(serverUrl);
eventSource.onmessage = function (event) {
console.log('New message:', event.data);
};
eventSource.onerror = function (error) {
console.error('EventSource failed:', error);
};
๐ค Ground Rule
๐ Convention
๐ณ Git Branch ์ ๋ต
๐ ๏ธ AGT - Automatic Git & Github Tool
๐ WebRTC Mesh โ ํธ๋ํฝ ๊ณ์ฐ
๐ข WebRTC Mesh - ํ๋ํ ์ฌ์
๐ฌ WebRTC๋ฅผ ์์๋ณด์
๐ฎ SSE(Server Sent Events)
๐ SSE Pagination
โณ Socket ํต์ ์์ ๋น๋๊ธฐ ์์
์์ ๋ณด์ฅ ๋ฐฉ๋ฒ
๐ก Redis pub/sub๋ฅผ ํ์ฉํ SSE ์ ์ฉ๊ธฐ
๐๏ธ Naver Cloud Platform์ ํ์ฉํ ๋ฐฐํฌ ์ ๋ต
โ๏ธ๐ ๋ถํ ํ
์คํธ: ๋จ์ผ ์ธ์คํด์ค VS NKS
๐ดโโ๏ธ Redis๋ก ๊ฒ์๋ฐฉ ๊ด๋ฆฌ ์ต์ ํ: ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ฑ๋ฅ ๊ฐ์
๐ ํ์๋ก ์บ๋ฆฐ๋
๐ค ๋ฐ์ผ๋ฆฌ ์คํฌ๋ผ ํ
ํ๋ฆฟ
๐ค ํ๊ณ ํ
ํ๋ฆฟ
0๏ธโฃ 0์ฃผ์ฐจ ๋ฉํ ๋ง ์ผ์ง
1๏ธโฃ 1์ฃผ์ฐจ ๋ฉํ ๋ง ์ผ์ง
2๏ธโฃ 2์ฃผ์ฐจ ๋ฉํ ๋ง ์ผ์ง
3๏ธโฃ 3์ฃผ์ฐจ ๋ฉํ ๋ง ์ผ์ง
4๏ธโฃ 4์ฃผ์ฐจ ๋ฉํ ๋ง ์ผ์ง
0๏ธโฃ 0์ฃผ์ฐจ ๋ฐํ
1๏ธโฃ 1์ฃผ์ฐจ ๋ฐํ
2๏ธโฃ 2์ฃผ์ฐจ ๋ฐํ
3๏ธโฃ 3์ฃผ์ฐจ ๋ฐํ
4๏ธโฃ 4์ฃผ์ฐจ ๋ฐํ
5๏ธโฃ ์ต์ข
๋ฐํ