
๐ฉ ๊ฐ์
ํ ์
๋ฌด ํน์ฑ์ ์ธ๋ถ ์๋ฒ์ ํต์ ์๋น์ค๋ฅผ ๊ตฌํํ๋ฉด์ ๋งค์ฐ ํฅ๋ฏธ๋ก์ ๋ ์ ์, ์ฌ๋ด Rac(Remote Access Control) ๊ฐ์ฒด์ ์ ์ ํ ๊ตฌ์ฑ ์์๋ง ์ฑ์ฐ๋ฉด ๊ณง๋ฐ๋ก HTTP Request ๋ฉ์์ง๊ฐ ์์ฑ๋์ด ์ธ๋ถ ์ปดํฌ๋ํธ์ ํต์ ์ด ์ด๋ฃจ์ด์ง๋ค๋ ์ฌ์ค์ด์์ต๋๋ค. ๋ง์น “HTTP Client๋ฅผ ์ง์ ๊ตฌํํ์ง ์์๋ ๋คํธ์ํฌ ์์ฒญ์ด ๋ง๋ค์ด์ง๋” ์ถ์ํ ๊ณ์ธต์ด ์กด์ฌํ๊ณ , ์ด ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ธ๋ถ์ ํต์ ํ๊ณ ์์์ต๋๋ค.
์ด ๊ธ์์๋ ์ฌ๋ด ์๋น์ค ๋ด๋ถ์์ IPC(Inter-Process Communication), ํนํ ์ธ๋ถ ์์คํ
๊ณผ ํต์ ํ๋ Rac์ ๋์ ํ๋ฆ์ ์ค์ฌ์ผ๋ก ์ ๋ฆฌํฉ๋๋ค. ๋๋ถ์ด ์ค๋ฌด์์ ์ฐ์ด๋ ๋ค์ํ IPC ๋ฐฉ์ (HTTP / Message Queue / WebSocket) ๊ฐ์ ๊ตฌ์กฐ์ ์ฐจ์ด์ ๋ชฉ์ ๋ ํจ๊ป ๋ค๋ค ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ค IPC๋ ๋ฌด์์ธ๊ฐ?
IPC(Inter Process Communication)๋ ํ๋ก์ธ์ค ๊ฐ ํต์ ์ ์๋ฏธํฉ๋๋ค. ๋
๋ฆฝ์ ์ธ ํ๋ก์ธ์ค๋ค์ด ๋ฐ์ดํฐ๋ฅผ ๊ตํํ๋ฉฐ ํ์
ํ ์ ์๋๋ก ๋ง๋๋ ํต์ฌ ๊ธฐ์ ์
๋๋ค.
IPC๋ ๋ ๊ฐ์ง ๋ฒ์ฃผ๋ก ๊ตฌ๋ถํ ์ ์์ต๋๋ค
- ๋์ผ OS ๋ด ํ๋ก์ธ์ค ๊ฐ ํต์
- ๋คํธ์ํฌ ๊ธฐ๋ฐ ํ๋ก์ธ์ค ๊ฐ ํต์
์ด๋ฒ ๊ธ์ ์ด์ ์ โก ๋คํธ์ํฌ ๊ธฐ๋ฐ IPC์ด๋ฉฐ, ์ด๋ “์๋ก ๋ค๋ฅธ ์์คํ
(์๋ฒ/์๋น์ค)์ด ๋ฐ์ดํฐ๋ฅผ ๊ตํํ๋ ๋ฐฉ์”์ ๋งํฉ๋๋ค.
๋ง์ดํฌ๋ก์๋น์ค ์ํคํ
์ฒ, ๋ถ์ฐ ์์คํ
, ์ธ๋ถ API ์ฐ๋ ๋ฑ ๋๋ถ๋ถ์ ์ค์ ๋น์ฆ๋์ค ํต์ ์ด ์ฌ๊ธฐ์ ํฌํจ๋ฉ๋๋ค.
1๏ธโฃ HTTP ํต์ - ๋คํธ์ํฌ IPC์ ๊ฐ์ฅ ๊ธฐ๋ณธ
HTTP(Hypertext Transfer Protocol)๋ ํด๋ผ์ด์ธํธ-์๋ฒ ๋ชจ๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ ๊ฐ์ฅ ๋ณดํธ์ ์ธ ํต์ ๊ท์ฝ์
๋๋ค.
Client๋ HTTP Request๋ฅผ ์ ์กํ๊ณ , Server๋ Response๋ฅผ ๋ฐํํฉ๋๋ค.
์ด ๊ณผ์ ์์ ๋ฐ๋์ HTTP Message ๊ตฌ์กฐ์ ํ๋กํ ์ฝ ์คํ์ ์ค์ํด์ผ ํฉ๋๋ค.
HTTP ์์ฒญ ๋ฉ์์ง๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ต๋๋ค

