logo

[번역] React 모범 사례 (Introducing: React Best Practices)

#React#Vercel#번역
2026년 1월 16일 / 3분

Shu Ding (소프트웨어 엔지니어)
Andrew Qu (Vercel 소프트웨어 총괄)

2026년 1월 14일

우리는 10년 이상의 React 및 Next.js 최적화 지식을 react-best-practices에 캡슐화했습니다. 이는 AI 에이전트와 LLM(대형 언어 모델)을 위해 최적화된 구조화된 저장소입니다.

React 성능 작업은 대개, 말 그대로 반응적(reactive)입니다. 릴리스가 나가고, 앱이 느려지면, 팀은 증상을 쫓기 시작합니다. 이는 비용이 많이 들며, 엉뚱한 것을 최적화하기 쉽습니다.

우리는 10년 넘게 프로덕션 코드베이스 전반에서 동일한 근본 원인들을 보았습니다:

  • 실수로 순차적이 된 비동기 작업
  • 시간이 지남에 따라 커지는 대규모 클라이언트 번들
  • 필요 이상으로 렌더링되는 컴포넌트

여기서 "이유"는 간단합니다: 이것들은 미시적인 최적화(micro-optimizations)가 아닙니다. 이것들은 대기 시간, 버벅거림, 그리고 모든 사용자 세션에 영향을 미치는 반복적인 비용으로 나타납니다.

그래서 우리는 이러한 문제들을 더 쉽게 발견하고 더 빠르게 수정하기 위해 이 React 모범 사례 프레임워크를 구성했습니다.

핵심 아이디어: 순서 (The core idea: ordering)

대부분의 성능 작업은 스택의 너무 낮은 곳에서 시작하기 때문에 실패합니다.

요청 워터폴(waterfall)이 600ms의 대기 시간을 추가한다면, useMemo 호출이 얼마나 최적화되었는지는 중요하지 않습니다. 모든 페이지에 300KB의 추가 JavaScript를 전송한다면, 루프에서 몇 마이크로초를 줄이는 것은 중요하지 않을 것입니다.

성능 작업은 또한 복리로 작용합니다. 오늘 배포한 작은 회귀(regression)는 누군가가 그 부채를 갚을 때까지 모든 세션에 대한 장기적인 세금이 됩니다.

따라서 프레임워크는 대개 실제 지표를 가장 먼저 움직이는 두 가지 수정 사항으로 시작합니다:

  1. 워터폴 제거
  2. 번들 크기 축소

그런 다음 서버 측 성능, 클라이언트 측 가져오기(fetching), 그리고 리렌더링 최적화로 넘어갑니다.

여기에는 8개 카테고리에 걸친 40개 이상의 규칙이 포함되어 있으며, 영향도에 따라 치명적(CRITICAL - 워터폴 제거, 번들 크기 축소)인 것부터 점진적(incremental - 고급 패턴)인 것까지 순서가 매겨져 있습니다.

그 외 내용물은? (What else is inside?)

이 저장소는 8가지 성능 카테고리를 다룹니다:

  • 비동기 워터폴 제거
  • 번들 크기 최적화
  • 서버 측 성능
  • 클라이언트 측 데이터 가져오기
  • 리렌더링 최적화
  • 렌더링 성능
  • 고급 패턴
  • JavaScript 성능

각 규칙에는 수정의 우선순위를 정하는 데 도움을 주기 위한 영향도 등급(CRITICAL에서 LOW까지)과, 무엇이 문제이고 어떻게 고치는지 보여주는 코드 예제가 포함되어 있습니다.

예를 들어, 다음은 사용되지 않는 코드를 차단하는 일반적인 패턴입니다:

잘못된 예 (두 분기 모두 차단):

올바른 예 (필요할 때만 차단):

개별 규칙 파일들은 AGENTS.md라는 단일 문서로 컴파일되며, 이는 당신의 에이전트가 코드를 검토하거나 최적화를 제안할 때 쿼리할 수 있는 문서입니다. 이는 리팩토링을 수행하는 AI 에이전트를 포함하여 일관되게 따라 할 수 있도록 설계되었으므로, 팀은 대규모 코드베이스 전체에 걸쳐 동일한 결정을 적용할 수 있습니다.

이 모범 사례들이 수집된 방법 (How these practices were collected)

이것들은 이론적인 것이 아닙니다. 이것들은 프로덕션 코드베이스에서의 실제 성능 작업에서 나온 것입니다.

몇 가지 예시입니다:

  • 루프 반복 결합하기: 한 채팅 페이지가 동일한 메시지 목록을 여덟 번이나 따로 스캔하고 있었습니다. 우리는 이를 한 번의 패스로 결합했고, 이는 수천 개의 메시지가 있을 때 합산되어 효과가 큽니다.
  • Awaits 병렬화하기: 한 API가 다음 데이터베이스 호출을 시작하기 전에 이전 호출이 끝나기를 기다리고 있었는데, 서로 의존하지 않음에도 그랬습니다. 이것들을 동시에 실행함으로써 전체 대기 시간을 절반으로 줄였습니다.
  • 폰트 폴백(fallbacks) 조정하기: 커스텀 폰트가 로드되기 전에 시스템 폰트를 사용할 때 헤드라인이 비좁아 보였습니다. 자간(letter-spacing)을 조정하여 폴백이 깨져 보이는 대신 의도된 것처럼 보이게 만들었습니다.

당신의 코딩 에이전트에서 react-best-practices 사용하기 (Using react-best-practices in your coding agent)

이 모범 사례들은 또한 Opencode, Codex, Claude Code, Cursor 및 기타 코딩 에이전트에 설치되는 '에이전트 스킬(Agent Skills)'로도 패키징되어 있습니다. 당신의 에이전트가 연쇄적인 useEffect 호출이나 무거운 클라이언트 측 import를 발견하면, 이 패턴들을 참조하여 수정 사항을 제안할 수 있습니다.

react-best-practices 저장소를 확인해 보세요.

avatar
snyungSoftware Engineer(from. 2018)