React์ experimental_useSubscription ํ , ์ค์๊ฐ ๋ฐ์ดํฐ ๊ด๋ฆฌ์ ์ด์ , ๋์ ์ด๊ณ ๋ฐ์์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ถ์ ์ํ ์ค์ฉ์ ์ธ ์์ ๋ฅผ ํ์ํด๋ณด์ธ์.
React experimental_useSubscription์ผ๋ก ์ค์๊ฐ ๋ฐ์ดํฐ ์ ๊ธ ํด์ : ์ข ํฉ ๊ฐ์ด๋
๋์์์ด ์งํํ๋ ์น ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ค์๊ฐ ๋ฐ์ดํฐ๋ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ฃผ์ ์์ธ, ์์
๋ฏธ๋์ด ํผ๋, ๊ณต๋ ํธ์ง ๋ฌธ์์ ๊ฐ์ด ๋์ ์ธ ์ ๋ณด๋ฅผ ํ์ํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐ์ดํฐ๋ฅผ ์ํํ๊ฒ ๊ด๋ฆฌํ๊ณ ์
๋ฐ์ดํธํ๊ธฐ ์ํ ํจ์จ์ ์ธ ๋ฉ์ปค๋์ฆ์ด ํ์ํฉ๋๋ค. React์ experimental_useSubscription
ํ
์ ํจ์ํ ์ปดํฌ๋ํธ ๋ด์์ ์ค์๊ฐ ๋ฐ์ดํฐ ๊ตฌ๋
์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ ์๋ฃจ์
์ ์ ๊ณตํฉ๋๋ค.
experimental_useSubscription
์ด๋ ๋ฌด์์ธ๊ฐ?
experimental_useSubscription
์ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์
๋ฐ์ดํธ๋ฅผ ๋ฐ์์ํค๋ ๋ฐ์ดํฐ ์์ค์ ๊ตฌ๋
ํ๋ ๊ณผ์ ์ ๋จ์ํํ๊ธฐ ์ํด ์ค๊ณ๋ React ํ
์
๋๋ค. ํด๋ง์ด๋ ์๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋์ ์์กดํ๋ ์ ํต์ ์ธ ๋ฐ์ดํฐ ํ์นญ ๋ฐฉ๋ฒ๊ณผ ๋ฌ๋ฆฌ, ์ด ํ
์ ๊ตฌ๋
์ ๊ด๋ฆฌํ๊ณ ์ปดํฌ๋ํธ ์ํ๋ฅผ ์๋์ผ๋ก ์
๋ฐ์ดํธํ๋ ์ ์ธ์ ์ด๊ณ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
์ค์ ์ฐธ๊ณ : ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด experimental_useSubscription
์ ์คํ์ ์ธ API์
๋๋ค. ์ด๋ ํฅํ React ๋ฆด๋ฆฌ์ค์์ ๋ณ๊ฒฝ๋๊ฑฐ๋ ์ ๊ฑฐ๋ ์ ์์์ ์๋ฏธํฉ๋๋ค. ์๋นํ ์ด์ ์ ์ ๊ณตํ์ง๋ง, ํ๋ก๋์
ํ๊ฒฝ์ ๋์
ํ๊ธฐ ์ ์ ์์ ์ฑ๊ณผ ์ ์ฌ์ ์ธ ํฅํ ๋ณ๊ฒฝ ์ฌํญ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
experimental_useSubscription
์ฌ์ฉ์ ์ด์
- ์ ์ธ์ ๋ฐ์ดํฐ ๊ด๋ฆฌ: ํ์ํ ๋ฐ์ดํฐ๊ฐ *๋ฌด์*์ธ์ง ์ค๋ช ํ๋ฉด React๊ฐ ๊ตฌ๋ ๋ฐ ์ ๋ฐ์ดํธ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
- ์ต์ ํ๋ ์ฑ๋ฅ: React๋ ๊ตฌ๋ ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ์ต์ํํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
- ๋จ์ํ๋ ์ฝ๋: ์๋ ๊ตฌ๋ ๊ด๋ฆฌ์ ๊ด๋ จ๋ ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋๋ฅผ ์ค์ฌ ์ปดํฌ๋ํธ๋ฅผ ๋ ๊น๋ํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
- ์ํํ ํตํฉ: React์ ์ปดํฌ๋ํธ ์๋ช ์ฃผ๊ธฐ ๋ฐ ๋ค๋ฅธ ํ ๊ณผ ๋ถ๋๋ฝ๊ฒ ํตํฉ๋์ด ์ผ๊ด๋ ๊ฐ๋ฐ ๊ฒฝํ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ์ค์ ์ง์ค์ ๋ก์ง: ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํ ์ ๊ตฌ๋ ๋ก์ง์ ์บก์ํํ์ฌ ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ณ ์ค๋ณต์ ์ค์ ๋๋ค.
experimental_useSubscription
์ ์๋ ๋ฐฉ์
experimental_useSubscription
ํ
์ source ๊ฐ์ฒด์ config ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ๋ฐ์ต๋๋ค. source ๊ฐ์ฒด๋ ๋ฐ์ดํฐ ๊ตฌ๋
๋ฐ ๊ฒ์ ๋ก์ง์ ์ ๊ณตํฉ๋๋ค. config ๊ฐ์ฒด๋ ๊ตฌ๋
๋์์ ์ฌ์ฉ์ ์ ์ํ ์ ์๊ฒ ํฉ๋๋ค. ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋๋ฉด ํ
์ ๋ฐ์ดํฐ ์์ค์ ๊ตฌ๋
ํฉ๋๋ค. ๋ฐ์ดํฐ ์์ค๊ฐ ์
๋ฐ์ดํธ๋ฅผ ๋ฐ์์ํฌ ๋๋ง๋ค ํ
์ ์ต์ ๋ฐ์ดํฐ๋ก ์ปดํฌ๋ํธ์ ๋ฆฌ๋ ๋๋ง์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค.
source
๊ฐ์ฒด
source
๊ฐ์ฒด๋ ๋ค์ ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค:
read(props)
: ์ด ๋ฉ์๋๋ ์ด๊ธฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ๊ตฌ๋ ์ด ์ ๋ฐ์ดํธ๋ ๋๋ง๋ค ํธ์ถ๋ฉ๋๋ค. ๋ฐ์ดํฐ์ ํ์ฌ ๊ฐ์ ๋ฐํํด์ผ ํฉ๋๋ค.subscribe(callback)
: ์ด ๋ฉ์๋๋ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋ ๋ ๊ตฌ๋ ์ ์ค์ ํ๊ธฐ ์ํด ํธ์ถ๋ฉ๋๋ค.callback
์ธ์๋ React๊ฐ ์ ๊ณตํ๋ ํจ์์ ๋๋ค. ๋ฐ์ดํฐ ์์ค๊ฐ ์ ๊ฐ์ ๋ฐ์์ํฌ ๋๋ง๋ค ์ดcallback
์ ํธ์ถํด์ผ ํฉ๋๋ค.
config
๊ฐ์ฒด (์ ํ ์ฌํญ)
config
๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ๋
๋์์ ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค. ๋ค์ ์์ฑ์ ํฌํจํ ์ ์์ต๋๋ค:
getSnapshot(source, props)
: ๋ฐ์ดํฐ์ ์ค๋ ์ท์ ๋ฐํํ๋ ํจ์์ ๋๋ค. ๋์์ฑ ๋ ๋๋ง ์ค์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์source.read(props)
์ ๋๋ค.getServerSnapshot(props)
: ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง ์ค ์๋ฒ์์ ๋ฐ์ดํฐ์ ์ค๋ ์ท์ ๋ฐํํ๋ ํจ์์ ๋๋ค.shouldNotify(oldSnapshot, newSnapshot)
: ์ด์ ์ค๋ ์ท๊ณผ ์ ์ค๋ ์ท์ ๊ธฐ๋ฐ์ผ๋ก ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋์ด์ผ ํ๋์ง ๊ฒฐ์ ํ๋ ํจ์์ ๋๋ค. ์ด๋ฅผ ํตํด ๋ฆฌ๋ ๋๋ง ๋์์ ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์์ต๋๋ค.
์ค์ฉ์ ์ธ ์์
์์ 1: ์ค์๊ฐ ์ฃผ์ ์์ธ ํ์๊ธฐ
์ค์๊ฐ ์ฃผ์ ์์ธ๋ฅผ ํ์ํ๋ ๊ฐ๋จํ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ์ผ์ ํ ๊ฐ๊ฒฉ์ผ๋ก ์ฃผ๊ฐ๋ฅผ ๋ฐ์์ํค๋ ๋ฐ์ดํฐ ์์ค๋ฅผ ์๋ฎฌ๋ ์ด์ ํ ๊ฒ์ ๋๋ค.
๋จผ์ , stockSource
๋ฅผ ์ ์ํด ๋ณด๊ฒ ์ต๋๋ค:
const stockSource = {
read(ticker) {
// API์์ ์ฃผ๊ฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ์๋ฎฌ๋ ์ด์
return getStockPrice(ticker);
},
subscribe(callback) {
const intervalId = setInterval(() => {
callback(); // React์ ๋ฆฌ๋ ๋๋ง ์๋ฆผ
}, 1000); // 1์ด๋ง๋ค ์
๋ฐ์ดํธ
return () => clearInterval(intervalId); // ์ธ๋ง์ดํธ ์ ์ ๋ฆฌ
},
};
// ์ฃผ๊ฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์๋ฎฌ๋ ์ด์
ํ๋ ๋๋ฏธ ํจ์
function getStockPrice(ticker) {
// ์ค์ ์ ํ๋ฆฌ์ผ์ด์
์์๋ ์ค์ API ํธ์ถ๋ก ๋์ฒด
const randomPrice = Math.random() * 100;
return { ticker, price: randomPrice.toFixed(2) };
}
์ด์ experimental_useSubscription
์ ์ฌ์ฉํ์ฌ React ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค:
import { unstable_useSubscription as useSubscription } from 'react';
import { useState } from 'react';
function StockTicker() {
const [ticker, setTicker] = useState('AAPL');
const stockData = useSubscription(stockSource, ticker);
return (
{stockData.ticker}: ${stockData.price}
setTicker(e.target.value)}
/>
);
}
export default StockTicker;
์ด ์์ ์์ StockTicker
์ปดํฌ๋ํธ๋ stockSource
์ ๊ตฌ๋
ํฉ๋๋ค. useSubscription
ํ
์ stockSource
๊ฐ ์๋ก์ด ์ฃผ๊ฐ๋ฅผ ๋ฐ์์ํฌ ๋๋ง๋ค ์ปดํฌ๋ํธ๋ฅผ ์๋์ผ๋ก ์
๋ฐ์ดํธํฉ๋๋ค. ์
๋ ฅ ํ๋๋ฅผ ํตํด ์ฌ์ฉ์๋ ์ถ์ ์ค์ธ ์ฃผ์ ์ข
๋ชฉ ๊ธฐํธ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
์์ 2: ๊ณต๋ ๋ฌธ์ ํธ์ง๊ธฐ
์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๋์์ ๊ฐ์ ๋ฌธ์๋ฅผ ํธ์งํ ์ ์๋ ๊ณต๋ ๋ฌธ์ ํธ์ง๊ธฐ๋ฅผ ์๊ฐํด ๋ด
์๋ค. experimental_useSubscription
์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ํด๋ผ์ด์ธํธ์์ ๋ฌธ์ ๋ด์ฉ์ ๋๊ธฐํ ์ํ๋ก ์ ์งํ ์ ์์ต๋๋ค.
๋จผ์ , ๊ณต์ ๋ฌธ์๋ฅผ ์๋ฎฌ๋ ์ด์
ํ๋ ๋จ์ํ๋ documentSource
๋ฅผ ์ ์ํด ๋ณด๊ฒ ์ต๋๋ค:
const documentSource = {
read(documentId) {
// ์๋ฒ์์ ๋ฌธ์ ๋ด์ฉ์ ๊ฐ์ ธ์ค๋ ๊ฒ์ ์๋ฎฌ๋ ์ด์
return getDocumentContent(documentId);
},
subscribe(callback, documentId) {
// ๋ฌธ์ ์
๋ฐ์ดํธ๋ฅผ ๋ฐ๊ธฐ ์ํ WebSocket ์ฐ๊ฒฐ ์๋ฎฌ๋ ์ด์
const websocket = new WebSocket(`ws://example.com/documents/${documentId}`);
websocket.onmessage = (event) => {
// WebSocket ์ฐ๊ฒฐ์ ํตํด ์ ๋ฒ์ ์ ๋ฌธ์๊ฐ ์์ ๋ ๋
callback(); // React์ ๋ฆฌ๋ ๋๋ง ์๋ฆผ
};
return () => websocket.close(); // ์ธ๋ง์ดํธ ์ ์ ๋ฆฌ
},
};
// ๋ฌธ์ ๋ด์ฉ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์๋ฎฌ๋ ์ด์
ํ๋ ๋๋ฏธ ํจ์
function getDocumentContent(documentId) {
// ์ค์ ์ ํ๋ฆฌ์ผ์ด์
์์๋ ์ค์ API ํธ์ถ๋ก ๋์ฒด
return `๋ฌธ์ ID ${documentId}์ ๋ด์ฉ - ๋ฒ์ : ${Math.random().toFixed(2)}`;
}
์ด์ React ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค:
import { unstable_useSubscription as useSubscription } from 'react';
function DocumentEditor({ documentId }) {
const documentContent = useSubscription(documentSource, documentId);
return (
);
}
export default DocumentEditor;
์ด ์์ ์์ DocumentEditor
์ปดํฌ๋ํธ๋ ์ ๊ณต๋ documentId
๋ฅผ ์ฌ์ฉํ์ฌ documentSource
์ ๊ตฌ๋
ํฉ๋๋ค. ์๋ฎฌ๋ ์ด์
๋ WebSocket ์ฐ๊ฒฐ์ด ์
๋ฐ์ดํธ๋ฅผ ๋ฐ์ ๋๋ง๋ค ์ปดํฌ๋ํธ๋ ์ต์ ๋ฌธ์ ๋ด์ฉ์ผ๋ก ๋ฆฌ๋ ๋๋ง๋ฉ๋๋ค.
์์ 3: Redux ์คํ ์ด์ ํตํฉํ๊ธฐ
experimental_useSubscription
์ Redux ์คํ ์ด์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ตฌ๋
ํ๋ ๋ฐ์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด Redux ์ํ์ ํน์ ๋ถ๋ถ์ด ๋ณ๊ฒฝ๋ ๋ ์ปดํฌ๋ํธ๋ฅผ ํจ์จ์ ์ผ๋ก ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค.
user
์ฌ๋ผ์ด์ค๊ฐ ์๋ Redux ์คํ ์ด๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ด
์๋ค:
// Redux ์คํ ์ด ์ค์ (๊ฐ์ํ)
import { createStore } from 'redux';
const initialState = {
user: {
name: 'John Doe',
isLoggedIn: false,
},
};
function reducer(state = initialState, action) {
switch (action.type) {
case 'UPDATE_USER':
return { ...state, user: { ...state.user, ...action.payload } };
default:
return state;
}
}
const store = createStore(reducer);
์ด์ user
์ฌ๋ผ์ด์ค์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ตฌ๋
ํ๊ธฐ ์ํด userSource
๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค:
const userSource = {
read() {
return store.getState().user;
},
subscribe(callback) {
const unsubscribe = store.subscribe(callback);
return unsubscribe;
},
};
๋ง์ง๋ง์ผ๋ก React ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค:
import { unstable_useSubscription as useSubscription } from 'react';
import { useDispatch } from 'react-redux';
function UserProfile() {
const user = useSubscription(userSource);
const dispatch = useDispatch();
return (
์ด๋ฆ: {user.name}
๋ก๊ทธ์ธ๋จ: {user.isLoggedIn ? '์' : '์๋์'}
);
}
export default UserProfile;
์ด ์์ ์์ UserProfile
์ปดํฌ๋ํธ๋ userSource
์ ๊ตฌ๋
ํฉ๋๋ค. Redux ์คํ ์ด์ user
์ฌ๋ผ์ด์ค๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ปดํฌ๋ํธ๋ ์
๋ฐ์ดํธ๋ ์ฌ์ฉ์ ์ ๋ณด๋ก ๋ฆฌ๋ ๋๋ง๋ฉ๋๋ค.
๊ณ ๊ธ ๊ณ ๋ ค ์ฌํญ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
- ์ค๋ฅ ์ฒ๋ฆฌ: ๋ฐ์ดํฐ ํ์นญ ์ค ๋ฐ์ํ ์ ์๋ ์ ์ฌ์ ์ค๋ฅ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด
source
๊ฐ์ฒด์read
๋ฉ์๋ ๋ด์ ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ๊ตฌํํ์ธ์. - ์ฑ๋ฅ ์ต์ ํ: ๋ฐ์ดํฐ๊ฐ ์ค์ ๋ก ๋ณ๊ฒฝ๋์ง ์์์ ๋ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ๊ธฐ ์ํด
config
๊ฐ์ฒด์shouldNotify
์ต์ ์ ์ฌ์ฉํ์ธ์. ์ด๋ ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ํนํ ์ค์ํฉ๋๋ค. - ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง (SSR): SSR ์ค์ ์๋ฒ์์ ์ด๊ธฐ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก
config
๊ฐ์ฒด์getServerSnapshot
๊ตฌํ์ ์ ๊ณตํ์ธ์. - ๋ฐ์ดํฐ ๋ณํ: ์ปดํฌ๋ํธ์์ ์ฌ์ฉ๋๊ธฐ ์ ์ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฐ๋ฅธ ํ์์ธ์ง ํ์ธํ๊ธฐ ์ํด
read
๋ฉ์๋ ๋ด์์ ๋ฐ์ดํฐ ๋ณํ์ ์ํํ์ธ์. - ๋ฆฌ์์ค ์ ๋ฆฌ: ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด
subscribe
๋ฉ์๋์ ์ ๋ฆฌ ํจ์์์ ๋ฐ์ดํฐ ์์ค๋ก๋ถํฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ๋ ์ ํด์งํด์ผ ํฉ๋๋ค.
๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ
์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ๋์์ผ๋ก ์ค์๊ฐ ๋ฐ์ดํฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋ ๋ค์ ์ฌํญ์ ๊ณ ๋ คํ์ธ์:
- ์๊ฐ๋: ์๊ฐ์ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ํ์ํ ๋ ์๊ฐ๋ ๋ณํ์ ์ ์ ํ๊ฒ ์ฒ๋ฆฌํ์ธ์. ์๋ฅผ ๋ค์ด, ์ฃผ์ ์์ธ ํ์๊ธฐ๋ ์ฌ์ฉ์์ ํ์ง ์๊ฐ๋๋ก ๊ฐ๊ฒฉ์ ํ์ํด์ผ ํฉ๋๋ค.
- ํตํ ๋ณํ: ๊ธ์ต ๋ฐ์ดํฐ๋ฅผ ํ์ํ ๋ ํตํ ๋ณํ ์ต์ ์ ์ ๊ณตํ์ธ์. ์ค์๊ฐ ํ์จ์ ๊ฐ์ ธ์ค๊ธฐ ์ํด ์ ๋ขฐํ ์ ์๋ ํตํ ๋ณํ API ์ฌ์ฉ์ ๊ณ ๋ คํ์ธ์.
- ์ง์ญํ: ์ฌ์ฉ์์ ๋ก์บ์ ๋ฐ๋ผ ๋ ์ง ๋ฐ ์ซ์ ํ์์ ์ง์ญํํ์ธ์.
- ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ: ํนํ ์ธํฐ๋ท ์ฐ๊ฒฐ์ด ๋๋ฆฐ ์ง์ญ์ ์ฌ์ฉ์๋ฅผ ์ํด ์ ์ฌ์ ์ธ ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ ๋ฌธ์ ๋ฅผ ์ธ์งํ์ธ์. ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ๊ธฐ ์ํด ๋๊ด์ ์ ๋ฐ์ดํธ ๋ฐ ์บ์ฑ๊ณผ ๊ฐ์ ๊ธฐ์ ์ ๊ตฌํํ์ธ์.
- ๋ฐ์ดํฐ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ: ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๋ GDPR ๋ฐ CCPA์ ๊ฐ์ ๋ฐ์ดํฐ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ ๊ท์ ์ ์ค์ํด์ผ ํฉ๋๋ค.
experimental_useSubscription
์ ๋์
experimental_useSubscription
์ด ์ค์๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง๋ง, ๋ช ๊ฐ์ง ๋์์ ์ธ ์ ๊ทผ ๋ฐฉ์์ด ์กด์ฌํฉ๋๋ค:
- Context API: Context API๋ ์ฌ๋ฌ ์ปดํฌ๋ํธ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋น๋ฒํ ์
๋ฐ์ดํธ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ๋
experimental_useSubscription
๋งํผ ํจ์จ์ ์ด์ง ์์ ์ ์์ต๋๋ค. - Redux ๋๋ ๊ธฐํ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: Redux ๋ฐ ๊ธฐํ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ์ค์ ์ง์ค์ ์คํ ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ค์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ง๋ง ์ถ๊ฐ์ ์ธ ๋ณต์ก์ฑ์ ์ด๋ํ ์ ์์ต๋๋ค.
- ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ฌ์ฉํ ์ปค์คํ ํ : ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์์ค์ ๊ตฌ๋ ํ๋ ์ปค์คํ ํ ์ ๋ง๋ค ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๊ตฌ๋ ํ๋ก์ธ์ค์ ๋ํ ๋ ๋ง์ ์ ์ด๊ถ์ ์ ๊ณตํ์ง๋ง ๋ ๋ง์ ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋๊ฐ ํ์ํฉ๋๋ค.
๊ฒฐ๋ก
experimental_useSubscription
์ React ์ ํ๋ฆฌ์ผ์ด์
์์ ์ค์๊ฐ ๋ฐ์ดํฐ ๊ตฌ๋
์ ๊ด๋ฆฌํ๋ ๊ฐ๋ ฅํ๊ณ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ ์ธ์ ์ธ ํน์ฑ, ์ต์ ํ๋ ์ฑ๋ฅ, ๊ทธ๋ฆฌ๊ณ React์ ์ปดํฌ๋ํธ ์๋ช
์ฃผ๊ธฐ์์ ์ํํ ํตํฉ์ ๋์ ์ด๊ณ ๋ฐ์์ ์ธ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ์ ์ฉํ ๋๊ตฌ์
๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ์คํ์ ์ธ API์ด๋ฏ๋ก ํ๋ก๋์
ํ๊ฒฝ์ ๋์
ํ๊ธฐ ์ ์ ์์ ์ฑ์ ์ ์คํ๊ฒ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
์ด ๊ฐ์ด๋์์ ์ค๋ช
ํ ์์น๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํดํจ์ผ๋ก์จ experimental_useSubscription
์ ํ์ฉํ์ฌ React ์ ํ๋ฆฌ์ผ์ด์
์์ ์ค์๊ฐ ๋ฐ์ดํฐ์ ์ ์ฌ๋ ฅ์ ์ต๋ํ ๋ฐํํ๊ณ , ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ๋งค๋ ฅ์ ์ด๊ณ ์ ์ตํ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
์ถ๊ฐ ํ์
- React ๊ณต์ ๋ฌธ์:
experimental_useSubscription
์ ๋ํ ์ ๋ฐ์ดํธ๋ ๊ณต์ React ๋ฌธ์๋ฅผ ์ฃผ์ํ์ธ์. - ์ปค๋ฎค๋ํฐ ํฌ๋ผ: ํฌ๋ผ ๋ฐ ํ ๋ก ๊ฒ์ํ์์ React ์ปค๋ฎค๋ํฐ์ ๊ต๋ฅํ์ฌ ์ด ํ ์ ๋ํ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ ๊ฒฝํ์ผ๋ก๋ถํฐ ๋ฐฐ์ฐ์ธ์.
- ์คํ: ๋ฐฐ์ฐ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ง์ ํด๋ณด๋ ๊ฒ์
๋๋ค. ์์ ์ ํ๋ก์ ํธ์์
experimental_useSubscription
์ ์คํํ์ฌ ๊ทธ ๊ธฐ๋ฅ๊ณผ ํ๊ณ์ ๋ํ ๋ ๊น์ ์ดํด๋ฅผ ์ป์ผ์ธ์.