๊ฐ๋ฐ์๋ ์ด Message๋ฅผ ์ง์ ๊ตฌ์ฑํ๊ฑฐ๋ HTTP Client๋ฅผ ์ฌ์ฉํด ์์ฑํฉ๋๋ค.
์ฌ๋ด์์ Rac์ด ์ด ์ญํ ์ ์ถ์ํํ ๊ณ์ธต์
๋๋ค.
Rac์ ์ญํ - HTTP Client ์ถ์ํ
Rac(Remote Access Control)์ ์ฌ๋ด์์ ๋ง๋ ์ธ๋ถ ์๋ฒ์ ํต์ ํ๋ ์ฑ
์๋ง์ ๊ฐ์ง๋ ๊ฐ์ฒด์
๋๋ค.
Rac ๊ฐ์ฒด๋ ๋๋ถ๋ถ ๊ณตํต Base ํด๋์ค๋ฅผ ์์ํ๊ณ , onExecute() ๋ด๋ถ์์ HTTP ํธ๋ค๋ฌ ์ต์
์ ๊ตฌ์ฑํด ์์ฒญ์ ์ํํฉ๋๋ค.
ํต์ฌ์ Rac์ด ํ๋ ์ผ์ด ๋จ์ํ wrapper๊ฐ ์๋๋ผ, TS(JS) → C# Core → OS ๋คํธ์ํฌ ์คํ ๊น์ง ์ด์ด์ง๋ ๋ค์ธต ๊ตฌ์กฐ์ ์คํ ์ฒด์ธ์ ๋ง๋ ๋ค๋ ์ ์
๋๋ค.
[Rac]
↓ onExecute()
[$HttpClient]
↓ sendAs()
[HttpClientObject]
↓ __STUB__SendAs()
[HttpClient]
↓ SendAsync()
[SocketsHttpHandler]
↓ SendAsync()
[System.Net.Sockets / SocketAsyncEngine]
↓
[OS ์ปค๋์ TCP/IP ์คํ]
↓
[TCP/IP ์ฒ๋ฆฌ → NIC ๋๋ผ์ด๋ฒ → ๋คํธ์ํฌ ์ ์ก]
↓
[์ธํฐ๋ท]
↓
[์ธ๋ถ ์๋ฒ์ NIC ๋๋ผ์ด๋ฒ]
โฎ
์ด๋ฐ ๊ณผ์ ์ ํตํด์ Rac ์
ํ
ํ๋ ๊ฐ๋ค์ด HTTP Request Message ๊ตฌ์ฑ ์์๊ฐ ๋๊ณ TCP ์ธ๊ทธ๋จผํ
์ด์
, ํจํท, ๋ฐ์ดํฐ ํ๋ ์, ์ ๊ธฐ ์ ํธ๊ฐ ๋์ด ์ธ๋ถ ์๋ฒ์ ๋๋ฌ ํ๊ฒ ๋ฉ๋๋ค.
์ดํ ์ธ๋ถ ๋ชจ๋์์ ๊ณผ์ ์ ์กฐ๋ฆฝ์ ํด์ฒด์ ์ญ์์ธ ๊ฑธ ๋ค๋ค ์์๋ ๊ฒ์ฒ๋ผ ์ญ์์ผ๋ก ์งํ๋๊ฒ ๋ฉ๋๋ค.
์๋ฒ๋ ์์ฒญ ๋ฉ์ธ์ง๋ฅผ ์ฒ๋ฆฌํด์ ์๋ต์ ๋ณด๋ด์ฃผ๊ฒ ๋ฉ๋๋ค. HTTP Response ์ ๊ฐ๋ตํ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.

