[SpringBoot/Kotlin] SSE ํ์ฉํ AI Streaming Chat ๊ตฌํ (w. React) - (2) FE
SSE ํ์ฉํ AI Streaming Chat ๊ตฌํ (w. React) - 2ํ: ์น ์ฑ ๊ตฌํ
โก๏ธ 1ํ: ์๋ฒ ๊ตฌํ
[SpringBoot/Kotlin] SSE ํ์ฉํ AI Streaming Chat ๊ตฌํ (w. React)
SSE ํ์ฉํ AI Streaming Chat ๊ตฌํ (w. React) - 1ํ: ์๋ฒ ๊ตฌํ๋ฏธ๋ฆฌ๋ณด๊ธฐ์ ์ฒด ์ฝ๋๋ ์๋์!Spring Boot์ SSE๋ฅผ ํ์ฉํ์ฌ AI Streaming Chat ์๋น์ค๋ฅผ ๊ตฌํํ์๋ค.์ฌ์ค ์ฑํ ์คํธ๋ฆฌ๋ฐ์ ๊ตฌํํ๊ธฐ ์ํ ๋ค์ํ ์ธ
doteloper.tistory.com
๋ฏธ๋ฆฌ๋ณด๊ธฐ
์ด๋ฒ ํฌ์คํ ์ ์ ๋ฒ ์๋ฒ ๊ตฌํ์ ๋ฐ๋ ์น ์ฑํ ์ ๊ด๋ จ๋ ์ฝ๋์ด๋ค.
์ฌ์ค ์ด๋ฒ ํ๋ก์ ํธ์ ํ๋ก ํธ ๋ด๋น์ “GPT”์๋ค.
๋ฐ๋ผ์ ์ค๋ช ์ ํ๊ณ๊ฐ ์์ผ๋ฏ๋ก, ์ค์ํ ์ค์๊ฐ ์๋ต ์ฒ๋ฆฌ๋ง ๊ฐ๋จํ ์ค๋ช ํ๊ณ ๋ง์น๋๋ก ํ๊ฒ ๋ค.
(โผ๏ธโผ๏ธโผ๏ธโผ๏ธโผ๏ธ ์๋ ๋ชจ๋ ํ๋ก ํธ ์ฝ๋๋ chat gpt๋ก๋ง ๋ง๋ ์ฝ๋๋ก ์ค์ FE ๊ธฐ์ ๊ณผ ๋ฉ๋ฆฌ ๋จ์ด์ ธ์์ ์ ์์ต๋๋ค โผ๏ธโผ๏ธโผ๏ธโผ๏ธโผ๏ธ)
๊ธฐ์ ์คํ
- React (Vite)
- TypeScript
- tailwindcss
SSE๋ฅผ ์ด์ฉํ ์ค์๊ฐ ์๋ต ์ฒ๋ฆฌ
const sendMessage = () => {
if (!input.trim() || isComposing) return;
setMessages((prev) => [...prev, { role: "user", text: input }]);
setInput("");
setLoading(true);
const eventSource = new EventSource(`${API_URL}?query=${encodeURIComponent(input)}`);
let assistantText = "";
eventSource.onmessage = (event) => {
assistantText += event.data.replace(/^"|"$/g, "");
setMessages((prev) => {
if (prev.length === 0 || prev[prev.length - 1].role !== "assistant") {
return [...prev, { role: "assistant", text: assistantText }];
} else {
return prev.map((msg, index) => index === prev.length - 1 ? { ...msg, text: assistantText } : msg);
}
});
};
eventSource.onerror = () => {
eventSource.close();
setLoading(false);
};
};
- `EventSource`๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฑ์๋์์ ์ค๋ ์คํธ๋ฆฌ๋ฐ ๋ฐ์ดํฐ๋ฅผ ์์
- `onmessage` ์ด๋ฒคํธ์์ ์์ ํ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์กด ํ ์คํธ์ ์ถ๊ฐํ๋ฉด์, UI๋ฅผ ์ค์๊ฐ์ผ๋ก ์ ๋ฐ์ดํธ
- ํ ๊ธ์์ฉ ์ถ๊ฐ๋๋ฏ๋ก ์์ฐ์ค๋ฌ์ด ์คํธ๋ฆฌ๋ฐ ํจ๊ณผ๊ฐ ๊ตฌํ
- `onerror` ์ด๋ฒคํธ์์ ์คํธ๋ฆผ์ ์ข ๋ฃํ๊ณ ๋ก๋ฉ ์ํ๋ฅผ ํด์
์ ์ฒด ์ฝ๋
https://github.com/jeongum/openai-chat/tree/master/my-sse-chat
openai-chat/my-sse-chat at master · jeongum/openai-chat
Contribute to jeongum/openai-chat development by creating an account on GitHub.
github.com