๐ Chapter 7: ๋ฆฌ์กํธ ๋์์ฑ
๋๊ธฐ์ ๋ ๋๋ง์ ๋ฌธ์ โ
๊ฐ๋จํ ๋งํด ๋๊ธฐ์ ๋ ๋๋ง์ ๋ฌธ์ ๋ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ๊ฐ๋ก๋ง์์ ์ฌ์ฉ์ ๊ฒฝํ์ด ์ ํ๋๋ค๋ ๊ฒ์ ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋๋ฆฌ ์ฌ์ฉ๋๋ ๊ฒ ํ๋๋ ์ฌ๋ฌ ์ ๋ฐ์ดํธ๋ฅผ ์ผ๊ด ์ฒ๋ฆฌํด์ ๋ฉ์ธ ์ค๋ ๋์์ ์ํ๋๋ ์์ ์ ์ต์ํํ๋ ๊ฒ์ ๋๋ค.
์ค๊ณ ์ธก๋ฉด์์ ๋๊ธฐ์ ๋ ๋๋ง์๋ ์ฐ์ ์์๋ผ๋ ๊ฐ๋ ์ด ์์ต๋๋ค. ๊ทธ๋์ ์ผ๊ด ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํด ๋ดค์ ๋ฌธ์ ๊ฐ ๋ ๋ณต์กํด์ง ๋ฟ์ ๋๋ค. ๋๊ธฐ์ ๋ ๋๋ง์ ๋ชจ๋ ์ ๋ฐ์ดํธ๋ฅผ ๋์ผํ๊ฒ ์ทจ๊ธํ๊ณ , ์ ๋ฐ์ดํธ๊ฐ ์ฌ์ฉ์์๊ฒ ๋ณด์ด๋์ง ์ฌ๋ถ๋ฅผ ๋ฐ์ง์ง ์์ต๋๋ค.
๋ฆฌ์กํธ๋ ๋์์ฑ ๋ ๋๋ง(concurrent rendering)์ ์ฌ์ฉํด ์ ๋ฐ์ดํธ ์์ ์ ์ค์๋์ ๊ธด๊ธ๋์ ๋ฐ๋ผ ์ฐ์ ์์๋ฅผ ์ ํ๊ณ , ์ค์ํ ์ ๋ฐ์ดํธ๊ฐ ๋ ์ค์ํ ์ ๋ฐ์ดํธ ๋๋ฌธ์ ๊ฐ๋ก๋ง์ง ์๋๋ก ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฆฌ์กํธ๋ ๋ง์ ์์ ๋์๋ ๋ถ๊ตฌํ๊ณ UI์ ์๋ต์ฑ์ ์ ์งํ๊ณ , ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
ํ์ด๋ฒ ๋ค์ ๋ณด๊ธฐโ
ํ์ด๋ฒ ์ฌ์กฐ์ ์๋ ๋ ๋๋ง ํ๋ก์ธ์ค๋ฅผ ํ์ด๋ฒ๋ผ๊ณ ํ๋ ๋ ์๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์์ ๋จ์๋ก ๋ถํ ํด ์ฒ๋ฆฌํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฆฌ์กํธ๋ ํ์ด๋ฒ ๋ฅผ ํ์ฉํด์ ๋ ๋๋ง ์์ ์ ์ผ์์ ์ผ๋ก ์ค์งํ๊ฑฐ๋ ์ฌ๊ฐํ๊ฑฐ๋ ์ฐ์ ์์๋ฅผ ์ค์ ํด ์ค์๋์ ๋ฐ๋ผ ์ ๋ฐ์ดํธ๋ฅผ ์ง์ฐํ๊ฑฐ๋ ์์ฝํฉ๋๋ค. ๋๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ต์ฑ์ด ํฅ์๋๊ณ ๋ ์ค์ํ ์์ ์ด ๋ ์ค์ํ ์ ๋ฐ์ดํธ๋ฅผ ๊ฐ๋ก๋ง๋ ์ผ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
์ ๋ฐ์ดํธ ์์ฝ๊ณผ ์ง์ฐโ
์๋ฒ์์ ์ ๋ฉ์์ง๊ฐ ๋์ฐฉํด ์ด๋ฅผ ๋ ๋๋งํด์ผ ํ ๋, ๋ฆฌ์กํธ๋ ๋ ๋ ๋ ์ธ์ ํตํด ๋ ๋๋งํ๋๋ฐ ์ด ๋ ์ธ์ ๋๊ธฐ์์ผ๋ก DOM์ ์
๋ฐ์ดํธํฉ๋๋ค. ๋ค์ ๋งํด ๋ค๋ฅธ ์
๋ฐ์ดํธ๋ฅผ ๊ฐ๋ก๋ง๊ฒ ๋๋ฏ๋ก ์ฌ์ฉ์ ์
๋ ฅ์ ์ง์ฐ์ด ๋ฐ์ํฉ๋๋ค. ์ ๋ฉ์์ง ๋ชฉ๋ก์ ๋ ๋๋งํ๋ ์์
์ ์ฐ์ ์์๋ฅผ ๋ฎ์ถ๋ ค๋ฉด, ๊ด๋ จ ์ํ ์
๋ฐ์ดํธ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด useTransition
ํ
์ด startTransition
ํจ์๋ก ๊ฐ์ธ๋ฉด ๋ฉ๋๋ค.
const ChatApp = () => {
const [messages, setMessages] = useState([]);
const [isPending, startTransition] = useTransition();
useEffect(() => {
const socket = new WebSocket("wss://your-websocket-server.com");
socket.onmessage = (event) => {
startTransition(() => {
setMessages((prevMessages) => [...prevMessages, event.data]);
});
};
return () => {
socket.close();
};
}, []);
const sendMessage = (message) => {
// ๋ฉ์์ง๋ฅผ ์๋ฒ๋ก ์ ์ก
}
return (
<div>
<MessageList messages={messages} />
<MessageInput onSubmit={sendMessage} />
</div>
);
};
์ด๋ฅผ ํตํด ๋ฆฌ์กํธ๋ ๋ฉ์์ง ๋ชฉ๋ก ์ ๋ฐ์ดํธ๋ฅผ ๋ฎ์ ์ฐ์ ์์๋ก ์์ฝํด์ UI๋ฅผ ๊ฐ๋ก๋ง์ง ์๊ณ ๋ ๋๋งํ๋๋ก ์ค์ ํฉ๋๋ค. ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐฉํด๋ฐ์ง ์๊ณ , ์์ ๋๋ ๋ฉ์์ง๋ ์ฌ์ฉ์ ์ํธ ์์ฉ๋ณด๋ค ๋ฎ์ ์ฐ์ ์์๋ก ์ฒ๋ฆฌ๋๋ฏ๋ก ์ฌ์ฉ์ ๊ฒฝํ์ ํฐ ์ง์ฅ์ ์ฃผ์ง ์์ต๋๋ค.
๋ ๊น์ด ๋ค์ด๊ฐ๊ธฐโ
์ค์ผ์ค๋ฌโ
๋ฆฌ์กํธ๋ ์ฌ์กฐ์ ์ ๋ด์์ ์ด ์ค์ผ์ค๋ฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ค์ผ์ค๋ฌ์ ์ฌ์กฐ์ ์๋ ๋ ๋ ๋ ์ธ์ ํตํด ์์ ์ ๊ธด๊ธ๋์ ๋ฐ๋ผ ์ฐ์ ์์๋ฅผ ์ค์ ํ๊ณ ์ ๋ฆฌํด ์ฌ๋ฌ ์์ ์ด ํ๋ ฅํ๋๋ก ํฉ๋๋ค. ์ค๋๋ ๋ฆฌ์กํธ์์ ์ค์ผ์ค๋ฌ์ ์ฃผ๋ ๊ธฐ๋ฅ์ ๋ง์ดํฌ๋กํ์คํฌ๋ฅผ ์์ฝํด์ ๋ฉ์ธ ์ค๋ ๋์ ์ ์ด๋ฅผ ๊ด๋ฆฌํ๊ณ ์ํํ ์คํ์ ๋ณด์ฅํ๋ ๊ฒ์ ๋๋ค.
๋ง์ดํฌ๋กํ์คํฌ: ์๋ฐ์คํฌ๋ฆฝํธ์ ์ด๋ฒคํธ ๋ฃจํ์์ ์ฒ๋ฆฌ๋๋ ์์ ์ข ๋ฅ์ ํ๋๋ก, ํ์ฌ ์คํ ์ค์ธ ์์ ์ด ์๋ฃ๋ ํ ๋ฐ๋ก ์คํ๋๋ ์์ ์ ๋๋ค. ๋ง์ดํฌ๋กํ์คํฌ ํ๋ก ๊ด๋ฆฌ๋ฉ๋๋ค.
์ค์ผ์ค๋ฌ๋ ์ด๋ฆ ๊ทธ๋๋ก ํจ์๊ฐ ์์ฐ ๋ ์ธ์ ๋ฐ๋ผ ํจ์๋ฅผ ์คํํ๋๋ก ์์ฝํ๋ ์์คํ ์ ๋๋ค.
๋ ๋ ๋ ์ธโ
๋ ๋ ๋ ์ธ์ ๋ฆฌ์กํธ์ ์์ฝ ์์คํ ์์ ์ค์ํ ์์๋ก, ์์ ์ ๋ ๋๋ง๊ณผ ์ฐ์ ์์ ๊ด๋ฆฌ๋ฅผ ํจ์จํํฉ๋๋ค. ๋ ์ธ์ ์ฐ์ ์์ ์์ค์ ๋ํ๋ด๋ ๋จ์๋ก, ๋ฆฌ์กํธ๊ฐ ๋ ๋๋ง ์ฃผ๊ธฐ์์ ์ฒ๋ฆฌํ ์ ์๋ ์์ ์ ์๋ฏธํฉ๋๋ค.
๋ ๋ ๋ ์ธ์ ๋ฆฌ์กํธ๊ฐ ๋ ๋๋ง ๊ณผ์ ์์ ํ์ํ ์
๋ฐ์ดํธ๋ฅผ ๊ตฌ์ฑํ๊ณ ์ฐ์ ์์๋ฅผ ์ค์ ํ๋ ๋ฐ ์ฌ์ฉํ๋ ๊ฐ๋ฒผ์ด ์ถ์ํ์
๋๋ค.
์๋ฅผ ๋ค์ด setState
๋ฅผ ํธ ์ถํ๋ฉด ํด๋น ์
๋ฐ์ดํธ๊ฐ ๋ ์ธ์ผ๋ก ๋ณด๋ด์ง๋๋ค. ๋ค์ํ ์
๋ฐ์ดํธ์ ์ฐ์ ์์๋ ์
๋ฐ์ดํธ๊ฐ ๋ฐ์ํ๋ ์ฝํ
์คํธ์ ๋ฐ๋ผ ๋ฌ๋ฆฌ ์ดํดํ๋ฉด ๋ฉ๋๋ค.
setState
๊ฐ ํด๋ฆญ ํธ๋ค๋ฌ ๋ด๋ถ์์ ํธ์ถ๋๋ฉด, ํด๋น ์ ๋ฐ์ดํธ๋Sync
๋ ์ธ(์ฐ์ ์์ ๊ฐ์ฅ ๋์)์ ๋ฐฐ์ข ๋๋ฉฐ, ๋ง์ดํฌ๋กํ์คํฌ๋ก ์์ฝ๋ฉ๋๋ค.setState
๊ฐstartTransition
์ ํธ๋์ง์ ๋ด์์ ํธ์ถ๋๋ฉด ํธ๋์ง์ ๋ ์ธ(์ฐ์ ์์๊ฐ ๋ฎ์)์ ๋ฐฐ์น๋๊ณ ๋ง์ดํฌ๋กํ์คํฌ๋ก ์์ฝ๋ฉ๋๋ค.
๊ฐ ๋ ์ธ์ ๊ฐ๊ธฐ ๋ค๋ฅธ ์ฐ์ ์์์ ๋์ํ๋ฉฐ, ์ฐ์ ์์๊ฐ ๋์ ๋ ์ธ์ ์ฐ์ ์์๊ฐ ๋ฎ์ ๋ ์ธ๋ณด๋ค ๋จผ์ ์ฒ๋ฆฌ๋ฉ๋๋ค.
๋ ๋ ๋ ์ธ ์๋ ๋ฐฉ์โ
์ปดํฌ๋ํธ๊ฐ ์
๋ฐ์ดํธ๋๊ฑฐ๋ ์ ์ปดํฌ๋ํธ๊ฐ ๋ ๋ ํธ๋ฆฌ์ ์ถ๊ฐ๋๋ฉด, ๋ฆฌ์กํธ๋ ํด๋น ์
๋ฐ์ดํธ์ ์ฐ์ ์์์ ๋ฐ๋ผ ์์ ์ค๋ช
ํ ๋ ์ธ์ ํ ๋นํฉ๋๋ค. ์ฐ์ ์์์ ์
๋ฐ์ดํธ ์ข
๋ฅ(์ฌ์ฉ์ ์ํธ ์์ฉ, ๋ฐ์ดํฐ ํจ์น, ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
๋ฑ)์ ์ปดํฌ๋ํธ ๊ฐ์์ฑ ๊ฐ์ ์์ธ์ ๋ฐ๋ผ ์ ํด์ง๋๋ค.
์ดํ ๋ฆฌ์กํธ๋ ๋ค์ ๋ฐฉ์์ผ๋ก ๋ ๋ ๋ ์ธ์ ์ฌ์ฉํด ์
๋ฐ์ดํธ๋ฅผ ์์ฝํ๊ณ ์ฐ์ ์์๋ฅผ ์ ํฉ๋๋ค.
- ์
๋ฐ์ดํธ ์์ง
- ๋ง์ง๋ง ๋ ๋๋ง ์ดํ์ ์์ฝ๋ ๋ชจ๋ ์ ๋ฐ์ดํธ๋ฅผ ์์งํด์ ์ฐ์ ์์์ ๋ฐ๋ผ ๊ฐ ๋ ์ธ์ ํ ๋นํฉ๋๋ค.
- ๋ ์ธ ์ฒ๋ฆฌ
- ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋์ ๋ ์ธ๋ถํฐ ์์ํด ๊ฐ ๋ ์ธ์ ์๋ ์ ๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ๊ฐ ๋ ์ธ์ ์ ๋ฐ์ดํธ๋ ํ๊บผ๋ฒ์ ์ผ๊ด ์ฒ๋ฆฌํฉ๋๋ค.
- ์ปค๋ฐ ๋จ๊ณ