React์ ์คํ์ API์ธ experimental_LegacyHidden์ ํตํด ๋ ๊ฑฐ์ ์ปดํฌ๋ํธ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์. ์ค์ ์์ ๋ฅผ ํตํด ์ฌ์ฉ๋ฒ, ์ฅ์ , ํ๊ณ๋ฅผ ํ์ตํฉ๋๋ค.
React experimental_LegacyHidden ํํค์น๊ธฐ: ๊ฐ๋ฐ์๋ฅผ ์ํ ์ข ํฉ ๊ฐ์ด๋
React๋ ๊ฐ๋ฐ์ ๊ฒฝํ๊ณผ ์ ํ๋ฆฌ์ผ์ด์
์ฑ๋ฅ ํฅ์์ ๋ชฉํ๋ก ํ๋ ์๋ก์ด ๊ธฐ๋ฅ๊ณผ API๋ฅผ ๋์
ํ๋ฉฐ ๋์์์ด ์งํํ๊ณ ์์ต๋๋ค. ์ด๋ฌํ ์คํ์ API ์ค ํ๋๊ฐ ๋ฐ๋ก experimental_LegacyHidden์ผ๋ก, ๊ฐ๋ฐ์๊ฐ ์ต์ React ์ ํ๋ฆฌ์ผ์ด์
์์ ๋ ๊ฑฐ์ ์ปดํฌ๋ํธ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ ์ง์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ ์ ์๋๋ก ๋๊ธฐ ์ํด ์ค๊ณ๋์์ต๋๋ค. ์ด ๊ฐ์ด๋๋ experimental_LegacyHidden์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์, ์ฅ์ , ์ฌ์ฉ ๋ฐฉ๋ฒ ๋ฐ ํ๊ณ๋ฅผ ์ ๊ณตํฉ๋๋ค.
experimental_LegacyHidden์ด๋ ๋ฌด์์ธ๊ฐ์?
experimental_LegacyHidden์ ์ฃผ๋ก ์๋ก์ด React ํจํด์ด๋ ๋ฒ์ ์ผ๋ก ์ ์ง์ ๋ง์ด๊ทธ๋ ์ด์
์ ์งํํ๋ ๋์ ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ ๊ฑฐ์ ์ปดํฌ๋ํธ๋ฅผ ์จ๊ธฐ๊ฑฐ๋ ํ์ํ ์ ์๊ฒ ํด์ฃผ๋ React ์ปดํฌ๋ํธ์
๋๋ค. ์ฃผ์ ์ฌ์ฉ ์ฌ๋ก๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ฐฉํดํ์ง ์์ผ๋ฉด์ ์ค๋๋๊ณ ์ฑ๋ฅ์ด ๋จ์ด์ง ์ ์๋ ์ฝ๋๋ฅผ ๋ ์๋กญ๊ณ ์ต์ ํ๋ ๊ตฌํ์ผ๋ก ์ํํ๊ฒ ์ ํํ๋ ๊ฒ์
๋๋ค.
๋ ๊ฑฐ์ ์ฝ๋์ ๊ฐ์์ฑ์ ์ ์ดํ๋ ๊ฒ์ดํธํคํผ๋ผ๊ณ ์๊ฐํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์๋ก์ด ๊ธฐ๋ฅ์ ์ ์ง์ ์ผ๋ก ์ถ์ํ๊ณ ์ค๋๋ ๊ธฐ๋ฅ์ ์ ์ฐจ ์ฌ์ฉ ์ค๋จํ์ฌ ์ฌ์ฉ์๋ค์ด ์ํํ๊ฒ ์ ํํ ์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
์ experimental_LegacyHidden์ ์ฌ์ฉํด์ผ ํ ๊น์?
React ํ๋ก์ ํธ์์ experimental_LegacyHidden ์ฌ์ฉ์ ๊ณ ๋ คํด์ผ ํ ๋ช ๊ฐ์ง ๊ฐ๋ ฅํ ์ด์ ๊ฐ ์์ต๋๋ค:
- ์ ์ง์ ๋ง์ด๊ทธ๋ ์ด์ : ๋ ๊ฑฐ์ ์ปดํฌ๋ํธ๋ฅผ ํจ์ํ ์ปดํฌ๋ํธ, ํ , ๋์์ฑ ๋ ๋๋ง๊ณผ ๊ฐ์ ์๋ก์ด React ๊ธฐ๋ฅ์ผ๋ก ์ ์ง์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๊ฒ์ ์ฉ์ดํ๊ฒ ํฉ๋๋ค. ์ด๋ ๋ธ๋ ์ดํน ์ฒด์ธ์ง๋ฅผ ๋์ ํ ์ํ์ ์ค์ด๊ณ ๋ฐ๋ณต์ ์ธ ๊ฐ์ ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ์ฑ๋ฅ ์ต์ ํ: ๋ ๊ฑฐ์ ์ปดํฌ๋ํธ๋ ์ต์ React ๋ ๋๋ง ํจํด์ ์ต์ ํ๋์ด ์์ง ์์ ์ ์์ต๋๋ค. ํ์ํ์ง ์์ ๋ ์จ๊ธฐ๋ฉด ํนํ ์ด๊ธฐ ๋ก๋ฉ ๋ฐ ํ์ ์ ๋ฐ์ดํธ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ๋ณต์ก์ฑ ๊ฐ์: ๋ ๊ฑฐ์ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฆฌํจ์ผ๋ก์จ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋จ์ํํ๊ณ ์ ์ง๋ณด์ ๋ฐ ๋ฆฌํฉํ ๋ง์ ๋ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
- ์คํ: ์ ํ๋ฆฌ์ผ์ด์
์ ๊ธฐ์กด ๊ธฐ๋ฅ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์๋ก์ด ๊ธฐ๋ฅ๊ณผ ๋์์ธ์ ์คํํ ์ ์์ต๋๋ค.
experimental_LegacyHidden์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๊ฑฐ์ ๊ตฌํ๊ณผ ์ ๊ตฌํ ์ฌ์ด๋ฅผ ์ฝ๊ฒ ์ ํํ ์ ์์ต๋๋ค. - ์ฌ์ฉ์ ๊ฒฝํ ๊ฐ์ : ์ํํ๊ณ ์ ์ง์ ์ธ ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ผ๋ก ์ด์ด์ง๋๋ค. ์ฌ์ฉ์๋ ์ ํ ๊ณผ์ ์์ ๋ฒ๊ทธ๋ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ๊ฒช์ ๊ฐ๋ฅ์ฑ์ด ์ค์ด๋ญ๋๋ค.
experimental_LegacyHidden ์ฌ์ฉ ๋ฐฉ๋ฒ
experimental_LegacyHidden ์ฌ์ฉ์ ๋น๊ต์ ๊ฐ๋จํฉ๋๋ค. ๋ค์์ ๊ธฐ๋ณธ์ ์ธ ์์ ์
๋๋ค:
๊ธฐ๋ณธ ๊ตฌํ
๋จผ์ , react์์ experimental_LegacyHidden ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ธ์์ผ ํฉ๋๋ค. ์ด๋ ์คํ์ API์ด๋ฏ๋ก React ์ค์ (์: webpack.config.js ๋๋ .babelrc ํ์ผ)์์ ์คํ์ ๊ธฐ๋ฅ์ ํ์ฑํํด์ผ ํ ์๋ ์์ต๋๋ค.
experimental_LegacyHidden์ unstable_hidden์ด๋ผ๋ ๋จ์ผ prop์ ๋ฐ์ต๋๋ค. ์ด prop์ ์ปดํฌ๋ํธ์ ์์๋ค์ ์จ๊ธธ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ๋ถ๋ฆฌ์ธ ๊ฐ์
๋๋ค. unstable_hidden์ด true์ด๋ฉด ์์๋ค์ด ์จ๊ฒจ์ง๊ณ , false์ด๋ฉด ๋ณด์ด๊ฒ ๋ฉ๋๋ค.
import React from 'react';
import { unstable_LegacyHidden as LegacyHidden } from 'react';
function MyComponent() {
const [showLegacy, setShowLegacy] = React.useState(false);
return (
);
}
function LegacyComponent() {
return ์ด๊ฒ์ ๋ ๊ฑฐ์ ์ปดํฌ๋ํธ์
๋๋ค.
;
}
export default MyComponent;
์ด ์์ ์์ LegacyComponent๋ LegacyHidden์ผ๋ก ๊ฐ์ธ์ ธ ์์ต๋๋ค. unstable_hidden prop์ ๋ฒํผ ํด๋ฆญ์ผ๋ก ํ ๊ธ๋๋ showLegacy ์ํ ๋ณ์์ ์ํด ์ ์ด๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ ๊ฑฐ์ ์ปดํฌ๋ํธ๋ฅผ ๋์ ์ผ๋ก ํ์ํ๊ฑฐ๋ ์จ๊ธธ ์ ์์ต๋๋ค.
์กฐ๊ฑด๋ถ ๋ ๋๋ง
๋ ๋ณต์กํ ๋ก์ง์ ์ฌ์ฉํ์ฌ ๋ ๊ฑฐ์ ์ปดํฌ๋ํธ๋ฅผ ์ธ์ ์จ๊ธฐ๊ฑฐ๋ ํ์ํ ์ง ๊ฒฐ์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ , ๊ธฐ๊ธฐ ๋๋ ๊ธฐ๋ฅ ํ๋๊ทธ์ ๋ฐ๋ผ ์จ๊ธฐ๊ณ ์ถ์ ์ ์์ต๋๋ค.
import React from 'react';
import { unstable_LegacyHidden as LegacyHidden } from 'react';
function MyComponent() {
const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);
return (
{isMobile ? (
) : (
)}
);
}
function LegacyComponent() {
return ์ด๊ฒ์ ๋ฐ์คํฌํฑ์ฉ ๋ ๊ฑฐ์ ์ปดํฌ๋ํธ์
๋๋ค.
;
}
function NewMobileComponent() {
return ์ด๊ฒ์ ๋ชจ๋ฐ์ผ์ ์ต์ ํ๋ ์๋ก์ด ์ปดํฌ๋ํธ์
๋๋ค.
;
}
export default MyComponent;
์ด ์์ ์์ LegacyComponent๋ ๋ฐ์คํฌํฑ ๊ธฐ๊ธฐ์์๋ง ํ์๋ฉ๋๋ค. ๋ชจ๋ฐ์ผ ์ฌ์ฉ์๋ ๋์ NewMobileComponent๋ฅผ ๋ณด๊ฒ ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ ๊ฑฐ์ ์ฝ๋์์ ์ ์ง์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๋ฉด์ ๊ธฐ๊ธฐ๋ณ๋ก ๋ง์ถคํ๋ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
๊ธฐ๋ฅ ํ๋๊ทธ์ ํตํฉ
๊ธฐ๋ฅ ํ๋๊ทธ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ์๋ฅผ ๊ด๋ฆฌํ๊ณ ์ ์ดํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์
๋๋ค. experimental_LegacyHidden๊ณผ ํจ๊ป ์ฌ์ฉํ์ฌ ์๋ก์ด ์ปดํฌ๋ํธ๋ฅผ ์ ์ง์ ์ผ๋ก ๋์
ํ๊ณ ์ค๋๋ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉ ์ค๋จํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, useNewSearch๋ผ๋ ๊ธฐ๋ฅ ํ๋๊ทธ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์ด ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ฒ์ ์ปดํฌ๋ํธ๋ฅผ ํ์ํ ์ง ์๋๋ฉด ๋ ๊ฑฐ์ ๊ฒ์ ์ปดํฌ๋ํธ๋ฅผ ํ์ํ ์ง ๊ฒฐ์ ํ ์ ์์ต๋๋ค.
import React from 'react';
import { unstable_LegacyHidden as LegacyHidden } from 'react';
// ๊ธฐ๋ฅ ํ๋๊ทธ ๊ฐ์ ๊ฐ์ ธ์ค๋ ํจ์๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค
function useFeatureFlag(flagName) {
// ์ด๊ฒ์ ํ๋ ์ด์คํ๋์ด๋ฉฐ, ์ค์ ์ ํ๋ฆฌ์ผ์ด์
์์๋ LaunchDarkly, Split.io ๋ฑ๊ณผ ๊ฐ์
// ์ ์ ํ ๊ธฐ๋ฅ ํ๋๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
const [flagValue, setFlagValue] = React.useState(false);
React.useEffect(() => {
// API ๋๋ localStorage์์ ๊ธฐ๋ฅ ํ๋๊ทธ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ์๋ฎฌ๋ ์ด์
ํฉ๋๋ค
setTimeout(() => {
const value = localStorage.getItem(flagName) === 'true';
setFlagValue(value);
}, 500);
}, [flagName]);
return flagValue;
}
function MyComponent() {
const useNewSearch = useFeatureFlag('useNewSearch');
return (
{useNewSearch ? (
) : (
)}
);
}
function LegacySearchComponent() {
return ์ด๊ฒ์ ๋ ๊ฑฐ์ ๊ฒ์ ์ปดํฌ๋ํธ์
๋๋ค.
;
}
function NewSearchComponent() {
return ์ด๊ฒ์ ์๋ก์ด ๊ฒ์ ์ปดํฌ๋ํธ์
๋๋ค.
;
}
export default MyComponent;
์ด ์์ ์์ useFeatureFlag ํ
์ useNewSearch ๊ธฐ๋ฅ ํ๋๊ทธ์ ๊ฐ์ ๊ฒ์ํฉ๋๋ค. ํ๋๊ทธ๊ฐ ํ์ฑํ๋๋ฉด NewSearchComponent๊ฐ ํ์๋๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด LegacyHidden์ผ๋ก ๊ฐ์ธ์ธ LegacySearchComponent๊ฐ ํ์๋ฉ๋๋ค. ์ด๊ธฐ์ `useFeatureFlag`๋ ๋ก์ปฌ ์คํ ๋ฆฌ์ง์์ ์ํ๋ฅผ ์ฝ์ด ๊ธฐ๋ฅ ํ๋๊ทธ ์๋น์ค๋ฅผ ์๋ฎฌ๋ ์ด์
ํฉ๋๋ค.
experimental_LegacyHidden ์ฌ์ฉ์ ์ด์
experimental_LegacyHidden ์ฌ์ฉ์ ์ด์ ์ ํนํ ํฌ๊ณ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ค๋ฃฐ ๋ ์๋นํฉ๋๋ค:
- ๋จ์ํ๋ ์ฝ๋๋ฒ ์ด์ค: ๋ ๊ฑฐ์ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฆฌํจ์ผ๋ก์จ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ณ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ ๊ฐ๋ฐ์์ ์ธ์ง ๋ถํ๋ฅผ ์ค์ด๊ณ ์๋ก์ด ๊ธฐ๋ฅ๊ณผ ๋ฒ๊ทธ ์์ ์ ๋ ์ฝ๊ฒ ๋์ ํ ์ ์๋๋ก ํฉ๋๋ค.
- ์ฑ๋ฅ ํฅ์: ํ์ํ์ง ์์ ๋ ๋ ๊ฑฐ์ ์ปดํฌ๋ํธ๋ฅผ ์จ๊ธฐ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํฌ๊ฒ ์์กดํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํนํ ์ค์ํฉ๋๋ค.
- ์ํ ๊ฐ์: ์ ์ง์ ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ธ๋ ์ดํน ์ฒด์ธ์ง๋ฅผ ๋์ ํ ์ํ์ ์ค์ ๋๋ค. ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ์ถ์ํ๊ธฐ ์ ์ ์ ์ด๋ ํ๊ฒฝ์์ ์๋ก์ด ๊ธฐ๋ฅ๊ณผ ์ปดํฌ๋ํธ๋ฅผ ํ ์คํธํ ์ ์์ต๋๋ค.
- ํฅ์๋ ๊ฐ๋ฐ์ ๊ฒฝํ: ๊ฐ๋ฐ์๋ ๋ ๊ฑฐ์ ์ฝ๋๋ฒ ์ด์ค์ ๋ณต์ก์ฑ์ ์ฝ๋งค์ด์ง ์๊ณ ์๋ก์ด ๊ธฐ๋ฅ์ ์ง์คํ ์ ์์ต๋๋ค. ์ด๋ ์์ฐ์ฑ๊ณผ ์ง์ ๋ง์กฑ๋๋ฅผ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ: ์ํํ๊ณ ์ ์ง์ ์ธ ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ผ๋ก ์ด์ด์ง๋๋ค. ์ฌ์ฉ์๋ ์ ํ ๊ณผ์ ์์ ๋ฒ๊ทธ๋ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ๊ฒช์ ๊ฐ๋ฅ์ฑ์ด ์ค์ด๋ญ๋๋ค.
์ ํ ์ฌํญ ๋ฐ ๊ณ ๋ ค ์ฌํญ
experimental_LegacyHidden์ ์ฌ๋ฌ ์ด์ ์ ์ ๊ณตํ์ง๋ง, ๊ทธ ํ๊ณ์ ์ ์ฌ์ ์ธ ๋จ์ ์ ์ธ์งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
- ์คํ์ API: ์คํ์ API๋ก์
experimental_LegacyHidden์ ํฅํ React ๋ฒ์ ์์ ๋ณ๊ฒฝ๋๊ฑฐ๋ ์ ๊ฑฐ๋ ์ ์์ต๋๋ค. ์ด๋ ์ฃผ์ํด์ ์ฌ์ฉํด์ผ ํ๋ฉฐ ํ์ํ ๊ฒฝ์ฐ ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธํ ์ค๋น๊ฐ ๋์ด ์์ด์ผ ํจ์ ์๋ฏธํฉ๋๋ค. - ๋ณต์ก์ฑ ์ฆ๊ฐ ๊ฐ๋ฅ์ฑ: ์ ์คํ๊ฒ ์ฌ์ฉํ์ง ์์ผ๋ฉด
experimental_LegacyHidden์ด ์ฝ๋๋ฒ ์ด์ค์ ๋ณต์ก์ฑ์ ๋ํ ์ ์์ต๋๋ค. ์ปดํฌ๋ํธ๋ฅผ ์จ๊ธฐ๊ณ ํ์ํ๋ ๋ก์ง์ด ์ ์ ์๋๊ณ ์ดํดํ๊ธฐ ์ฌ์ด์ง ํ์ธํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. - ๋ฆฌํฉํ ๋ง์ ๋์ฒด์ฌ๊ฐ ์๋:
experimental_LegacyHidden์ ๋ฆฌํฉํ ๋ง์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ด๋ ์๋ก์ด React ํจํด ๋ฐ ๋ฒ์ ์ผ๋ก์ ์ ์ง์ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ฉ์ดํ๊ฒ ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์์ ํด๊ฒฐ์ฑ ์ ๋๋ค. ๊ฒฐ๊ตญ์๋ ๋ ๊ฑฐ์ ์ฝ๋๋ฅผ ์์ ํ ์ ๊ฑฐํ๋ ๊ฒ์ ๋ชฉํ๋ก ํด์ผ ํฉ๋๋ค. - ์ค๋ฒํค๋: ์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋ณ์ง๋ง
experimental_LegacyHidden์ ์ฌ์ฉํ๋ ๋ฐ์๋ ์ฝ๊ฐ์ ์ค๋ฒํค๋๊ฐ ์์ต๋๋ค. ์ด ์ค๋ฒํค๋๋ ๋ณดํต ๋ฌด์ํ ์ ์๋ ์์ค์ด์ง๋ง, ํนํ ์ฑ๋ฅ์ด ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ด๋ฅผ ์ธ์งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. - ๋๋ฒ๊น
:
experimental_LegacyHidden์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ ์คํ์ง ์์ผ๋ฉด ๋๋ฒ๊น ์ด ๋ ๋ณต์กํด์ง ์ ์์ต๋๋ค. ์ด๋ค ์ปดํฌ๋ํธ๊ฐ ์ค์ ๋ก ๋ ๋๋ง๋๊ณ ์๋์ง ํ์ธํ๊ธฐ ์ํด ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๊ฑฐ๋ React ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
experimental_LegacyHidden ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
experimental_LegacyHidden์ ์ด์ ์ ๊ทน๋ํํ๊ณ ์ํ์ ์ต์ํํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด์ญ์์ค:
- ์ ๋ต์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ: ์ ๋ง ํ์ํ ๋๋ง
experimental_LegacyHidden์ ์ฌ์ฉํ์ญ์์ค. ์์๋ฅผ ์จ๊ธฐ๊ณ ํ์ํ๊ธฐ ์ํ ๋ฒ์ฉ ์ปดํฌ๋ํธ๋ก ์ฌ์ฉํ์ง ๋ง์ญ์์ค. - ๋จ์ํ๊ฒ ์ ์งํ๊ธฐ: ์ปดํฌ๋ํธ๋ฅผ ์จ๊ธฐ๊ณ ํ์ํ๋ ๋ก์ง์ ๊ฐ๋จํ๊ณ ์ดํดํ๊ธฐ ์ฌ์์ผ ํฉ๋๋ค. ๋ณต์กํ ์กฐ๊ฑด๊ณผ ์ค์ฒฉ๋
experimental_LegacyHidden์ปดํฌ๋ํธ๋ฅผ ํผํ์ญ์์ค. - ์ฝ๋ ๋ฌธ์ํํ๊ธฐ: ๊ฐ
experimental_LegacyHidden์ปดํฌ๋ํธ์ ๋ชฉ์ ๊ณผ ์์์ ์จ๊ธฐ๊ฑฐ๋ ํ์ํ๋ ์กฐ๊ฑด์ ๋ช ํํ๊ฒ ๋ฌธ์ํํ์ญ์์ค. - ์ฒ ์ ํ๊ฒ ํ
์คํธํ๊ธฐ:
experimental_LegacyHidden์ปดํฌ๋ํธ๊ฐ ์์๋๋ก ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์ฒ ์ ํ๊ฒ ํ ์คํธํ์ญ์์ค. ์ฃ์ง ์ผ์ด์ค์ ์ ์ฌ์ ์ธ ์ฑ๋ฅ ๋ฌธ์ ์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด์ญ์์ค. - ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง:
experimental_LegacyHidden์ ๋์ ํ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ์ฌ ์๊ธฐ์น ์์ ์๋ ์ ํ๋ฅผ ์ผ์ผํค์ง ์๋์ง ํ์ธํ์ญ์์ค. - ์ ๊ฑฐ ๊ณํ ์ธ์ฐ๊ธฐ:
experimental_LegacyHidden์ ์์ ํด๊ฒฐ์ฑ ์์ ๊ธฐ์ตํ์ญ์์ค. ๋ ๊ฑฐ์ ์ปดํฌ๋ํธ๊ฐ ์์ ํ ๋ง์ด๊ทธ๋ ์ด์ ๋๋ฉด ์ ๊ฑฐํ ๊ณํ์ ์ธ์ฐ์ญ์์ค.
์ค์ ์ฌ์ฉ ์์
๋ค์ํ ์๋๋ฆฌ์ค์์ experimental_LegacyHidden์ด ์ด๋ป๊ฒ ์ฌ์ฉ๋ ์ ์๋์ง ์ค์ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์์ 1: ํด๋์ค ์ปดํฌ๋ํธ์์ ํจ์ํ ์ปดํฌ๋ํธ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ
์ ์ฌ์ฉํ๋ ํจ์ํ ์ปดํฌ๋ํธ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๋ ค๋ ๋ง์ ํด๋์ค ์ปดํฌ๋ํธ๊ฐ ์๋ ํฐ ์ฝ๋๋ฒ ์ด์ค๊ฐ ์๋ค๊ณ ์์ํด ๋ณด์ญ์์ค. experimental_LegacyHidden์ ์ฌ์ฉํ์ฌ ํด๋์ค ์ปดํฌ๋ํธ๋ฅผ ์ ์ง์ ์ผ๋ก ํจ์ํ ์ปดํฌ๋ํธ๋ก ๋์ฒดํ ์ ์์ต๋๋ค.
import React from 'react';
import { unstable_LegacyHidden as LegacyHidden } from 'react';
// ๋ ๊ฑฐ์ ํด๋์ค ์ปดํฌ๋ํธ
class LegacyProfile extends React.Component {
constructor(props) {
super(props);
this.state = { name: 'Old Profile' };
}
render() {
return ์๋
ํ์ธ์, {this.state.name} (ํด๋์ค ์ปดํฌ๋ํธ)
;
}
}
// ํ
์ ์ฌ์ฉํ๋ ์๋ก์ด ํจ์ํ ์ปดํฌ๋ํธ
function NewProfile() {
const [name, setName] = React.useState('New Profile');
return ์๋
ํ์ธ์, {name} (ํจ์ํ ์ปดํฌ๋ํธ)
;
}
function MyComponent({ useNew }) {
return (
{useNew ? (
) : (
)}
);
}
export default MyComponent;
์ด ์์ ์์ LegacyProfile์ ํด๋์ค ์ปดํฌ๋ํธ์ด๊ณ NewProfile์ ํ
์ ์ฌ์ฉํ๋ ํจ์ํ ์ปดํฌ๋ํธ์
๋๋ค. MyComponent๋ useNew prop์ ๋ฐ๋ผ ๋ ๊ฑฐ์ ์ปดํฌ๋ํธ ๋๋ ์ ์ปดํฌ๋ํธ๋ฅผ ์กฐ๊ฑด๋ถ๋ก ๋ ๋๋งํ๊ธฐ ์ํด experimental_LegacyHidden์ ์ฌ์ฉํฉ๋๋ค.
์์ 2: ์๋ก์ด ๊ธฐ๋ฅ A/B ํ ์คํธ
experimental_LegacyHidden์ ์๋ก์ด ๊ธฐ๋ฅ์ A/B ํ
์คํธ์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ผ๋ถ ์ฌ์ฉ์์๊ฒ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ๋ณด์ฌ์ฃผ๊ณ ๋๋จธ์ง์๊ฒ๋ ๋ ๊ฑฐ์ ๊ธฐ๋ฅ์ ๋ณด์ฌ์ค ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ์ํ๊ธฐ ์ ์ ๋ฐ์ดํฐ์ ํผ๋๋ฐฑ์ ์์งํ ์ ์์ต๋๋ค.
import React from 'react';
import { unstable_LegacyHidden as LegacyHidden } from 'react';
// ์ฌ์ฉ์๊ฐ A/B ํ
์คํธ ๊ทธ๋ฃน์ ์ํด ์๋์ง ํ์ธํ๋ ํจ์๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค
function isInABTestGroup() {
// ์ฌ๊ธฐ์ A/B ํ
์คํธ ๋ก์ง์ ๊ตฌํํ์ธ์ (์: ์ฟ ํค ๋๋ ์ฌ์ฉ์ ID ์ฌ์ฉ)
// ์ด ์์ ์์๋ ๋ฌด์์ ๋ถ๋ฆฌ์ธ ๊ฐ์ ๋ฐํํฉ๋๋ค
return Math.random() < 0.5;
}
function LegacyButton() {
return ;
}
function NewButton() {
return ;
}
function MyComponent() {
const showNewButton = isInABTestGroup();
return (
{showNewButton ? (
) : (
)}
);
}
export default MyComponent;
์ด ์์ ์์ isInABTestGroup ํจ์๋ ์ฌ์ฉ์๊ฐ A/B ํ
์คํธ ๊ทธ๋ฃน์ ์ํด ์๋์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ๊ทธ๋ฃน์ ์ํด ์์ผ๋ฉด NewButton์ด ํ์๋๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด LegacyHidden์ผ๋ก ๊ฐ์ธ์ธ LegacyButton์ด ํ์๋ฉ๋๋ค.
์์ 3: ๋ฆฌ๋์์ธ์ ์ ์ง์ ์ถ์
์น์ฌ์ดํธ๋ฅผ ๋ฆฌ๋์์ธํ ๋ experimental_LegacyHidden์ ์ฌ์ฉํ์ฌ ์ฌ์ดํธ์ ์ฌ๋ฌ ์น์
์ ์๋ก์ด ๋์์ธ์ ์ ์ง์ ์ผ๋ก ์ถ์ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ฆฌ๋์์ธ์ ์ํฅ์ ๋ชจ๋ํฐ๋งํ๊ณ ํ์์ ๋ฐ๋ผ ์กฐ์ ํ ์ ์์ต๋๋ค.
import React from 'react';
import { unstable_LegacyHidden as LegacyHidden } from 'react';
function LegacyHeader() {
return ๋ ๊ฑฐ์ ํค๋ ;
}
function NewHeader() {
return ์๋ก์ด ํค๋ ๋์์ธ ;
}
function MyComponent({ useNewHeader }) {
return (
{useNewHeader ? (
) : (
)}
๋ฉ์ธ ์ฝํ
์ธ
);
}
export default MyComponent;
์ด ์์ ์์ LegacyHeader๋ ์ด์ ํค๋ ๋์์ธ์ ๋ํ๋ด๊ณ NewHeader๋ ์๋ก์ด ๋์์ธ์ ๋ํ๋
๋๋ค. MyComponent๋ useNewHeader prop์ ๋ฐ๋ผ ๋ ๊ฑฐ์ ํค๋ ๋๋ ์ ํค๋๋ฅผ ์กฐ๊ฑด๋ถ๋ก ๋ ๋๋งํ๊ธฐ ์ํด experimental_LegacyHidden์ ์ฌ์ฉํฉ๋๋ค.
experimental_LegacyHidden์ ๋์
experimental_LegacyHidden์ด ์ ์ฉํ ์ ์์ง๋ง, React์์ ๋ ๊ฑฐ์ ์ปดํฌ๋ํธ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ทจํ ์ ์๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์๋ ์์ต๋๋ค:
- ์กฐ๊ฑด๋ถ ๋ ๋๋ง: ํ์ค ์กฐ๊ฑด๋ถ ๋ ๋๋ง ๊ธฐ์ (์:
if๋ฌธ, ์ผํญ ์ฐ์ฐ์)์ ์ฌ์ฉํ์ฌ ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ปดํฌ๋ํธ๋ฅผ ํ์ํ๊ฑฐ๋ ์จ๊ธธ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์experimental_LegacyHidden์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๊ฐ๋จํ์ง๋ง ๋ณต์กํ ์๋๋ฆฌ์ค์์๋ ์ ์ฐ์ฑ์ด ๋จ์ด์ง ์ ์์ต๋๋ค. - ์ปดํฌ๋ํธ ํฉ์ฑ: ์ปดํฌ๋ํธ ํฉ์ฑ์ ์ฌ์ฉํ์ฌ ๋ ๊ฑฐ์ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ๊ฑฐ๋ ๋์ฒดํ๋ ์๋ก์ด ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ํตํด ๊ธฐ์กด ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๋ฉด์ ์ ์ง์ ์ผ๋ก ์๋ก์ด ๊ธฐ๋ฅ์ ๋์ ํ ์ ์์ต๋๋ค.
- ๋ฆฌํฉํ ๋ง: ๊ฐ์ฅ ์ง์ ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๋ ๊ฑฐ์ ์ฝ๋๋ฅผ ์๋ก์ด React ํจํด๊ณผ ๋ฒ์ ์ ์ฌ์ฉํ๋๋ก ๋จ์ํ ๋ฆฌํฉํ ๋งํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ๊ณผ์ ์ผ ์ ์์ง๋ง, ๋ ๊ฑฐ์ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๊ณ ์ฝ๋๋ฒ ์ด์ค์ ์ ๋ฐ์ ์ธ ํ์ง์ ํฅ์์ํค๋ ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค.
- ์ฝ๋ ๋ถํ : ์ปดํฌ๋ํธ ์จ๊ธฐ๊ธฐ์ ์ง์ ์ ์ธ ๊ด๋ จ์ ์์ง๋ง, ์ฝ๋ ๋ถํ ์ ํน์ ๋ทฐ๋ ๊ธฐ๋ฅ์ ํ์ํ ์ฝ๋๋ง ๋ก๋ํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ์ด๋ ๋ง์ ๋ ๊ฑฐ์ ์ปดํฌ๋ํธ๊ฐ ์๋ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ ํนํ ์ ์ฉํ ์ ์์ต๋๋ค. ๋์ ์ํฌํธ(`import()`)๋ ์ปดํฌ๋ํธ๋ฅผ ์ง์ฐ ๋ก๋ฉํ์ฌ ์ด๊ธฐ ๋ก๋ ์๊ฐ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
experimental_LegacyHidden์ ์ต์ React ์ ํ๋ฆฌ์ผ์ด์
์์ ๋ ๊ฑฐ์ ์ปดํฌ๋ํธ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ ์ง์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๋ ๋ฐ ๋์์ด ๋๋ ๊ฐ๋ ฅํ ๋๊ตฌ์
๋๋ค. ์ด๋ฅผ ํตํด ์๋ก์ด ๊ธฐ๋ฅ์ ์ ์ง์ ์ผ๋ก ์ถ์ํ๊ณ , ์ฑ๋ฅ์ ๊ฐ์ ํ๋ฉฐ, ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋จ์ํํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ๋ต์ ์ผ๋ก ์ฌ์ฉํ๊ณ ๊ทธ ํ๊ณ๋ฅผ ์ธ์งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. experimental_LegacyHidden์ ๋ฆฌํฉํ ๋ง์ ๋์ฒด์ฌ๊ฐ ์๋๋ฉฐ, ๋ ๊ฑฐ์ ์ปดํฌ๋ํธ๊ฐ ์์ ํ ๋ง์ด๊ทธ๋ ์ด์
๋๋ฉด ์ ๊ฑฐํ๋ ๊ฒ์ ๋ชฉํ๋ก ํด์ผ ํจ์ ๊ธฐ์ตํ์ญ์์ค.
experimental_LegacyHidden์ ์ด์ , ํ๊ณ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํดํจ์ผ๋ก์จ React ํ๋ก์ ํธ์ ํ์ง๊ณผ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํค๊ณ ๊ถ๊ทน์ ์ผ๋ก ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฐ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
์คํ์ API ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก์ ๋ํ ์ต์ ์ ๋ณด๋ ํญ์ ๊ณต์ React ๋ฌธ์์ ์ปค๋ฎค๋ํฐ ๋ฆฌ์์ค๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
๋ฉด์ฑ
์กฐํญ: experimental_LegacyHidden์ ์คํ์ API์ด๋ฏ๋ก ํฅํ React ๋ฒ์ ์์ ๋์ ๋ฐ ๊ฐ์ฉ์ฑ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ํ๋ก๋์
ํ๊ฒฝ์์ ์ฌ์ฉํ๊ธฐ ์ ์ ํญ์ ์ต์ ๋ฌธ์๋ก ํ์ธํ์ญ์์ค.