React의 가상 DOM 및 구성 요소 기반 아키텍처는 놀라울 정도로 효율적이지만 적절한 최적화가 없으면 애플리케이션이 여전히 성능 문제를 겪을 수 있습니다. 불필요한 재렌더링을 제거하고 React 앱의 성능을 향상시키기 위한 입증된 전략을 살펴보겠습니다.
최적화하기 전에 React 구성 요소가 다시 렌더링되는 시기와 이유를 이해해야 합니다.
모든 재렌더링이 나쁜 것은 아니지만 불필요한 재렌더링은 성능에 영향을 줄 수 있습니다. 이를 예방하는 방법을 살펴보겠습니다.
const MovieCard = React.memo(({ title, rating, onLike }) => { console.log(`MovieCard rendered: ${title}`); return ( <div className="card"> <h3>{title}</h3> <span>Rating: {rating}/10</span> <button onClick={onLike}>Like</button> </div> ); }); // Usage <MovieCard title="Inception" rating={9.3} onLike={() => handleLike('inception')} />
? 프로 팁: React.memo는 강력하지만 전략적으로 사용하세요. 모든 것을 메모하면 실제로 성능이 저하될 수 있습니다.
const MovieList = () => { const [movies, setMovies] = useState([]); const handleLike = useCallback((movieId) => { setMovies(prevMovies => prevMovies.map(movie => movie.id === movieId ? { ...movie, likes: movie.likes + 1 } : movie ) ); }, []); // Empty deps array as it only uses setState return movies.map(movie => ( <MovieCard key={movie.id} {...movie} onLike={() => handleLike(movie.id)} /> )); };
const MovieAnalytics = ({ movies }) => { const statistics = useMemo(() => ({ averageRating: movies.reduce((acc, m) => acc + m.rating, 0) / movies.length, topRated: [...movies].sort((a, b) => b.rating - a.rating)[0], totalLikes: movies.reduce((acc, m) => acc + m.likes, 0) }), [movies]); return ( <div> <h2>Analytics Dashboard</h2> <p>Average Rating: {statistics.averageRating.toFixed(1)}</p> <p>Most Popular: {statistics.topRated.title}</p> <p>Total Likes: {statistics.totalLikes}</p> </div> ); };
const MovieApp = () => { const [favorites, setFavorites] = useState(new Set()); // Lifted state handler const toggleFavorite = useCallback((movieId) => { setFavorites(prev => { const next = new Set(prev); if (next.has(movieId)) next.delete(movieId); else next.add(movieId); return next; }); }, []); return ( <div> <MovieList onFavorite={toggleFavorite} /> <FavoritesList ids={favorites} /> </div> ); };
function useMovieData(movieId) { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { let mounted = true; async function fetchMovie() { setLoading(true); try { const response = await fetch(`/api/movies/${movieId}`); const movie = await response.json(); if (mounted) { setData(movie); setLoading(false); } } catch (error) { if (mounted) { console.error('Failed to fetch movie:', error); setLoading(false); } } } fetchMovie(); return () => { mounted = false; }; }, [movieId]); return { data, loading }; }
✅ 순수한 기능적 구성 요소에는 React.memo를 사용하세요
✅ props로 전달된 이벤트 핸들러에 대해 useCallback을 구현하세요
✅ 비용이 많이 드는 계산에는 useMemo를 적용하세요
✅ 렌더에서 인라인 객체 생성을 피하세요
✅ 목록에 적절한 키 소품을 활용하세요
✅ 정기적으로 앱을 프로필화하세요
❌과잉 최적화
❌ 성급한 최적화
❌ 모든 것을 메모하기
❌ 렌더에서 새 개체/배열 만들기
❌ 깊은 구성요소 중첩
React 19는 자동 성능 개선을 제공합니다.
React의 성능 최적화는 코드 복잡성과 실제 성능 향상 간의 균형을 유지하는 것입니다. 기본부터 시작하여 앱 성능을 측정하고 필요한 경우 최적화하세요. 기억하세요: 성급한 최적화는 모든 악의 근원입니다!
✨ 이 내용이 도움이 되었기를 바랍니다! 더 많은 React 팁과 요령을 보려면 저를 좋아요하고 팔로우하는 것을 잊지 마세요!
? X(Twitter) 및 LinkedIn에서 저를 팔로우하여 매일 웹 개발 팁과 통찰력을 얻으세요!
? 계속 코딩하고, 계속 만들고, 계속 개선하세요!
이 멋진 날에 여러분 모두의 성공과 긍정적인 마음을 기원합니다. 함께 놀라운 일을 만들어 봅시다! ?
위 내용은 React 성능 익히기: 불필요한 재렌더링 방지를 위한 개발자 가이드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!