๐งฉ ๋ฐฐ๊ฒฝ ์ค๋ช
1. ์ผ๋จ ๋ด๊ฐ ์ง๊ธ ๋ชธ ๋ด๊ณ ์๋ ํ์ ์ด REST ๋ก๊ทธ ์ ์ฌ๋ ๊ตฌํ๋์ด ์๋๋ฐ ws๋ ์ ๋์ด ์์
2. ๊ทธ๋์ ํด์ผ ๋จ
3. ์๋
4. ๊ทธ๋ฐ๋ฐ ์๋ก ๋ถ์ธ ์น์์ผ ์๋น์ค๋ ๋ก๊ทธ ์์ง ๊ตฌ์กฐ๊ฐ ์ ํ ๋ค๋ฆ์ ๊นจ๋ฌ์(๋น์ฐํจ)
๐ญ ๊ณ ๋ฏผ์ ๋ด์ฉ
send_json() ์ด ํธ์ถ๋ ๋๋ง๋ค ๋ก๊ทธ๊ฐ ์๋ฐฑ ๊ฑด์ฉ ์์.
resToken์ด 738์ธ ์๋ต์ด ์คํธ๋ฆฌ๋ฐ ๋๋ฉด ,,, ์ ์ด๋ 738+@ ๊ฑด์ด ์์ด๋ ๊ฑฐ์ ๊ทธ ํ๋์ ๋ฆฌ์๋ธ๋ง๋ค;;
REST์ฒ๋ผ ์ต์ข ํ๋๋ง ๋จ๊ฒจ์ผ ๋จ
๐ ๏ธ ํด๊ฒฐ์ ์ํ ์๋๋ค
1. ๊ตฌ๊ธ๋ง
๊ฒ์ ํค์๋: FastAPI Websocket, Logging, Websocket ๋ก๊ทธ ์ ์ฌ
๊ฐ์ง๋ฌ์ด ๋ถ๋ถ์ ๋ฑ ๊ธ์ด์ค ๊ธฐ์ ๋ธ๋ก๊ทธ๋ฅผ ์ฐพ์ ์ ์์์
2. ์ง์ ์๋
- Tabp ํด๋์ค ๋ง๋ค์ด์ send_json() ์ ๊ฐ๋ก์ฑ
- ๋ง์ง๋ง ํ์ด๋ก๋๋ง ์ ์ฅํด์ ๋จ์ผ ์ ์ฌ ๊ตฌํํจ
- _logOnly ํ๋๊ทธ๋ก ํด๋ผ ์ ์ก์ ์ฐจ๋จ
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# 0) Tap: ์ต์ข
ํ์ด๋ก๋๋ง ๋ณด์กด (statusCode/statusMsg/result)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
class WebSocketTap:
def __init__(self, websocket):
self._ws = websocket
self.final_payload = None # {"statusCode":..,"statusMsg":..,"result":..}
async def send_json(self, data, *args, **kwargs):
# ws_rag ๋ด๋ถ: if websocket: await websocket.send_json({...})
if isinstance(data, dict):
# ๋งค ํธ์ถ๋ง๋ค ๋ฎ์ด์จ์ "๊ฐ์ฅ ๋ง์ง๋ง" ํ์ด๋ก๋๋ง ์ ์ง
self.final_payload = {
"statusCode": data.get("statusCode"),
"statusMsg": data.get("statusMsg"),
"result": data.get("result"),
}
return await self._ws.send_json(data, *args, **kwargs)
# ํ์ํ๋ฉด text๋ ์ค๋ฒ๋ผ์ด๋ ๊ฐ๋ฅํ์ง๋ง, ์ฌ๊ธฐ์ ์ต์ข
json๋ง ๋์
def __getattr__(self, name):
return getattr(self._ws, name)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# 1) ๋ก๊ทธ ํธ์ง → ์ต์ข
1๊ฑด๋ง insert ํธ์ถ → ai search์ ์ ์ฌ
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
async def websocketCallLog(logData: dict):
doc = {
"event": logData.get("event"),
"userId": logData.get("userId"),
"requestKey": logData.get("requestKey"),
"infId": logData.get("infId"),
"inData": logData.get("inData"),
"statusCode": logData.get("statusCode"),
"statusMsg": logData.get("statusMsg"),
"tapResult": logData.get("tapResult"), # if websocket: send_json(...)์ result
"methodResult": logData.get("methodResult"), # getStrm() ๋ฆฌํด
}
await insertWebsocketCallLog(doc) # ai search์ ์ ์ฌ
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# 2) ์๋น์ค ํ์คํฌ: Tap์ผ๋ก ๊ฐ์ธ ํธ์ถ → ๋ง์ง๋ง ํ์ด๋ก๋๋ง ๋ก๊ทธ 1๊ฑด
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
async def websocketSendTextAsync(websocket, data):
ws_tap = WebSocketTap(websocket)
method_result = None
try:
# ํน์ ์ธํฐํ์ด์ค ์์
ํ result
method_result = await ws_rag.getStrm(event, data, ws_tap)
finally:
# ์ต์ข
ํ์ด๋ก๋๊ฐ ์์ ์๋ ์์ผ๋ ๋ฐฉ์ด ๋ก์ง๋ ํ์ํ ๋ฏํจ
final = ws_tap.final_payload or {}
# ai search์ ๋ฃ์ ๋ฐ์ดํฐ ํธ์งํด์ ๋์ ธ์ฃผ๊ธฐ!
logData = {
"event": event,
"userId": f"{websocket.client.host}:{websocket.client.port}",
"requestKey": req_key,
"infId": inf_id,
"inData": data,
"statusCode": final.get("statusCode"),
"statusMsg": final.get("statusMsg"),
"tapResult": final.get("result"),
"methodResult": method_result,
}
# ๋ฐ๋์ ํ ๋ฒ๋ง ์ ์ฌ
await websocketCallLog(logData)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# 3) ์๋ํฌ์ธํธ: ๋ฉํฐ๋ฉด ํ์คํฌ, ๋จ๊ฑด์ด๋ฉด await (๋ง์ง๋ง์ close)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
@app.websocket("/ws/rag")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
try:
while True:
raw = await websocket.receive_text()
if raw == "__ping__":
await websocket.send_text("pong")
continue
try:
data = json.loads(raw)
assert isinstance(data, dict)
except Exception as e:
await websocket.send_json({"statusCode": 400, "statusMsg": f"INVALID_JSON: {e}"})
continue
multi = data.get("multi")
if multi:
# ๋ฉํฐ์ฌ๋ ๊ฐ ์์ฒญ๋ณ๋ก ์ต์ข
1๊ฑด๋ง ์ ์ฌ๋จ
asyncio.create_task(websocketSendTextAsync(websocket, data))
else:
await websocketSendTextAsync(websocket, data)
finally:
try:
await websocket.close()
except Exception:
pass
๋์ถฉ ์ด๋ฐ ๋ก์ง์ด์์
๐ ๋ณํ
- ๋ด๊ฐ ์ํ๋ ๋๋ก ๋จ
- ๋ก๊ทธ ์ ์ฌ๋๋ ๋ง์ด ์ค์ด๊ณ (์ฝ 90% ์ด์ ๊ฐ์)
- ํ๋ฉด์๋ ์ ์ ์๋ต๋ง ๋ณด์ด๊ฒ!
- ๋๋ฒ๊ทธ/์๋ฌ๋ ์ธ๋ฑ์ค์์๋ง ๋ณผ ์ ์์
- ์ด ํ์ ์ด ๊ฐ๊ณ ์๋ REST ๋ก๊ทธ ์ ์ฌ ๊ตฌ์กฐ์ ์ด๋ ์ ๋ ์ผ๊ด์ฑ์ ๊ฐ์ง๊ฒ๋ ํจ(๋ฉ์๋๋ช , ํ๋ก์ฐ ๋ฑ)
๐ ํ๊ณ & ๋ค์ ๋ชฉํ
์น์์ผ์ด REST์ ๋ณธ์ง์ ์ผ๋ก ๋ค๋ฅธ ๊ตฌ์กฐ๋ผ "REST์ฒ๋ผ ํ๊ฒ ๋ค"๋ ๋ฐ์์ด ๋ฌธ์ ์๋ ๊ฒ ๊ฐ์
์ด๋ฒ ํฌ์คํ ์์ REST ๋ก์ง ๊ตฌ์กฐ๋ฅผ ์ค๋ช ํ์ง ์์์ง๋ง REST ๋ก์ง์ ์ฐธ๊ณ ํ์ฌ ws์ ๋ง๊ฒ ๋ฆฌ๋์์ธ ํ ๊ฒ์ด ์ฌ๋ฐ์์
์๋น์ค ์ฑ๊ฒฉ์ ๋ง์ถฐ ์ปค์คํ ํด์ผ ํ๋ค๋ ๊ฒ์ด ์ด๋ฒ ๊ณผ์ ์ ํตํด ์ป์ ๊ตํ์!