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
'๐ป ๊ฐ๋ฐ ์ผ์ง > SpringBoot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Railway๋ก SpringBoot + MySQL + Redis ๋ฐฐํฌํ๊ธฐ (+Dockerfile) (0) | 2025.03.02 |
---|---|
[SpringBoot/Kotlin] SSE ํ์ฉํ AI Streaming Chat ๊ตฌํ (w. React) - (1) ์๋ฒ (1) | 2025.02.11 |
[SpringBoot/Kotlin] Transactional Outbox Pattern ์ ์ฉ (Kafka) (0) | 2025.01.11 |
[SpringBoot3/Kotlin] SNS ๋ก๊ทธ์ธ (Rest API) (0) | 2024.04.26 |
[SpringBoot/Kotlin] Spring Mail ์ฌ์ฉํ์ฌ ๋ฉ์ผ ๋ณด๋ด๊ธฐ (0) | 2024.02.10 |
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
'๐ป ๊ฐ๋ฐ ์ผ์ง > SpringBoot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Railway๋ก SpringBoot + MySQL + Redis ๋ฐฐํฌํ๊ธฐ (+Dockerfile) (0) | 2025.03.02 |
---|---|
[SpringBoot/Kotlin] SSE ํ์ฉํ AI Streaming Chat ๊ตฌํ (w. React) - (1) ์๋ฒ (1) | 2025.02.11 |
[SpringBoot/Kotlin] Transactional Outbox Pattern ์ ์ฉ (Kafka) (0) | 2025.01.11 |
[SpringBoot3/Kotlin] SNS ๋ก๊ทธ์ธ (Rest API) (0) | 2024.04.26 |
[SpringBoot/Kotlin] Spring Mail ์ฌ์ฉํ์ฌ ๋ฉ์ผ ๋ณด๋ด๊ธฐ (0) | 2024.02.10 |