2๏ธโฃ Message Queue - “๋ฐํ ํ ์ ๊ฒฝ ์ฐ์ง ์๊ธฐ” ๋ฐฉ์์ ๋น๋๊ธฐ IPC
๋ฉ์์ง ํ๋ ์์ฐ์-์๋น์ ๋ชจ๋ธ๋ก ๋์ํฉ๋๋ค.
๋ฐํ(Publish)ํ ๋ฉ์์ง๋ ํ๊ฐ ์ ๋ฌ ๋ณด์ฆ์ ๋ด๋นํ๊ณ , ์์ฐ์๋ ์ดํ ๊ณผ์ ์ ์ ๊ฒฝ์ฐ์ง ์์ต๋๋ค.
์ด ๋ฐฉ์์ ๋ค์ ์ฅ์ ์ ์ ๊ณตํฉ๋๋ค
- ์์ฐ์์ ์๋น์ ๊ฐ ๊ฒฐํฉ๋ ์ต์ํ
- ์ํ ํ์ฅ์ ๊ฐํจ
- ์ฅ์ ๋ณต๊ตฌ ์ง์ ๋ช ํ
- ๋ฉ์์ง ๊ธฐ๋ฐ ์ด๋ฒคํธ ๋ชจ๋ธ(EDA) ๊ตฌํ
Publisher๋ ์์ฐ์๋ง ์ฑ
์๊ณผ ์ญํ ์ด ์๊ณ ํด๋น ๋ฉ์ธ์ง๋ฅผ ์ด๋ป๊ฒ ํ ๊ฒ์ธ์ง์ ๋ํด์ ๊ด์ฌ์ด ์๊ธฐ ๋๋ฌธ์ ์๋์ ์ผ๋ก ๊ฒฐํฉ๋๊ฐ ๋ฎ์ ์ํคํ
์ฒ์
๋๋ค.(์์กด๋๊ฐ ๋ฎ์)
๊ทธ๋์ ๋ถ์ฐ ์์คํ
์ํคํ
์ฒ๋ฅผ ๊ฐ๋ ๋ง์ ํ์ฌ์์ ์ ์ฉํ๋ ๋ฐฉ์์
๋๋ค. ์ค์ ๋ก ๋ง์ ์ํฐํ๋ผ์ด์ฆ ์์คํ
๋ค์ด MQ๋ฅผ ์ค์ฌ์ผ๋ก ๋์ํฉ๋๋ค.
์ฌ๋ด ํ๊ฒฝ์์ MQ๋ PGMQ, Kafka, Redis Pub/Sub ๋ฑ ๋ค์ํ ๊ตฌํ์ฒด๋ฅผ ์ง์ํฉ๋๋ค.
ํต์ฌ ์ฐจ์ด๋ ์ ๋ฌ ๋ณด์ฆ ๋ฐฉ์, Partitioning, ๋ฉ์ธ์ง์ ์ค์๋ ์
๋๋ค.
Publiser์ Consumer ๊ตฌํ์ฒด๋ก๋ ์ฌ๋ฌ ๊ธฐ์ ์คํ์ด ์์ง๋ง, TS Rac ๊ด์ ์์๋ ๋์ผํ ์ธํฐํ์ด์ค๋ก Publish ํ์ฌ ์ ์ง๋ณด์์ฑ์ ๋์์ต๋๋ค.
ํด๋นํ๋ ์ฑ๋ ๋ํ์ฌ ์ด๋ค ์ปค๋ฅ์
ID ๋ก ์ฐ๊ฒฐ ์๋ฒ๋ฅผ ๊ฐ์ ธ์ฌ์ง, ์ด๋์ ๋ max task ์๋ฅผ ๊ฐ์ง์ง, ํ ํฝ์ ์ด๋ฆ์ ๋ฌด์์ผ๋ก ํ ์ง๋ config ํ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
3๏ธโฃ WebSocket — ์ง์ ํ ์๋ฐฉํฅ ํต์
HTTP๋ “์์ฒญ → ์๋ต” ๋ชจ๋ธ์ด๋ฏ๋ก ๊ทผ๋ณธ์ ์ผ๋ก ๋จ๋ฐฉํฅ์
๋๋ค.
์๋ฒ๋ ์์ฒญ์ด ์ค๊ธฐ ์ ๊น์ง ํด๋ผ์ด์ธํธ์ ์์ push๋ฅผ ํ ์ ์์ต๋๋ค.
WebSocket์ TCP ๊ธฐ๋ฐ์ผ๋ก ์ ์ด์ค ํต์ ์ฑ๋์ ํ์ฑํฉ๋๋ค.
ํธ๋์
ฐ์ดํฌ๋ HTTP ๊ธฐ๋ฐ์ผ๋ก ์์ฒญํฉ๋๋ค.
GET /chat HTTP/1.1
Upgrade: websocket
Connection: Upgrade
์๋ฒ๊ฐ HTTP 101 Switching Protocols ๋ก ์๋ตํ๋ฉด
์ดํ ํต์ ํ๋กํ ์ฝ์ ws:// (TLS ์ wss://) ๋ก ์ ํ๋ฉ๋๋ค.
์ฌ๋ด WebSocket ํ์ฉ
์น ๋ธ๋ผ์ฐ์ JS ๋ฐํ์์ Socket wrapper ๊ฐ์ฒด๋ฅผ ํ์ฉํฉ๋๋ค.
์ด ๊ฐ์ฒด๋ ๋ด๋ถ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ WebSocket API๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์๋ฒ ์ธก์ TCP_NetClient ๊ธฐ๋ฐ์ผ๋ก ํจํท์ ์์ /๋ถ๋ฐฐํฉ๋๋ค.
์ด ๋ฐฉ์์ ์ค์๊ฐ ์ฑํ
, ์๋ฆผ, ํ์
UI ์ ์ ํฉํฉ๋๋ค.
- ์ง์ ์ฐ๊ฒฐ ์ ์ง
- ์๋ฒ Push
- ๋ฉ์์ง latency ์ต์ํ
HTTP Polling / SSE ๋๋น ์์ ์ ์ธ ์ค์๊ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค.
๐๋ง๋ฌด๋ฆฌ
IPC๋ ๋ฌด์์ด ๋ ์ต์ ์ธ๊ฐ? ์ด๋ค ๊ธฐ์ ์ด ๋ ์ข๋?๊ฐ ์๋๋ผ ๋น์ฆ๋์ค ์๊ตฌ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ์์ด์ด์ผ ํฉ๋๋ค.
| ๋ฐฉ์ | ์ฅ์ | ๋จ์ | ์ฌ๋ก |
| HTTP | ๋จ์/ํ์ค/Restful | ๋จ๋ฐฉํฅ/์ค์๊ฐ ๋ถ์กฑ | ์ธ๋ถ API, CRUD |
| MQ | ๋น๋๊ธฐ/ํ์ฅ์ฑ | ์์/์ฌ์ฒ๋ฆฌ ๋ณต์ก | ์ด๋ฒคํธ ๊ธฐ๋ฐ ์์คํ |
| WebSocket | ์ค์๊ฐ/์๋ฐฉํฅ | ์ฐ๊ฒฐ ์ ์ง ๋น์ฉ | ์ฑํ /๋ชจ๋ํฐ๋ง |
๊ฐ์ ํ์ฌ ์์คํ ์ด๋ผ๋ ๋๋ฉ์ธ์ ๋ฐ๋ผ ์ต์ ์ IPC๋ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค.
์ฌ๋ด์ Rac๋ฅผ ๋ถ์ํ๋ฉด์ ๋จ์ํ “HTTP ์์ฒญ์ ๋ณด๋ด๋ ์ฝ๋”๊ฐ ์๋๋ผ,
TS(JS) → C# Core → OS ๋คํธ์ํฌ ์คํ์ผ๋ก ์ด์ด์ง๋ ์์ง์ ์ถ์ํ ๋ ์ด์ด ์์์ ์ฐ๋ฆฌ์ ๋น์ฆ๋์ค ๋ก์ง์ด ์๋ํ๊ณ ์๋ค๋ ์ฌ์ค์ ๋ช
ํํ ์ดํดํ ์ ์์์ต๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก, IPC๋ ๋จ์ํ ๊ธฐ์ ์ด ์๋๋ผ ์๋น์ค ๊ฐ ๊ณ์ฝ๊ณผ ๋ฉ์์ง ๋ชจ๋ธ๋ง์ ์ค๊ณํ๋ ์์ญ์
๋๋ค.
Rac๊ฐ ์ ๊ณตํ๋ ์ถ์ํ๋ ๊ฐ๋ฐ์๊ฐ ๋คํธ์ํฌ ํต์ ๋ด๋ถ์ ์ ๊ฒฝ ์ฐ๋ ๋์ ๋น์ฆ๋์ค ๋๋ฉ์ธ ๋ฌธ์ ํด๊ฒฐ์ ๋์ฑ ์ง์คํ ์ ์๊ฒ ํด์ค๋๋ค.
๋๊ธ