React ์๊ฐ ๋ถํ ์ ์ฌ์ธต์ ์ผ๋ก ๋ถ์ํ๊ณ , ๊ทธ ์ด์ , ๊ตฌํ ๊ธฐ์ , ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ ๋ฐ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ฏธ์น๋ ์ํฅ์ ํ๊ตฌํฉ๋๋ค. ๋ ๋ถ๋๋ฌ์ด ์ํธ์์ฉ์ ์ํด ๋ ๋๋ง ์ฐ์ ์์๋ฅผ ์ต์ ํํ์ธ์.
React ์๊ฐ ๋ถํ : ํฅ์๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํ ๋ ๋๋ง ์ฐ์ ์์ ๋ง์คํฐํ๊ธฐ
ํ๋ ์น ๊ฐ๋ฐ์ ์ธ๊ณ์์ ๋ถ๋๋ฝ๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ(UX)์ ์ ๊ณตํ๋ ๊ฒ์ ๊ฐ์ฅ ์ค์ํฉ๋๋ค. React ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ณต์กํด์ง์ ๋ฐ๋ผ ์ต์ ์ ์ฑ๋ฅ์ ๋ณด์ฅํ๋ ๊ฒ์ ์ ์ ๋ ์ด๋ ค์์ง๊ณ ์์ต๋๋ค. React์ ๋์์ฑ ๋ชจ๋(Concurrent Mode) ๋ด ํต์ฌ ๊ธฐ๋ฅ์ธ React ์๊ฐ ๋ถํ (Time Slicing)์ ๋ ๋๋ง ์ฐ์ ์์๋ฅผ ๊ด๋ฆฌํ๊ณ UI ๋ฉ์ถค ํ์์ ๋ฐฉ์งํ์ฌ UX๋ฅผ ํฌ๊ฒ ํฅ์์ํค๋ ๊ฐ๋ ฅํ ์๋ฃจ์ ์ ์ ๊ณตํฉ๋๋ค.
React ์๊ฐ ๋ถํ ์ด๋ ๋ฌด์์ธ๊ฐ?
React ์๊ฐ ๋ถํ ์ React๊ฐ ๋ ๋๋ง ์์ ์ ๋ ์๊ณ ์ค๋จ ๊ฐ๋ฅํ ์ฒญํฌ๋ก ๋๋ ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฅ์ ๋๋ค. ๋จ์ผ์ ์ค๋ ์คํ๋๋ ๋ ๋๋ง ์์ ์ผ๋ก ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ๋ ๋์ , React๋ ๋ ๋๋ง์ ์ผ์ ์ค์งํ๊ณ ์ฌ์ฉ์ ์ ๋ ฅ์ด๋ ๋ค๋ฅธ ์ค์ํ ์์ ์ ์ฒ๋ฆฌํ๋๋ก ๋ธ๋ผ์ฐ์ ์ ์ ์ด๊ถ์ ๋๊ฒจ์ค ๋ค์ ๋์ค์ ๋ ๋๋ง์ ์ฌ๊ฐํ ์ ์์ต๋๋ค. ์ด๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ตํ์ง ์๋ ์ํ๊ฐ ๋๋ ๊ฒ์ ๋ฐฉ์งํ์ฌ ์ฌ์ฉ์์๊ฒ ๋ ๋ถ๋๋ฝ๊ณ ์ํธ์์ฉ์ ์ธ ๊ฒฝํ์ ๋ณด์ฅํฉ๋๋ค.
ํฌ๊ณ ๋ณต์กํ ์์ฌ๋ฅผ ์ค๋นํ๋ ๊ฒ๊ณผ ๊ฐ๋ค๊ณ ์๊ฐํด๋ณด์ธ์. ๋ชจ๋ ๊ฒ์ ํ ๋ฒ์ ์๋ฆฌํ๋ ค๊ณ ํ๋ ๋์ , ์ฑ์๋ฅผ ์ฐ๊ณ , ์์ค๋ฅผ ์ค๋นํ๊ณ , ๊ฐ๋ณ ์ฌ๋ฃ๋ฅผ ๋ฐ๋ก ์๋ฆฌํ ๋ค์ ๋ง์ง๋ง์ ์กฐ๋ฆฝํ ์ ์์ต๋๋ค. ์๊ฐ ๋ถํ ์ React๊ฐ ๋ ๋๋ง์์๋ ์ด์ ์ ์ฌํ๊ฒ ์๋ํ์ฌ, ํฐ UI ์ ๋ฐ์ดํธ๋ฅผ ๋ ์๊ณ ๊ด๋ฆฌ ๊ฐ๋ฅํ ์กฐ๊ฐ์ผ๋ก ๋๋๋๋ก ํฉ๋๋ค.
์๊ฐ ๋ถํ ์ด ์ค์ํ ์ด์ ๋ ๋ฌด์์ธ๊ฐ?
์๊ฐ ๋ถํ ์ ์ฃผ์ ์ด์ ์ ํนํ ๋ณต์กํ UI๋ ๋น๋ฒํ ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ๊ฐ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์์ฑ์ด ํฅ์๋๋ค๋ ๊ฒ์ ๋๋ค. ์ฃผ์ ์ฅ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ํฅ์๋ ์ฌ์ฉ์ ๊ฒฝํ: ๋ธ๋ผ์ฐ์ ๊ฐ ์ฐจ๋จ๋๋ ๊ฒ์ ๋ฐฉ์งํจ์ผ๋ก์จ ์๊ฐ ๋ถํ ์ UI๊ฐ ์ฌ์ฉ์ ์ํธ์์ฉ์ ๊ณ์ ๋ฐ์ํ๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ ๋ ๋ถ๋๋ฌ์ด ์ ๋๋ฉ์ด์ , ํด๋ฆญ ๋ฐ ํค๋ณด๋ ์ ๋ ฅ์ ๋ํ ๋ ๋น ๋ฅธ ์๋ต ์๊ฐ, ๊ทธ๋ฆฌ๊ณ ์ ๋ฐ์ ์ผ๋ก ๋ ์ฆ๊ฑฐ์ด ์ฌ์ฉ์ ๊ฒฝํ์ผ๋ก ์ด์ด์ง๋๋ค.
- ์ฑ๋ฅ ํฅ์: ์๊ฐ ๋ถํ ์ด ์ด ์๊ฐ ์ธก๋ฉด์์ ๋ ๋๋ง์ ๋ฐ๋์ ๋ ๋น ๋ฅด๊ฒ ๋ง๋๋ ๊ฒ์ ์๋์ง๋ง, ๋ ๋ถ๋๋ฝ๊ณ ์์ธก ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค. ์ด๋ ํนํ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ด ์ ํ๋ ์ฅ์น์์ ์ค์ํฉ๋๋ค.
- ๋ ๋์ ๋ฆฌ์์ค ๊ด๋ฆฌ: ์๊ฐ ๋ถํ ์ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฆฌ์์ค๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ํ ๋นํ๋๋ก ํ์ฌ, ์ค๋ ์คํ๋๋ ์์ ์ด CPU๋ฅผ ๋ ์ ํ๊ณ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ฅผ ๋๋ฆฌ๊ฒ ๋ง๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
- ์ ๋ฐ์ดํธ ์ฐ์ ์์ ์ง์ : ์๊ฐ ๋ถํ ์ React๊ฐ ์ฌ์ฉ์ ์ ๋ ฅ๊ณผ ๊ด๋ จ๋ ์ ๋ฐ์ดํธ์ ๊ฐ์ด ๋ ์ค์ํ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ๋ณด๋ค ์ค์ํ ์ ๋ฐ์ดํธ์ ์ฐ์ ์์๋ฅผ ์ ํ ์ ์๊ฒ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ค๋ฅธ ์ ๋ฐ์ดํธ๊ฐ ์งํ ์ค์ผ ๋์๋ UI๊ฐ ์ฌ์ฉ์ ํ๋์ ์ ์ํ๊ฒ ์๋ตํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
React Fiber์ ๋์์ฑ ๋ชจ๋ ์ดํดํ๊ธฐ
์๊ฐ ๋ถํ ์ React์ Fiber ์ํคํ ์ฒ ๋ฐ ๋์์ฑ ๋ชจ๋์ ๊น์ด ์ฐ๊ด๋์ด ์์ต๋๋ค. ์ด ๊ฐ๋ ์ ์์ ํ ์ดํดํ๋ ค๋ฉด ์ด๋ฌํ ๊ธฐ๋ณธ ๊ธฐ์ ์ ์ดํดํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค.
React Fiber
React Fiber๋ React์ ์ฌ์กฐ์ (reconciliation) ์๊ณ ๋ฆฌ์ฆ์ ์์ ํ ์ฌ์์ฑํ ๊ฒ์ผ๋ก, ์ฑ๋ฅ์ ๊ฐ์ ํ๊ณ ์๊ฐ ๋ถํ ๊ณผ ๊ฐ์ ์๋ก์ด ๊ธฐ๋ฅ์ ํ์ฑํํ๊ธฐ ์ํด ์ค๊ณ๋์์ต๋๋ค. Fiber์ ํต์ฌ ํ์ ์ ๋ ๋๋ง ์์ ์ "ํ์ด๋ฒ(fiber)"๋ผ๊ณ ๋ถ๋ฆฌ๋ ๋ ์์ ๋จ์๋ก ๋ถํ ํ๋ ๋ฅ๋ ฅ์ ๋๋ค. ๊ฐ ํ์ด๋ฒ๋ ์ปดํฌ๋ํธ๋ DOM ๋ ธ๋์ ๊ฐ์ UI์ ๋จ์ผ ์กฐ๊ฐ์ ๋ํ๋ ๋๋ค. Fiber๋ React๊ฐ UI์ ๋ค๋ฅธ ๋ถ๋ถ์ ๋ํ ์์ ์ ์ผ์ ์ค์ง, ์ฌ๊ฐ ๋ฐ ์ฐ์ ์์๋ฅผ ์ง์ ํ ์ ์๊ฒ ํ์ฌ ์๊ฐ ๋ถํ ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
๋์์ฑ ๋ชจ๋
๋์์ฑ ๋ชจ๋๋ ์๊ฐ ๋ถํ , Suspense, Transitions๋ฅผ ํฌํจํ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ์ ๊ธ ํด์ ํ๋ React์ ์๋ก์ด ๊ธฐ๋ฅ ์ธํธ์ ๋๋ค. ์ด๋ฅผ ํตํด React๋ ์ฌ๋ฌ ๋ฒ์ ์ UI๋ฅผ ๋์์ ์์ ํ ์ ์์ด ๋น๋๊ธฐ ๋ ๋๋ง ๋ฐ ์ ๋ฐ์ดํธ ์ฐ์ ์์ ์ง์ ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ๋์์ฑ ๋ชจ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ด ์์ง ์์ผ๋ฉฐ ์ตํธ์ธ(opt-in)์ด ํ์ํฉ๋๋ค.
React์์ ์๊ฐ ๋ถํ ๊ตฌํํ๊ธฐ
์๊ฐ ๋ถํ ์ ํ์ฉํ๋ ค๋ฉด React ๋์์ฑ ๋ชจ๋๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ด๋ฅผ ํ์ฑํํ๊ณ ์๊ฐ ๋ถํ ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
๋์์ฑ ๋ชจ๋ ํ์ฑํํ๊ธฐ
๋์์ฑ ๋ชจ๋๋ฅผ ํ์ฑํํ๋ ๋ฐฉ๋ฒ์ React ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๋๋งํ๋ ๋ฐฉ์์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
- ์๋ก์ด ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฒฝ์ฐ:
index.js๋๋ ๋ฉ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ง์ ์ ์์ReactDOM.render๋์createRoot๋ฅผ ์ฌ์ฉํฉ๋๋ค. - ๊ธฐ์กด ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฒฝ์ฐ:
createRoot๋ก์ ๋ง์ด๊ทธ๋ ์ด์ ์ ๊ธฐ์กด ์ปดํฌ๋ํธ์์ ํธํ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ ์คํ ๊ณํ๊ณผ ํ ์คํธ๊ฐ ํ์ํ ์ ์์ต๋๋ค.
createRoot ์ฌ์ฉ ์์:
import React from 'react';
import { createRoot } from 'react-dom/client';
import App from './App';
const container = document.getElementById('root');
const root = createRoot(container); // TypeScript๋ฅผ ์ฌ์ฉํ๋ค๋ฉด createRoot(container!)
root.render( );
createRoot๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ๋์์ฑ ๋ชจ๋๋ฅผ ์ ํํ๊ณ ์๊ฐ ๋ถํ ์ ํ์ฑํํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋์์ฑ ๋ชจ๋๋ฅผ ํ์ฑํํ๋ ๊ฒ์ ์ฒซ ๋ฒ์งธ ๋จ๊ณ์ผ ๋ฟ์
๋๋ค. ๋ํ ๊ทธ ๊ธฐ๋ฅ์ ํ์ฉํ ์ ์๋ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค.
์ค์ํ์ง ์์ ์
๋ฐ์ดํธ์ useDeferredValue ์ฌ์ฉํ๊ธฐ
useDeferredValue ํ
์ UI์ ๋ ์ค์ํ ๋ถ๋ถ์ ๋ํ ์
๋ฐ์ดํธ๋ฅผ ์ง์ฐ์ํฌ ์ ์๊ฒ ํด์ค๋๋ค. ์ด๋ ๊ฒ์ ๊ฒฐ๊ณผ๋ ๋ณด์กฐ ์ฝํ
์ธ ์ ๊ฐ์ด ์ฌ์ฉ์ ์
๋ ฅ์ ์ฆ์ ์
๋ฐ์ดํธํ ํ์๊ฐ ์๋ ์์์ ์ ์ฉํฉ๋๋ค.
์์:
import React, { useState, useDeferredValue } from 'react';
function SearchResults({ query }) {
// ๊ฒ์ ๊ฒฐ๊ณผ ์
๋ฐ์ดํธ๋ฅผ 500ms ์ง์ฐ
const deferredQuery = useDeferredValue(query, { timeoutMs: 500 });
// ์ง์ฐ๋ ์ฟผ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฒ์ ๊ฒฐ๊ณผ ๊ฐ์ ธ์ค๊ธฐ
const results = useSearchResults(deferredQuery);
return (
{results.map(result => (
- {result.title}
))}
);
}
function SearchBar() {
const [query, setQuery] = useState('');
return (
setQuery(e.target.value)}
/>
);
}
function useSearchResults(query) {
const [results, setResults] = useState([]);
React.useEffect(() => {
// API์์ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ์๋ฎฌ๋ ์ด์
const timeoutId = setTimeout(() => {
const fakeResults = Array.from({ length: 5 }, (_, i) => ({
id: i,
title: `"${query}"์ ๋ํ ๊ฒฐ๊ณผ ${i + 1}`
}));
setResults(fakeResults);
}, 200);
return () => clearTimeout(timeoutId);
}, [query]);
return results;
}
export default SearchBar;
์ด ์์์์ useDeferredValue ํ
์ React๊ฐ ๊ฒ์์ฐฝ์ ์
๋ ฅํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ ์ค์ํ ์
๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํ ๊ธฐํ๋ฅผ ๊ฐ์ง ๋๊น์ง ๊ฒ์ ๊ฒฐ๊ณผ์ ์
๋ฐ์ดํธ๋ฅผ ์ง์ฐ์ํต๋๋ค. ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๊ณ ๋ ๋๋งํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋๋ผ๋ UI๋ ๋ฐ์์ฑ์ ์ ์งํฉ๋๋ค. timeoutMs ๋งค๊ฐ๋ณ์๋ ์ต๋ ์ง์ฐ ์๊ฐ์ ์ ์ดํฉ๋๋ค. ํ์์์์ด ๋ง๋ฃ๋๊ธฐ ์ ์ ๋ ์ต์ ๊ฐ์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ฉด ์ง์ฐ๋ ๊ฐ์ ์ฆ์ ์
๋ฐ์ดํธ๋ฉ๋๋ค. ์ด ๊ฐ์ ์กฐ์ ํ๋ฉด ๋ฐ์์ฑ๊ณผ ์ต์ ์ฑ ์ฌ์ด์ ๊ท ํ์ ๋ฏธ์ธ ์กฐ์ ํ ์ ์์ต๋๋ค.
UI ์ ํ์ useTransition ์ฌ์ฉํ๊ธฐ
useTransition ํ
์ UI ์
๋ฐ์ดํธ๋ฅผ ์ ํ(transition)์ผ๋ก ํ์ํ์ฌ React๊ฐ ๋ค๋ฅธ ์
๋ฐ์ดํธ๋ณด๋ค ๋ ๊ธด๊ธํ๊ฒ ์ฐ์ ์์๋ฅผ ์ ํ๋๋ก ์ง์ํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด๋ ๊ฒฝ๋ก ๊ฐ ์ด๋์ด๋ ์ค์ํ์ง ์์ UI ์์ ์
๋ฐ์ดํธ์ ๊ฐ์ด ์ฆ์ ๋ฐ์๋ ํ์๊ฐ ์๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํฉ๋๋ค.
์์:
import React, { useState, useTransition } from 'react';
function MyComponent() {
const [isPending, startTransition] = useTransition();
const [data, setData] = useState(null);
const handleClick = () => {
startTransition(() => {
// API์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ์๋ฎฌ๋ ์ด์
setTimeout(() => {
setData({ value: '์ ๋ฐ์ดํฐ' });
}, 1000);
});
};
return (
{data && ๋ฐ์ดํฐ: {data.value}
}
);
}
export default MyComponent;
์ด ์์์์ useTransition ํ
์ ๋ฐ์ดํฐ ๋ก๋ฉ ํ๋ก์ธ์ค๋ฅผ ์ ํ์ผ๋ก ํ์ํฉ๋๋ค. React๋ ๋ฐ์ดํฐ ๋ก๋ฉ ํ๋ก์ธ์ค๋ณด๋ค ์ฌ์ฉ์ ์
๋ ฅ๊ณผ ๊ฐ์ ๋ค๋ฅธ ์
๋ฐ์ดํธ๋ฅผ ์ฐ์ ์ํ ๊ฒ์
๋๋ค. isPending ํ๋๊ทธ๋ ์ ํ์ด ์งํ ์ค์ธ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ฏ๋ก ๋ก๋ฉ ํ์๊ธฐ๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
์๊ฐ ๋ถํ ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
์๊ฐ ๋ถํ ์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ธ์:
- ๋ณ๋ชฉ ํ์ ์๋ณ: React Profiler๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ์ปดํฌ๋ํธ๋ฅผ ์๋ณํฉ๋๋ค. ์ด๋ฌํ ์ปดํฌ๋ํธ๋ฅผ ๋จผ์ ์ต์ ํํ๋ ๋ฐ ์ง์คํ์ธ์.
- ์ ๋ฐ์ดํธ ์ฐ์ ์์ ์ง์ : ์ด๋ค ์ ๋ฐ์ดํธ๊ฐ ์ฆ๊ฐ์ ์ด์ด์ผ ํ๊ณ ์ด๋ค ์ ๋ฐ์ดํธ๋ฅผ ์ง์ฐ์ํค๊ฑฐ๋ ์ ํ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋์ง ์ ์คํ๊ฒ ๊ณ ๋ คํ์ธ์.
- ๋ถํ์ํ ๋ ๋๋ง ๋ฐฉ์ง:
React.memo,useMemo,useCallback์ ์ฌ์ฉํ์ฌ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ์ธ์. - ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ต์ ํ: ํจ์จ์ ์ธ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋๋ง ์ค ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๊ฐ์ ์ต์ํํ์ธ์.
- ๋ฆฌ์์ค ์ง์ฐ ๋ก๋ฉ:
React.lazy๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ๋๋ง ์ปดํฌ๋ํธ๋ฅผ ๋ก๋ํ์ธ์. ์ปดํฌ๋ํธ๊ฐ ๋ก๋๋๋ ๋์ ๋์ฒด UI๋ฅผ ํ์ํ๊ธฐ ์ํด Suspense ์ฌ์ฉ์ ๊ณ ๋ คํ์ธ์. - ์ฒ ์ ํ ํ ์คํธ: ๋ค์ํ ์ฅ์น์ ๋ธ๋ผ์ฐ์ ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ์คํธํ์ฌ ์๊ฐ ๋ถํ ์ด ์์๋๋ก ์๋ํ๋์ง ํ์ธํ์ธ์. ํนํ ์ ์ฌ์ ์ฅ์น์์์ ์ฑ๋ฅ์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด์ธ์.
- ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ํ์์ ๋ฐ๋ผ ์กฐ์ ํ์ธ์.
๊ตญ์ ํ(i18n) ๊ณ ๋ ค์ฌํญ
๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๊ฐ ๋ถํ ์ ๊ตฌํํ ๋, ๊ตญ์ ํ(i18n)๊ฐ ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ ๊ณ ๋ คํ์ธ์. ๋ค๋ฅธ ๋ก์ผ์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ ๊ฒ์ ํนํ ๋ณต์กํ ์์ ๊ท์น์ด๋ ํฐ ๋ฒ์ญ ํ์ผ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ณ์ฐ ๋น์ฉ์ด ๋ง์ด ๋ค ์ ์์ต๋๋ค.
๋ค์์ i18n ๊ด๋ จ ๊ณ ๋ ค์ฌํญ์ ๋๋ค:
- ๋ฒ์ญ ๋ก๋ฉ ์ต์ ํ: ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๋๋ก ๋ฒ์ญ ํ์ผ์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ํ์ธ์. ์ฝ๋ ๋ถํ ์ ์ฌ์ฉํ์ฌ ํ์ฌ ๋ก์ผ์ผ์ ํ์ํ ๋ฒ์ญ๋ง ๋ก๋ํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
- ํจ์จ์ ์ธ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ: ์ฑ๋ฅ์ ์ต์ ํ๋ i18n ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํํ์ธ์. ๋ถํ์ํ ๊ณ์ฐ์ ์ํํ๊ฑฐ๋ ๊ณผ๋ํ DOM ๋ ธ๋๋ฅผ ์์ฑํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ ํผํ์ธ์.
- ์์ ์ง์ ๋ ๊ฐ ์บ์ฑ: ์์ ์ง์ ๋ ๊ฐ์ ์บ์ํ์ฌ ๋ถํ์ํ๊ฒ ๋ค์ ๊ณ์ฐํ๋ ๊ฒ์ ๋ฐฉ์งํ์ธ์.
useMemo๋๋ ์ ์ฌํ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ์์ ํจ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํ์ธ์. - ์ฌ๋ฌ ๋ก์ผ์ผ๋ก ํ ์คํธ: ๋ค์ํ ๋ก์ผ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ์คํธํ์ฌ ์๊ฐ ๋ถํ ์ด ๋ค๋ฅธ ์ธ์ด ๋ฐ ์ง์ญ์์ ํจ๊ณผ์ ์ผ๋ก ์๋ํ๋์ง ํ์ธํ์ธ์. ๋ณต์กํ ์์ ๊ท์น์ด๋ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ์ฐ๋ ๋ ์ด์์์ ๊ฐ์ง ๋ก์ผ์ผ์ ํนํ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด์ธ์.
์์: ๋น๋๊ธฐ ๋ฒ์ญ ๋ก๋ฉ
๋ชจ๋ ๋ฒ์ญ์ ๋๊ธฐ์ ์ผ๋ก ๋ก๋ํ๋ ๋์ , ๋์ ๊ฐ์ ธ์ค๊ธฐ(dynamic import)๋ฅผ ์ฌ์ฉํ์ฌ ํ์์ ๋ฐ๋ผ ๋ก๋ํ ์ ์์ต๋๋ค:
import React, { useState, useEffect } from 'react';
function MyComponent() {
const [translations, setTranslations] = useState(null);
useEffect(() => {
async function loadTranslations() {
try {
const module = await import(`./translations/${getCurrentLocale()}.json`);
setTranslations(module.default);
} catch (error) {
console.error("๋ฒ์ญ ๋ก๋ฉ ์ค๋ฅ:", error);
}
}
loadTranslations();
}, []);
if (!translations) {
return ๋ฒ์ญ ๋ก๋ฉ ์ค...
;
}
return (
{translations.greeting}
);
}
function getCurrentLocale() {
// ํ์ฌ ๋ก์ผ์ผ์ ๊ฒฐ์ ํ๋ ๋ก์ง, ์: ๋ธ๋ผ์ฐ์ ์ค์ ๋๋ ์ฌ์ฉ์ ๊ธฐ๋ณธ ์ค์
return 'en'; // ์์
}
export default MyComponent;
์ด ์์๋ ๋ฒ์ญ ํ์ผ์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ํ์ฌ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ์์ฑ์ ํฅ์์ํค๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ์ค๋ฅ ์ฒ๋ฆฌ ๋ํ ์ค์ํฉ๋๋ค. `try...catch` ๋ธ๋ก์ ๋ฒ์ญ ๋ก๋ฉ ์ค ๋ฐ์ํ๋ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๊ณ ๊ธฐ๋กํ๋๋ก ๋ณด์ฅํฉ๋๋ค. `getCurrentLocale()` ํจ์๋ ํ๋ ์ด์คํ๋์ ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ํ์ฌ ๋ก์ผ์ผ์ ๊ฒฐ์ ํ๋ ๋ก์ง์ ๊ตฌํํด์ผ ํฉ๋๋ค.
์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์์์ ์๊ฐ ๋ถํ ์์
์๊ฐ ๋ถํ ์ ์ฑ๋ฅ๊ณผ UX๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฉ๋ ์ ์์ต๋๋ค. ๋ช ๊ฐ์ง ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ ์์๊ฑฐ๋ ์น์ฌ์ดํธ: ์ ํ ๋ชฉ๋ก, ๊ฒ์ ๊ฒฐ๊ณผ, ๊ฒฐ์ ํ๋ก์ธ์ค์ ๋ฐ์์ฑ์ ํฅ์์ํต๋๋ค.
- ์์ ๋ฏธ๋์ด ํ๋ซํผ: ๋ถ๋๋ฌ์ด ์คํฌ๋กค, ๋น ๋ฅธ ํผ๋ ์ ๋ฐ์ดํธ, ๊ฒ์๋ฌผ๊ณผ์ ๋ฐ์์ฑ ์๋ ์ํธ์์ฉ์ ๋ณด์ฅํฉ๋๋ค.
- ๋ฐ์ดํฐ ์๊ฐํ ๋์๋ณด๋: UI ๋ฉ์ถค ์์ด ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์ ๋ํํ์ผ๋ก ํ์ํ ์ ์๊ฒ ํฉ๋๋ค.
- ์จ๋ผ์ธ ๊ฒ์ ํ๋ซํผ: ์ํํ ๊ฒ์ ๊ฒฝํ์ ์ํด ์ผ๊ด๋ ํ๋ ์ ์๋์ ๋ฐ์์ฑ ์๋ ์ปจํธ๋กค์ ์ ์งํฉ๋๋ค.
- ํ์ ํธ์ง ๋๊ตฌ: ์ค์๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ์ ๊ณตํ๊ณ ํ์ ํธ์ง ์ธ์ ์ค UI ์ง์ฐ์ ๋ฐฉ์งํฉ๋๋ค.
๊ณผ์ ๋ฐ ๊ณ ๋ ค์ฌํญ
์๊ฐ ๋ถํ ์ ์๋นํ ์ด์ ์ ์ ๊ณตํ์ง๋ง, ๊ตฌํ๊ณผ ๊ด๋ จ๋ ๊ณผ์ ๋ฐ ๊ณ ๋ ค์ฌํญ์ ์ธ์งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
- ๋ณต์ก์ฑ ์ฆ๊ฐ: ์๊ฐ ๋ถํ ์ ๊ตฌํํ๋ฉด ์ฝ๋๋ฒ ์ด์ค๊ฐ ๋ณต์กํด์ง ์ ์์ผ๋ฉฐ, ์ ์คํ ๊ณํ๊ณผ ํ ์คํธ๊ฐ ํ์ํฉ๋๋ค.
- ์๊ฐ์ ๊ฒฐํจ ๊ฐ๋ฅ์ฑ: ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์๊ฐ ๋ถํ ์ ๊น๋ฐ์์ด๋ ๋ถ์์ ํ ๋ ๋๋ง๊ณผ ๊ฐ์ ์๊ฐ์ ๊ฒฐํจ์ ์ ๋ฐํ ์ ์์ต๋๋ค. ์ด๋ ์ ํ์ ์ ์คํ๊ฒ ๊ด๋ฆฌํ๊ณ ๋ ์ค์ํ ์ ๋ฐ์ดํธ๋ฅผ ์ง์ฐ์ํด์ผ๋ก์จ ์ํ๋ ์ ์์ต๋๋ค.
- ํธํ์ฑ ๋ฌธ์ : ๋์์ฑ ๋ชจ๋๋ ๋ชจ๋ ๊ธฐ์กด React ์ปดํฌ๋ํธ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํธํ๋์ง ์์ ์ ์์ต๋๋ค. ํธํ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ฒ ์ ํ ํ ์คํธ๊ฐ ํ์์ ์ ๋๋ค.
- ๋๋ฒ๊น ์ ์ด๋ ค์: ์๊ฐ ๋ถํ ๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ๋ฅผ ๋๋ฒ๊น ํ๋ ๊ฒ์ ์ ํต์ ์ธ React ์ฝ๋๋ฅผ ๋๋ฒ๊น ํ๋ ๊ฒ๋ณด๋ค ๋ ์ด๋ ค์ธ ์ ์์ต๋๋ค. React DevTools Profiler๋ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ ํด๊ฒฐํ๋ ๋ฐ ์ ์ฉํ ๋๊ตฌ๊ฐ ๋ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
React ์๊ฐ ๋ถํ ์ ๋ณต์กํ React ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๋๋ง ์ฐ์ ์์๋ฅผ ๊ด๋ฆฌํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๋ ๊ฐ๋ ฅํ ๊ธฐ์ ์ ๋๋ค. ๋ ๋๋ง ์์ ์ ๋ ์๊ณ ์ค๋จ ๊ฐ๋ฅํ ์ฒญํฌ๋ก ๋ถํดํจ์ผ๋ก์จ ์๊ฐ ๋ถํ ์ UI ๋ฉ์ถค์ ๋ฐฉ์งํ๊ณ ๋ ๋ถ๋๋ฝ๊ณ ๋ฐ์์ฑ ์๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํฉ๋๋ค. ์๊ฐ ๋ถํ ์ ๊ตฌํํ๋ฉด ์ฝ๋๋ฒ ์ด์ค๊ฐ ๋ณต์กํด์ง ์ ์์ง๋ง, ์ฑ๋ฅ ๋ฐ UX ์ธก๋ฉด์์์ ์ด์ ์ ์ข ์ข ๊ทธ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ผ ๊ฐ์น๊ฐ ์ถฉ๋ถํฉ๋๋ค. React Fiber์ ๋์์ฑ ๋ชจ๋์ ๊ธฐ๋ณธ ๊ฐ๋ ์ ์ดํดํ๊ณ ๊ตฌํ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฆ์ผ๋ก์จ, ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ฆ๊ฒ๊ฒ ํ๋ ๊ณ ์ฑ๋ฅ์ ์ฌ์ฉ์ ์นํ์ ์ธ React ์ ํ๋ฆฌ์ผ์ด์ ์ ํจ๊ณผ์ ์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค. ํญ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋กํ์ผ๋งํ๊ณ ์ฒ ์ ํ ํ ์คํธํ์ฌ ๋ค์ํ ์ฅ์น์ ๋ธ๋ผ์ฐ์ ์์ ์ต์ ์ ์ฑ๋ฅ๊ณผ ํธํ์ฑ์ ๋ณด์ฅํ๋ ๊ฒ์ ์์ง ๋ง์ธ์.